@artifact-keeper/sdk 1.6.0 → 1.7.3

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
@@ -126,6 +126,10 @@ export type AffectedRepo = {
126
126
  export type AgeGateConfigResponse = {
127
127
  enabled: boolean;
128
128
  min_age_days: number;
129
+ /**
130
+ * Age-source mode: `upstream_publish_time` or `first_seen` (#2264).
131
+ */
132
+ mode: string;
129
133
  repository_key: string;
130
134
  };
131
135
 
@@ -303,7 +307,19 @@ export type ArtifactListResponse = {
303
307
  * Docker tag grouping. Only present when `group_by=docker_tag`.
304
308
  */
305
309
  docker_tags?: Array<DockerTagResponse> | null;
310
+ /**
311
+ * Whether another page exists after this one (#2520, #2518). Present on
312
+ * keyset-paged listings (flat and grouped); authoritative regardless of
313
+ * the `pagination.total` mode (exact vs lower bound).
314
+ */
315
+ has_more?: boolean | null;
306
316
  items: Array<ArtifactResponse>;
317
+ /**
318
+ * Opaque keyset cursor for the next page (#2520, #2518). Present on
319
+ * keyset-paged listings (flat and grouped) when another page exists;
320
+ * pass it back via `?cursor=`.
321
+ */
322
+ next_cursor?: string | null;
307
323
  pagination: Pagination;
308
324
  };
309
325
 
@@ -353,6 +369,31 @@ export type ArtifactResponse = {
353
369
  } | null;
354
370
  name: string;
355
371
  path: string;
372
+ /**
373
+ * Per-artifact quarantine state so a client/operator can tell which
374
+ * listed artifacts are held for security review (#2940). Always
375
+ * serialized so the listing never hides the control:
376
+ * - `"quarantined"` — held pending review; downloads return 409 (until
377
+ * any `quarantine_until` lapses),
378
+ * - `"rejected"` — terminally blocked by an admin,
379
+ * - a scan-lifecycle state (`"clean"`, `"flagged"`, `"unscanned"`,
380
+ * `"released"`),
381
+ * - `"not_quarantined"` — the explicit default when the row carries no
382
+ * quarantine state, so clients never have to treat a missing value as
383
+ * a state.
384
+ *
385
+ * The human-readable *reason* is intentionally NOT surfaced here: it is
386
+ * per-artifact security detail disclosed only by the authenticated,
387
+ * repository-visibility-checked `GET /api/v1/quarantine/{id}` (#2912),
388
+ * whereas this listing is reachable anonymously on public repositories.
389
+ */
390
+ quarantine_status: string;
391
+ /**
392
+ * When a timed quarantine hold lapses and the artifact becomes
393
+ * downloadable again. `None` for a permanent (admin) quarantine and for
394
+ * artifacts that are not quarantined. (#2940)
395
+ */
396
+ quarantine_until?: string | null;
356
397
  repository_key: string;
357
398
  /**
358
399
  * Server-assigned revision number for repositories with first-class
@@ -496,6 +537,18 @@ export type AuthConfig = {
496
537
  * Whether an LDAP directory is configured.
497
538
  */
498
539
  ldap_enabled: boolean;
540
+ /**
541
+ * Whether the login UI should offer the local username/password form
542
+ * (issue #2621). `true` when no SSO provider is enabled; with SSO
543
+ * enabled it is `true` only when the operator explicitly opted in via
544
+ * `ALLOW_LOCAL_ADMIN_LOGIN=true` and has not enforced strict SSO-only
545
+ * via `SSO_DISABLE_ADMIN_BREAK_GLASS`. Display-only: the login endpoint
546
+ * independently enforces the same policy server-side
547
+ * (`api::handlers::auth::local_login_gate`), so this flag never grants
548
+ * access by itself. LDAP is separate — the UI shows the credentials form
549
+ * for enabled LDAP providers regardless of this flag.
550
+ */
551
+ local_login_enabled: boolean;
499
552
  /**
500
553
  * Whether an OIDC provider is configured.
501
554
  */
@@ -1023,7 +1076,40 @@ export type CreateApiTokenResponse = {
1023
1076
  };
1024
1077
 
1025
1078
  export type CreateBackupRequest = {
1079
+ /**
1080
+ * Repository ids to exclude from a full or incremental backup (#2772).
1081
+ *
1082
+ * Airgapped or bandwidth-limited deployments use this to keep specific
1083
+ * repositories out of the backup. When omitted or empty nothing is
1084
+ * excluded, so existing behavior is unchanged. If `repository_ids` is
1085
+ * also supplied the excluded ids are removed from that include list;
1086
+ * otherwise every repository except the excluded ones is backed up.
1087
+ */
1088
+ exclude_repositories?: Array<string> | null;
1089
+ /**
1090
+ * Optional custom name/label for the backup archive (#2790).
1091
+ *
1092
+ * When provided it becomes the identifying part of the archive
1093
+ * filename. Restricted to letters, digits, `.`, `_`, and `-`; when
1094
+ * omitted the archive keeps its default `{uuid}` name.
1095
+ */
1096
+ name?: string | null;
1097
+ /**
1098
+ * Explicit allow-list of repository ids to include in the backup.
1099
+ *
1100
+ * When omitted every repository is backed up (subject to
1101
+ * `exclude_repositories`).
1102
+ */
1026
1103
  repository_ids?: Array<string> | null;
1104
+ /**
1105
+ * Optional RFC3339 lower bound on artifact modification time (#2789).
1106
+ *
1107
+ * When set, the (typically incremental) backup includes only artifacts
1108
+ * whose `updated_at` is at or after this timestamp, capturing just the
1109
+ * changes made from the given date/time to now. When omitted every
1110
+ * artifact is included, so backup behavior is unchanged.
1111
+ */
1112
+ since?: string | null;
1027
1113
  type?: string | null;
1028
1114
  };
1029
1115
 
@@ -1122,11 +1208,24 @@ export type CreateLdapConfigRequest = {
1122
1208
  admin_group_dn?: string | null;
1123
1209
  bind_dn?: string | null;
1124
1210
  bind_password?: string | null;
1211
+ /**
1212
+ * Inline PEM CA certificate/chain to trust for this provider's LDAPS/
1213
+ * STARTTLS handshake (migration 174, #2782). Send an empty string to
1214
+ * clear a previously stored certificate.
1215
+ */
1216
+ ca_certificate?: string | null;
1125
1217
  display_name_attribute?: string | null;
1126
1218
  email_attribute?: string | null;
1127
1219
  group_base_dn?: string | null;
1128
1220
  group_filter?: string | null;
1129
1221
  groups_attribute?: string | null;
1222
+ /**
1223
+ * Opt-in (migration 174, #2782): skip TLS certificate verification for
1224
+ * this provider's LDAPS/STARTTLS handshake. Defaults false
1225
+ * (secure-by-default). Only enable for trusted networks / private CAs
1226
+ * you cannot import.
1227
+ */
1228
+ insecure_skip_verify?: boolean | null;
1130
1229
  is_enabled?: boolean | null;
1131
1230
  name: string;
1132
1231
  priority?: number | null;
@@ -1285,6 +1384,14 @@ export type CreateRepositoryRequest = {
1285
1384
  * Stored in `repository_config` under `apt_release_version`.
1286
1385
  */
1287
1386
  apt_release_version?: string | null;
1387
+ /**
1388
+ * Opt into ingesting UNVERIFIED upstream metadata on the keyless RPM
1389
+ * curation-sync path (#2569). Omit or `false` to keep the fail-closed
1390
+ * default (a keyless curation sync refuses to ingest unverified upstream
1391
+ * packages); `true` reverts to the legacy unverified-ingest behavior. Only
1392
+ * meaningful for RPM curation staging repositories.
1393
+ */
1394
+ curation_allow_unverified?: boolean | null;
1288
1395
  /**
1289
1396
  * Custom User-Agent sent on outbound HTTP requests to the upstream for
1290
1397
  * this repository. Only valid for remote repositories. Max 256 characters.
@@ -1626,28 +1733,42 @@ export type CreateWebhookRequest = {
1626
1733
  export type CreatedGroupRow = {
1627
1734
  created_at: string;
1628
1735
  description?: string | null;
1736
+ external_source?: string | null;
1629
1737
  id: string;
1630
1738
  name: string;
1631
1739
  updated_at: string;
1632
1740
  };
1633
1741
 
1634
- export type CreatedPermissionRow = {
1635
- actions: Array<string>;
1636
- created_at: string;
1637
- id: string;
1638
- principal_id: string;
1639
- principal_type: string;
1640
- target_id: string;
1641
- target_type: string;
1642
- updated_at: string;
1643
- };
1644
-
1645
1742
  export type CurationCreateRuleRequest = {
1646
1743
  action: string;
1647
1744
  architecture?: string;
1648
- package_pattern: string;
1745
+ /**
1746
+ * Engine-specific parameters (JSON object). `{}` for `pattern` rules.
1747
+ */
1748
+ config?: {
1749
+ [key: string]: unknown;
1750
+ };
1751
+ /**
1752
+ * Only meaningful for `rule_type = "pattern"`; defaults to `*` so typed
1753
+ * rules (`publisher_trust`, `popularity`) can omit it.
1754
+ */
1755
+ package_pattern?: string;
1649
1756
  priority?: number;
1650
1757
  reason: string;
1758
+ /**
1759
+ * Evaluation engine: `pattern` (default), `publisher_trust`, `popularity`.
1760
+ */
1761
+ rule_type?: string;
1762
+ /**
1763
+ * `repository` (default when `staging_repo_id` is set) or `global`.
1764
+ * When present it must be consistent with `staging_repo_id`: `global`
1765
+ * forbids a repo id, `repository` requires one.
1766
+ */
1767
+ scope?: string | null;
1768
+ /**
1769
+ * Omit (with `scope: "global"` or no `scope`) to create an instance-wide
1770
+ * baseline rule; set to attach the rule to one staging repository.
1771
+ */
1651
1772
  staging_repo_id?: string | null;
1652
1773
  version_constraint?: string;
1653
1774
  };
@@ -1677,10 +1798,20 @@ export type CurationPackageResponse = {
1677
1798
  export type CurationUpdateRuleRequest = {
1678
1799
  action: string;
1679
1800
  architecture?: string;
1801
+ /**
1802
+ * Engine-specific parameters (JSON object). `{}` for `pattern` rules.
1803
+ */
1804
+ config?: {
1805
+ [key: string]: unknown;
1806
+ };
1680
1807
  enabled?: boolean;
1681
1808
  package_pattern: string;
1682
1809
  priority?: number;
1683
1810
  reason: string;
1811
+ /**
1812
+ * Evaluation engine: `pattern` (default), `publisher_trust`, `popularity`.
1813
+ */
1814
+ rule_type?: string;
1684
1815
  version_constraint?: string;
1685
1816
  };
1686
1817
 
@@ -1807,6 +1938,7 @@ export type DbPoolStats = {
1807
1938
  * the default when none exists yet.
1808
1939
  */
1809
1940
  export type DebianConfigPatch = {
1941
+ allow_encoded_separators?: boolean | null;
1810
1942
  architectures?: Array<string> | null;
1811
1943
  components?: Array<string> | null;
1812
1944
  distribution_paths?: Array<string> | null;
@@ -1846,6 +1978,15 @@ export type DebianPackageFetchStrategy = 'upstream_passthrough' | 'eager';
1846
1978
  * permitted regardless of the `architectures` allowlist.
1847
1979
  */
1848
1980
  export type DebianRepositoryConfig = {
1981
+ /**
1982
+ * Defense-in-depth (#2562): when `false` (the default) a proxy request
1983
+ * whose path carries a percent-encoded path separator (`%2f` = `/`,
1984
+ * `%5c` = `\`, at any decode layer) is rejected with 400 before any
1985
+ * upstream fetch. APT never percent-encodes path separators, so this only
1986
+ * ever blocks path-confusion/traversal probes; set it `true` to opt out
1987
+ * for a nonstandard upstream that genuinely requires encoded separators.
1988
+ */
1989
+ allow_encoded_separators?: boolean;
1849
1990
  /**
1850
1991
  * Architectures (e.g. `amd64`, `arm64`) to proxy. Empty/`["*"]` = all.
1851
1992
  * `all` (arch-independent) is always permitted.
@@ -2029,6 +2170,13 @@ export type DownloadRecord = {
2029
2170
  export type DownloadTrend = {
2030
2171
  date: string;
2031
2172
  download_count: number;
2173
+ /**
2174
+ * Proxy-served (pull-through) downloads for the day, from the sibling
2175
+ * `proxy_download_statistics` table (#2537/#2704). Additive: hosted
2176
+ * serves stay in `download_count` unchanged; defaults to 0 when
2177
+ * deserializing older payloads.
2178
+ */
2179
+ proxy_download_count?: number;
2032
2180
  };
2033
2181
 
2034
2182
  /**
@@ -2476,6 +2624,10 @@ export type GroupMemberResponse = {
2476
2624
  export type GroupResponse = {
2477
2625
  created_at: string;
2478
2626
  description?: string | null;
2627
+ /**
2628
+ * See [`GroupRow::external_source`]; lets the frontend disable member editing for SSO groups.
2629
+ */
2630
+ external_source?: string | null;
2479
2631
  id: string;
2480
2632
  member_count: number;
2481
2633
  name: string;
@@ -2485,6 +2637,10 @@ export type GroupResponse = {
2485
2637
  export type GroupRow = {
2486
2638
  created_at: string;
2487
2639
  description?: string | null;
2640
+ /**
2641
+ * SSO provider owning the group (`oidc`/`saml`/`ldap`); `None` for local groups. IdP owns membership (#2874).
2642
+ */
2643
+ external_source?: string | null;
2488
2644
  id: string;
2489
2645
  member_count: number;
2490
2646
  name: string;
@@ -2493,6 +2649,18 @@ export type GroupRow = {
2493
2649
 
2494
2650
  /**
2495
2651
  * Growth summary for a time range.
2652
+ *
2653
+ * Computed from `storage_metrics` daily snapshots. **Accounting-basis note
2654
+ * (#3249):** snapshots taken before the #3134/#3249 fix summed
2655
+ * `artifacts.size_bytes` only, missing OCI layer/config blob bytes
2656
+ * (`oci_blobs`) and proxy-cached bytes (`proxy_cache_artifacts`) while
2657
+ * counting legacy backfilled `proxy-cache/%` rows. Those historical rows are
2658
+ * deliberately left as recorded — the source tables hold no history, so past
2659
+ * values cannot be recomputed, only fabricated. A growth series that spans
2660
+ * the fix date therefore shows a one-day upward step in
2661
+ * `storage_bytes_start/end` / `storage_growth_bytes` /
2662
+ * `storage_growth_percent` when the corrected accounting first lands; it is
2663
+ * a measurement correction, not real growth.
2496
2664
  */
2497
2665
  export type GrowthSummary = {
2498
2666
  artifacts_added: number;
@@ -2643,7 +2811,20 @@ export type LdapConfigResponse = {
2643
2811
  group_filter?: string | null;
2644
2812
  groups_attribute: string;
2645
2813
  has_bind_password: boolean;
2814
+ /**
2815
+ * Whether a custom inline CA certificate is configured for this provider
2816
+ * (migration 174, #2782). The PEM itself is not returned.
2817
+ */
2818
+ has_ca_certificate: boolean;
2646
2819
  id: string;
2820
+ /**
2821
+ * Opt-in flag (migration 174, #2782): when true, TLS certificate
2822
+ * verification is skipped for this provider's LDAPS/STARTTLS handshake.
2823
+ * Defaults false (secure-by-default). Matches Harbor's "insecure skip
2824
+ * verify"; only enable for trusted networks / private CAs you cannot
2825
+ * import.
2826
+ */
2827
+ insecure_skip_verify: boolean;
2647
2828
  is_enabled: boolean;
2648
2829
  name: string;
2649
2830
  priority: number;
@@ -2711,6 +2892,23 @@ export type LifecyclePolicy = {
2711
2892
  };
2712
2893
 
2713
2894
  export type ListArtifactsQuery = {
2895
+ /**
2896
+ * Total-count mode for keyset-paged listings (#2520, #2519).
2897
+ * `count=exact` runs a dedicated COUNT query so `pagination.total` is
2898
+ * exact; otherwise the keyset-paged listings report a cheap lower bound
2899
+ * (rows seen so far, +1 when another page exists) and `has_more` is the
2900
+ * authoritative "is there a next page" signal.
2901
+ */
2902
+ count?: string | null;
2903
+ /**
2904
+ * Opaque keyset cursor (#2520, #2519, #2518). Pass the `next_cursor`
2905
+ * value from the previous response to fetch the next page; `page` is
2906
+ * ignored while a cursor is present. Supported by the flat artifact
2907
+ * listing of hosted/local, virtual, and remote repositories (#2518,
2908
+ * #2519), by `group_by=docker_tag`, and by `group_by=maven_component`
2909
+ * on remote repositories; other listing modes ignore it.
2910
+ */
2911
+ cursor?: string | null;
2714
2912
  /**
2715
2913
  * Server-side artifact grouping.
2716
2914
  *
@@ -3715,9 +3913,23 @@ export type QuarantineActionResponse = {
3715
3913
  new_status: string;
3716
3914
  };
3717
3915
 
3916
+ export type QuarantineNowRequest = {
3917
+ /**
3918
+ * Reason shown to developers whose downloads are blocked.
3919
+ */
3920
+ reason?: string | null;
3921
+ };
3922
+
3718
3923
  export type QuarantineStatusResponse = {
3719
3924
  artifact_id: string;
3720
3925
  is_blocked: boolean;
3926
+ /**
3927
+ * Why the artifact is held, when one was recorded by a scan policy or an
3928
+ * admin. This is the only surface that discloses the reason: blocked
3929
+ * downloads return a generic message because they are reachable
3930
+ * anonymously on public repositories (#2912).
3931
+ */
3932
+ quarantine_reason?: string | null;
3721
3933
  quarantine_status?: string | null;
3722
3934
  quarantine_until?: string | null;
3723
3935
  };
@@ -3920,6 +4132,19 @@ export type RepositoryResponse = {
3920
4132
  */
3921
4133
  apt_release_version?: string | null;
3922
4134
  created_at: string;
4135
+ /**
4136
+ * Stance applied when no curation rule matches: `allow` or `review`.
4137
+ */
4138
+ curation_default_action: string;
4139
+ /**
4140
+ * Whether curation rules are enforced for this repository (#2912).
4141
+ *
4142
+ * Echoed back because this flag now *blocks downloads* on the PyPI proxy
4143
+ * paths, and a security control that cannot be read back is the same class of
4144
+ * problem as one that is stored but not enforced. Stored on the repositories
4145
+ * row, so unlike `quarantine_enabled` this needs no separate lookup.
4146
+ */
4147
+ curation_enabled: boolean;
3923
4148
  /**
3924
4149
  * Custom User-Agent used for outbound HTTP requests to the upstream,
3925
4150
  * read back from `repository_config`. `None` when unset.
@@ -4024,6 +4249,15 @@ export type RepositoryStorageBreakdown = {
4024
4249
  download_count: number;
4025
4250
  format: string;
4026
4251
  last_upload_at?: string | null;
4252
+ /**
4253
+ * Downloads served by this repository's remote pull-through proxy
4254
+ * (`proxy_download_statistics`, #2537/#2704). Proxy-cached objects carry
4255
+ * no `artifacts` row (#1280), so these serves are counted in a sibling
4256
+ * table and were previously not readable through any API. Kept separate
4257
+ * from `download_count` (hosted serves) so existing consumers are
4258
+ * unaffected; defaults to 0 when deserializing older payloads.
4259
+ */
4260
+ proxy_download_count?: number;
4027
4261
  repository_id: string;
4028
4262
  repository_key: string;
4029
4263
  repository_name: string;
@@ -4107,6 +4341,52 @@ export type RepositoryStorageStatsResponse = {
4107
4341
  unique_bytes?: number | null;
4108
4342
  };
4109
4343
 
4344
+ /**
4345
+ * Per-prefix (folder tree) storage rollup response (#2601).
4346
+ *
4347
+ * All figures are read from the materialized `repository_path_storage_stats`
4348
+ * cache (refreshed on the storage-stats schedule + post-GC) — a tree call is
4349
+ * an index scan over pre-aggregated rows, never a walk of the artifact table.
4350
+ *
4351
+ * Every figure is within-repository only (references this repo holds), so
4352
+ * unlike the repo-level endpoint's cross-tenant-derivable dedup breakdown
4353
+ * (#2560) nothing here needs an admin restriction beyond repo visibility.
4354
+ */
4355
+ export type RepositoryStorageTreeResponse = {
4356
+ /**
4357
+ * Descendant folder nodes, up to `depth` levels below `node`, largest
4358
+ * `logical_bytes` first.
4359
+ */
4360
+ children: Array<StorageTreeNode>;
4361
+ /**
4362
+ * When the rollup was last recomputed. `null` before the first refresh.
4363
+ */
4364
+ computed_at?: string | null;
4365
+ /**
4366
+ * Folder levels below the root that are individually materialized;
4367
+ * deeper files roll up into their ancestor at this depth.
4368
+ */
4369
+ max_materialized_depth: number;
4370
+ /**
4371
+ * The node the listing is rooted at (zeros when the prefix has no
4372
+ * materialized data — unknown folder or refresher not yet run).
4373
+ */
4374
+ node: StorageTreeNode;
4375
+ repository_key: string;
4376
+ /**
4377
+ * True when `limit` cut the descendant listing.
4378
+ */
4379
+ truncated: boolean;
4380
+ /**
4381
+ * Bytes referenced by this repository that carry no logical path and so
4382
+ * cannot be placed in the tree (today: OCI layer blobs; the blob→image
4383
+ * edge lives only in manifest content). Root-level figure; present only
4384
+ * when the request is rooted at `''`. `node.logical_bytes +
4385
+ * unattributed_bytes` reconciles with the repo-level logical total.
4386
+ */
4387
+ unattributed_bytes?: number | null;
4388
+ };
4389
+
4110
4390
  export type RescanForInventoryRequest = {
4111
4391
  /**
4112
4392
  * Maximum number of artifacts to enqueue in this call. Operators
@@ -4187,6 +4467,12 @@ export type RoleResponse = {
4187
4467
 
4188
4468
  /**
4189
4469
  * Response returned by the rotate-secret endpoint.
4470
+ *
4471
+ * GHSA-qcmj: the raw signing secret is intentionally NOT returned here. A
4472
+ * rotation only reports success and non-reversible metadata (the display
4473
+ * `secret_digest` and the previous-secret expiry); the new raw secret is
4474
+ * retained only in encrypted form and delivered/consumed out-of-band, so it
4475
+ * cannot be disclosed via this response body or logs.
4190
4476
  */
4191
4477
  export type RotateWebhookSecretResponse = {
4192
4478
  id: string;
@@ -4195,9 +4481,8 @@ export type RotateWebhookSecretResponse = {
4195
4481
  */
4196
4482
  previous_secret_expires_at: string;
4197
4483
  /**
4198
- * Raw signing secret produced by this rotation. Shown exactly once.
4484
+ * Short, non-reversible identifier for the newly active signing secret.
4199
4485
  */
4200
- secret: string;
4201
4486
  secret_digest: string;
4202
4487
  };
4203
4488
 
@@ -4232,6 +4517,9 @@ export type RuleEvaluationResponse = {
4232
4517
  export type RuleResponse = {
4233
4518
  action: string;
4234
4519
  architecture: string;
4520
+ config: {
4521
+ [key: string]: unknown;
4522
+ };
4235
4523
  created_at: string;
4236
4524
  created_by?: string | null;
4237
4525
  enabled: boolean;
@@ -4239,6 +4527,8 @@ export type RuleResponse = {
4239
4527
  package_pattern: string;
4240
4528
  priority: number;
4241
4529
  reason: string;
4530
+ rule_type: string;
4531
+ scope: string;
4242
4532
  staging_repo_id?: string | null;
4243
4533
  updated_at: string;
4244
4534
  version_constraint: string;
@@ -4314,13 +4604,26 @@ export type SbomResponse = {
4314
4604
  };
4315
4605
 
4316
4606
  export type ScanConfigResponse = {
4607
+ /**
4608
+ * Persisted and returned, but not currently consulted by any enforcement
4609
+ * gate — blocking is configured via scan policies instead (#3144/#3246).
4610
+ */
4317
4611
  block_on_policy_violation: boolean;
4318
4612
  created_at: string;
4319
4613
  id: string;
4614
+ /**
4615
+ * #2954: fail-open (default) / fail-closed action for the inline proxy
4616
+ * scan-on-fetch.
4617
+ */
4618
+ proxy_scan_action: string;
4320
4619
  repository_id: string;
4321
4620
  scan_enabled: boolean;
4322
4621
  scan_on_proxy: boolean;
4323
4622
  scan_on_upload: boolean;
4623
+ /**
4624
+ * Persisted and returned, but not currently consulted by any enforcement
4625
+ * gate (#3243).
4626
+ */
4324
4627
  severity_threshold: string;
4325
4628
  updated_at: string;
4326
4629
  };
@@ -4553,6 +4856,13 @@ export type SetRoutingRulesRequest = {
4553
4856
  * Response body for the setup status endpoint.
4554
4857
  */
4555
4858
  export type SetupStatusResponse = {
4859
+ /**
4860
+ * Optional deployment-aware instruction for retrieving the generated
4861
+ * initial admin password, sourced from the `SETUP_PASSWORD_HINT` env var.
4862
+ * Present only when an operator has configured it; when absent, the web UI
4863
+ * falls back to its built-in Docker Compose instruction (#2802).
4864
+ */
4865
+ setup_password_hint?: string | null;
4556
4866
  /**
4557
4867
  * Whether the initial admin password change is still required.
4558
4868
  */
@@ -4718,13 +5028,87 @@ export type StorageGcResult = {
4718
5028
  */
4719
5029
  export type StorageSnapshot = {
4720
5030
  snapshot_date: string;
5031
+ /**
5032
+ * Rows in `artifacts` (for OCI repositories that is manifests only —
5033
+ * layer/config blobs are content-addressed objects, not artifacts), the
5034
+ * same deliberate decision as the dashboard's
5035
+ * `SystemStats::total_artifacts` (#3134). Unlike the byte total, this
5036
+ * count still includes legacy backfilled `proxy-cache/%` rows.
5037
+ */
4721
5038
  total_artifacts: number;
4722
5039
  total_downloads: number;
4723
5040
  total_repositories: number;
5041
+ /**
5042
+ * All stored bytes at snapshot time, summed from
5043
+ * `repository_usage_ledger` (`hosted_bytes + proxy_bytes + oci_bytes`) —
5044
+ * the same source as the dashboard `total_storage_bytes` and quota
5045
+ * admission (#3134/#3249), so the analytics series is consistent with
5046
+ * both by construction. Includes OCI layer/config blob bytes
5047
+ * (`oci_blobs`) and proxy-cached bytes (`proxy_cache_artifacts`);
5048
+ * excludes legacy backfilled `proxy-cache/%` `artifacts` rows (their
5049
+ * bytes are represented by the proxy-cache catalog instead). This is the
5050
+ * LOGICAL figure: a blob cross-repo-mounted into N repositories counts
5051
+ * once per repository, matching the per-repo storage column and quota.
5052
+ */
4724
5053
  total_storage_bytes: number;
4725
5054
  total_users: number;
4726
5055
  };
4727
5056
 
5057
+ /**
5058
+ * One folder node in the per-prefix storage rollup (#2601).
5059
+ */
5060
+ export type StorageTreeNode = {
5061
+ /**
5062
+ * Distinct physical objects under this prefix.
5063
+ */
5064
+ blob_count: number;
5065
+ /**
5066
+ * Number of path segments in `prefix` (0 = root).
5067
+ */
5068
+ depth: number;
5069
+ /**
5070
+ * References (artifact/proxy-cache rows) under this prefix.
5071
+ */
5072
+ file_count: number;
5073
+ /**
5074
+ * Sum over every artifact/proxy-cache reference under this prefix.
5075
+ */
5076
+ logical_bytes: number;
5077
+ /**
5078
+ * Deduplicated within this repository: each distinct physical object
5079
+ * under the prefix counted once. Because an object shared by two sibling
5080
+ * subtrees counts once in each but once at their common ancestor, the sum
5081
+ * of children's `physical_bytes` can exceed the parent's — the difference
5082
+ * is the cross-subtree dedup saving.
5083
+ */
5084
+ physical_bytes: number;
5085
+ /**
5086
+ * Canonical prefix (no leading/trailing `/`; `''` = repository root).
5087
+ */
5088
+ prefix: string;
5089
+ };
5090
+
5091
+ /**
5092
+ * Query parameters for the per-prefix storage tree (#2601).
5093
+ */
5094
+ export type StorageTreeQuery = {
5095
+ /**
5096
+ * How many tree levels below `prefix` to return (default 1 = immediate
5097
+ * children, clamped to 1..=5).
5098
+ */
5099
+ depth?: number | null;
5100
+ /**
5101
+ * Maximum number of descendant nodes returned (default 200, clamped to
5102
+ * 1..=1000). `truncated` is set when the limit cut the listing.
5103
+ */
5104
+ limit?: number | null;
5105
+ /**
5106
+ * Folder prefix to root the listing at (`''`/absent = repository root).
5107
+ * Leading/trailing slashes are ignored.
5108
+ */
5109
+ prefix?: string | null;
5110
+ };
5111
+
4728
5112
  export type SubmitCrashesRequest = {
4729
5113
  ids: Array<string>;
4730
5114
  };
@@ -4916,9 +5300,31 @@ export type SystemSettings = {
4916
5300
  export type SystemStats = {
4917
5301
  active_peers: number;
4918
5302
  pending_sync_tasks: number;
5303
+ /**
5304
+ * Proxy-cached (pull-through) objects, tracked in `proxy_cache_artifacts`
5305
+ * rather than `artifacts`. Since #3134 the byte figure is a breakdown of
5306
+ * `total_storage_bytes` (do not add the two).
5307
+ */
5308
+ proxy_artifact_count: number;
5309
+ proxy_storage_bytes: number;
5310
+ /**
5311
+ * Rows in `artifacts` (for OCI repositories that is manifests only —
5312
+ * layer/config blobs are content-addressed objects, not artifacts).
5313
+ * Unlike the byte total, this count still includes legacy backfilled
5314
+ * `proxy-cache/%` rows.
5315
+ */
4919
5316
  total_artifacts: number;
4920
5317
  total_downloads: number;
4921
5318
  total_repositories: number;
5319
+ /**
5320
+ * All stored bytes, summed from `repository_usage_ledger`
5321
+ * (`hosted_bytes + proxy_bytes + oci_bytes`) — the same source the
5322
+ * per-repository `storage_used_bytes` figures are read from, so the
5323
+ * dashboard total is consistent with the per-repo column by
5324
+ * construction (#3134). Includes OCI layer/config blob bytes
5325
+ * (`oci_blobs`) and proxy-cached bytes; `proxy_storage_bytes` below is
5326
+ * a *breakdown* of this total, not a disjoint bucket.
5327
+ */
4922
5328
  total_storage_bytes: number;
4923
5329
  total_users: number;
4924
5330
  };
@@ -5140,6 +5546,11 @@ export type UninstallQuery = {
5140
5546
  export type UpdateAgeGateConfigRequest = {
5141
5547
  enabled: boolean;
5142
5548
  min_age_days: number;
5549
+ /**
5550
+ * Age-source mode. Omitted = keep the repository's current mode, so
5551
+ * pre-mode clients that PUT `{enabled, min_age_days}` stay valid.
5552
+ */
5553
+ mode?: string | null;
5143
5554
  };
5144
5555
 
5145
5556
  export type UpdateAnalysisBody = {
@@ -5204,11 +5615,21 @@ export type UpdateLdapConfigRequest = {
5204
5615
  admin_group_dn?: string | null;
5205
5616
  bind_dn?: string | null;
5206
5617
  bind_password?: string | null;
5618
+ /**
5619
+ * Inline PEM CA certificate/chain (migration 174, #2782). Omit to leave
5620
+ * unchanged; send an empty string to clear.
5621
+ */
5622
+ ca_certificate?: string | null;
5207
5623
  display_name_attribute?: string | null;
5208
5624
  email_attribute?: string | null;
5209
5625
  group_base_dn?: string | null;
5210
5626
  group_filter?: string | null;
5211
5627
  groups_attribute?: string | null;
5628
+ /**
5629
+ * See `CreateLdapConfigRequest::insecure_skip_verify` (migration 174,
5630
+ * #2782). Omit to leave the stored value unchanged.
5631
+ */
5632
+ insecure_skip_verify?: boolean | null;
5212
5633
  is_enabled?: boolean | null;
5213
5634
  name?: string | null;
5214
5635
  priority?: number | null;
@@ -5336,6 +5757,26 @@ export type UpdateRepositoryRequest = {
5336
5757
  * Stored in `repository_config` under `apt_release_version`.
5337
5758
  */
5338
5759
  apt_release_version?: string | null;
5760
+ /**
5761
+ * Update the keyless-sync unverified-ingest opt-in (#2569). When provided,
5762
+ * sets `curation_allow_unverified` (`false` restores the fail-closed
5763
+ * default; `true` opts into legacy unverified ingest). Omit to leave it
5764
+ * unchanged.
5765
+ */
5766
+ curation_allow_unverified?: boolean | null;
5767
+ /**
5768
+ * Default curation action when no rule matches: allow or review.
5769
+ * "block" is rejected (DB CHECK, migration 071); use block rules for
5770
+ * specific packages instead.
5771
+ *
5772
+ * The allowed set is spelled out in the schema so a generated SDK presents it
5773
+ * rather than an unconstrained string.
5774
+ */
5775
+ curation_default_action: string;
5776
+ /**
5777
+ * Enable curation-rule enforcement on this repository's proxy paths.
5778
+ */
5779
+ curation_enabled?: boolean | null;
5339
5780
  /**
5340
5781
  * Update the custom User-Agent for outbound HTTP requests to the upstream.
5341
5782
  * Only valid for remote repositories. Pass an empty string to remove.
@@ -5490,7 +5931,22 @@ export type UpdateUserRequest = {
5490
5931
  is_admin?: boolean | null;
5491
5932
  };
5492
5933
 
5934
+ /**
5935
+ * Full-set replace of a virtual repository's members (PR #2795, issue #2785;
5936
+ * ratified in issue #2899).
5937
+ *
5938
+ * This body is the COMPLETE desired member list, not a partial patch. Any
5939
+ * current member whose key is absent from `members` is removed; keys present
5940
+ * are inserted or have their priority updated. An empty `members` array
5941
+ * removes every member.
5942
+ *
5943
+ * WARNING: sending a partial list to reorder priorities deletes the omitted
5944
+ * members. Clients must always send the full member list.
5945
+ */
5493
5946
  export type UpdateVirtualMembersRequest = {
5947
+ /**
5948
+ * The complete desired member set. Members not listed here are removed.
5949
+ */
5494
5950
  members: Array<VirtualMemberPriority>;
5495
5951
  };
5496
5952
 
@@ -5521,10 +5977,22 @@ export type UpsertLicensePolicyRequest = {
5521
5977
  * and an omitted field is never clobbered. See #1374 / B11.
5522
5978
  */
5523
5979
  export type UpsertScanConfigRequest = {
5980
+ /**
5981
+ * Accepted and persisted, but consulted by no gate — enforcement is the
5982
+ * `scan_policies` table's job (#3144; disposition tracked in #3246).
5983
+ */
5524
5984
  block_on_policy_violation?: boolean | null;
5985
+ /**
5986
+ * #2954: `'fail_open'` (default) | `'fail_closed'` for the inline proxy
5987
+ * scan-on-fetch action.
5988
+ */
5989
+ proxy_scan_action?: string | null;
5525
5990
  scan_enabled?: boolean | null;
5526
5991
  scan_on_proxy?: boolean | null;
5527
5992
  scan_on_upload?: boolean | null;
5993
+ /**
5994
+ * Accepted and persisted, but consulted by no production gate (#3243).
5995
+ */
5528
5996
  severity_threshold?: string | null;
5529
5997
  };
5530
5998
 
@@ -5557,8 +6025,33 @@ export type UserResponse = {
5557
6025
  username: string;
5558
6026
  };
5559
6027
 
6028
+ export type VersionResponse = {
6029
+ /**
6030
+ * The number of approved packages frozen into the snapshot.
6031
+ */
6032
+ package_count: number;
6033
+ /**
6034
+ * Whether this version's signed repodata has been published yet.
6035
+ */
6036
+ published: boolean;
6037
+ /**
6038
+ * The repository key the version belongs to.
6039
+ */
6040
+ repository: string;
6041
+ /**
6042
+ * The monotonic snapshot number (published/served under `/rpm/{key}/@N/`).
6043
+ */
6044
+ version_number: number;
6045
+ };
6046
+
5560
6047
  export type VirtualMemberPriority = {
6048
+ /**
6049
+ * Key of the member repository. Inserted if it is not already a member.
6050
+ */
5561
6051
  member_key: string;
6052
+ /**
6053
+ * Resolution priority. Lower values are searched first.
6054
+ */
5562
6055
  priority: number;
5563
6056
  };
5564
6057
 
@@ -5607,7 +6100,7 @@ export type WasmPluginResponse = {
5607
6100
  /**
5608
6101
  * Webhook event types
5609
6102
  */
5610
- export type WebhookEvent = 'artifact_uploaded' | 'artifact_deleted' | 'repository_created' | 'repository_deleted' | 'user_created' | 'user_deleted' | 'build_started' | 'build_completed' | 'build_failed' | 'age_gate_queued' | 'age_gate_approved' | 'age_gate_rejected';
6103
+ export type WebhookEvent = 'artifact_uploaded' | 'artifact_deleted' | 'repository_created' | 'repository_deleted' | 'user_created' | 'user_deleted' | 'build_started' | 'build_completed' | 'build_failed' | 'age_gate_queued' | 'age_gate_approved' | 'age_gate_rejected' | 'age_gate_reopened';
5611
6104
 
5612
6105
  export type WebhookListResponse = {
5613
6106
  items: Array<WebhookResponse>;
@@ -5729,6 +6222,21 @@ export type RejectReviewResponses = {
5729
6222
 
5730
6223
  export type RejectReviewResponse = RejectReviewResponses[keyof RejectReviewResponses];
5731
6224
 
6225
+ export type ReopenReviewData = {
6226
+ body: ReviewActionRequest;
6227
+ path: {
6228
+ id: string;
6229
+ };
6230
+ query?: never;
6231
+ url: '/api/v1/admin/age-gate/reviews/{id}/reopen';
6232
+ };
6233
+
6234
+ export type ReopenReviewResponses = {
6235
+ 200: AgeGateReviewResponse;
6236
+ };
6237
+
6238
+ export type ReopenReviewResponse = ReopenReviewResponses[keyof ReopenReviewResponses];
6239
+
5732
6240
  export type GetStaleArtifactsData = {
5733
6241
  body?: never;
5734
6242
  path?: never;
@@ -6087,14 +6595,18 @@ export type ExecuteBackupErrors = {
6087
6595
  */
6088
6596
  404: unknown;
6089
6597
  /**
6090
- * Internal server error
6598
+ * Another backup is already in progress
6599
+ */
6600
+ 409: unknown;
6601
+ /**
6602
+ * The run could not be started or its outcome could not be recorded
6091
6603
  */
6092
6604
  500: unknown;
6093
6605
  };
6094
6606
 
6095
6607
  export type ExecuteBackupResponses = {
6096
6608
  /**
6097
- * Backup executed
6609
+ * Backup run finished; `status` is `completed` or `failed` and `error_message` carries the cause of a failure
6098
6610
  */
6099
6611
  200: BackupResponse;
6100
6612
  };
@@ -9458,6 +9970,80 @@ export type TriggerCurationSyncResponses = {
9458
9970
 
9459
9971
  export type TriggerCurationSyncResponse = TriggerCurationSyncResponses[keyof TriggerCurationSyncResponses];
9460
9972
 
9973
+ export type CreateCurationVersionData = {
9974
+ body?: never;
9975
+ path: {
9976
+ /**
9977
+ * Staging repository key
9978
+ */
9979
+ repo_key: string;
9980
+ };
9981
+ query?: never;
9982
+ url: '/api/v1/curation/repos/{repo_key}/versions';
9983
+ };
9984
+
9985
+ export type CreateCurationVersionErrors = {
9986
+ /**
9987
+ * No approved packages / packages need re-sync
9988
+ */
9989
+ 400: unknown;
9990
+ /**
9991
+ * Not authorized for this repo
9992
+ */
9993
+ 403: unknown;
9994
+ /**
9995
+ * Repository not found
9996
+ */
9997
+ 404: unknown;
9998
+ };
9999
+
10000
+ export type CreateCurationVersionResponses = {
10001
+ 201: VersionResponse;
10002
+ };
10003
+
10004
+ export type CreateCurationVersionResponse = CreateCurationVersionResponses[keyof CreateCurationVersionResponses];
10005
+
10006
+ export type PublishCurationVersionData = {
10007
+ body?: never;
10008
+ path: {
10009
+ /**
10010
+ * Staging repository key
10011
+ */
10012
+ repo_key: string;
10013
+ /**
10014
+ * Version number to publish
10015
+ */
10016
+ n: number;
10017
+ };
10018
+ query?: never;
10019
+ url: '/api/v1/curation/repos/{repo_key}/versions/{n}/publish';
10020
+ };
10021
+
10022
+ export type PublishCurationVersionErrors = {
10023
+ /**
10024
+ * Empty version / missing snippet / no signing key
10025
+ */
10026
+ 400: unknown;
10027
+ /**
10028
+ * Not authorized for this repo
10029
+ */
10030
+ 403: unknown;
10031
+ /**
10032
+ * Repository or version not found
10033
+ */
10034
+ 404: unknown;
10035
+ /**
10036
+ * Version already published (immutable)
10037
+ */
10038
+ 409: unknown;
10039
+ };
10040
+
10041
+ export type PublishCurationVersionResponses = {
10042
+ 200: VersionResponse;
10043
+ };
10044
+
10045
+ export type PublishCurationVersionResponse = PublishCurationVersionResponses[keyof PublishCurationVersionResponses];
10046
+
9461
10047
  export type ListCurationRulesData = {
9462
10048
  body?: never;
9463
10049
  path?: never;
@@ -9466,6 +10052,10 @@ export type ListCurationRulesData = {
9466
10052
  * Filter by staging repo
9467
10053
  */
9468
10054
  staging_repo_id?: string;
10055
+ /**
10056
+ * Filter by rule scope: `global` lists only the instance-wide baseline rules (admin-only)
10057
+ */
10058
+ scope?: string;
9469
10059
  };
9470
10060
  url: '/api/v1/curation/rules';
9471
10061
  };
@@ -13577,6 +14167,53 @@ export type GetQuarantineStatusResponses = {
13577
14167
 
13578
14168
  export type GetQuarantineStatusResponse = GetQuarantineStatusResponses[keyof GetQuarantineStatusResponses];
13579
14169
 
14170
+ export type QuarantineArtifactNowData = {
14171
+ /**
14172
+ * Optional; empty body uses the default reason
14173
+ */
14174
+ body: QuarantineNowRequest;
14175
+ path: {
14176
+ /**
14177
+ * Artifact ID
14178
+ */
14179
+ artifact_id: string;
14180
+ };
14181
+ query?: never;
14182
+ url: '/api/v1/quarantine/{artifact_id}/quarantine';
14183
+ };
14184
+
14185
+ export type QuarantineArtifactNowErrors = {
14186
+ /**
14187
+ * Malformed request body
14188
+ */
14189
+ 400: unknown;
14190
+ /**
14191
+ * Authentication required
14192
+ */
14193
+ 401: unknown;
14194
+ /**
14195
+ * Admin access required
14196
+ */
14197
+ 403: unknown;
14198
+ /**
14199
+ * Artifact not found
14200
+ */
14201
+ 404: unknown;
14202
+ /**
14203
+ * Artifact was rejected during security review
14204
+ */
14205
+ 409: unknown;
14206
+ };
14207
+
14208
+ export type QuarantineArtifactNowResponses = {
14209
+ /**
14210
+ * Artifact quarantined
14211
+ */
14212
+ 200: QuarantineActionResponse;
14213
+ };
14214
+
14215
+ export type QuarantineArtifactNowResponse = QuarantineArtifactNowResponses[keyof QuarantineArtifactNowResponses];
14216
+
13580
14217
  export type RejectQuarantinedArtifactData = {
13581
14218
  body: RejectRequest;
13582
14219
  path: {
@@ -13872,6 +14509,23 @@ export type ListArtifactsData = {
13872
14509
  * `docker_tags` array.
13873
14510
  */
13874
14511
  group_by?: string | null;
14512
+ /**
14513
+ * Opaque keyset cursor (#2520, #2519, #2518). Pass the `next_cursor`
14514
+ * value from the previous response to fetch the next page; `page` is
14515
+ * ignored while a cursor is present. Supported by the flat artifact
14516
+ * listing of hosted/local, virtual, and remote repositories (#2518,
14517
+ * #2519), by `group_by=docker_tag`, and by `group_by=maven_component`
14518
+ * on remote repositories; other listing modes ignore it.
14519
+ */
14520
+ cursor?: string | null;
14521
+ /**
14522
+ * Total-count mode for keyset-paged listings (#2520, #2519).
14523
+ * `count=exact` runs a dedicated COUNT query so `pagination.total` is
14524
+ * exact; otherwise the keyset-paged listings report a cheap lower bound
14525
+ * (rows seen so far, +1 when another page exists) and `has_more` is the
14526
+ * authoritative "is there a next page" signal.
14527
+ */
14528
+ count?: string | null;
13875
14529
  };
13876
14530
  url: '/api/v1/repositories/{key}/artifacts';
13877
14531
  };
@@ -14469,13 +15123,17 @@ export type UpdateVirtualMembersData = {
14469
15123
 
14470
15124
  export type UpdateVirtualMembersErrors = {
14471
15125
  /**
14472
- * Repository is not virtual
15126
+ * Repository is not virtual, or a member is invalid
14473
15127
  */
14474
15128
  400: unknown;
14475
15129
  /**
14476
15130
  * Authentication required
14477
15131
  */
14478
15132
  401: unknown;
15133
+ /**
15134
+ * Insufficient permissions
15135
+ */
15136
+ 403: unknown;
14479
15137
  /**
14480
15138
  * Repository not found
14481
15139
  */
@@ -14484,7 +15142,7 @@ export type UpdateVirtualMembersErrors = {
14484
15142
 
14485
15143
  export type UpdateVirtualMembersResponses = {
14486
15144
  /**
14487
- * Members updated
15145
+ * Members replaced with the supplied set
14488
15146
  */
14489
15147
  200: VirtualMembersListResponse;
14490
15148
  };
@@ -14919,6 +15577,82 @@ export type GetRepositoryStorageResponses = {
14919
15577
 
14920
15578
  export type GetRepositoryStorageResponse = GetRepositoryStorageResponses[keyof GetRepositoryStorageResponses];
14921
15579
 
15580
+ export type RunRepositoryStorageGcData = {
15581
+ body: StorageGcRequest;
15582
+ path: {
15583
+ /**
15584
+ * Repository key
15585
+ */
15586
+ key: string;
15587
+ };
15588
+ query?: never;
15589
+ url: '/api/v1/repositories/{key}/storage-gc';
15590
+ };
15591
+
15592
+ export type RunRepositoryStorageGcErrors = {
15593
+ /**
15594
+ * Authentication required, or admin privileges required
15595
+ */
15596
+ 401: unknown;
15597
+ /**
15598
+ * Repository not found
15599
+ */
15600
+ 404: unknown;
15601
+ };
15602
+
15603
+ export type RunRepositoryStorageGcResponses = {
15604
+ /**
15605
+ * GC result
15606
+ */
15607
+ 200: StorageGcResult;
15608
+ };
15609
+
15610
+ export type RunRepositoryStorageGcResponse = RunRepositoryStorageGcResponses[keyof RunRepositoryStorageGcResponses];
15611
+
15612
+ export type GetRepositoryStorageTreeData = {
15613
+ body?: never;
15614
+ path: {
15615
+ /**
15616
+ * Repository key
15617
+ */
15618
+ key: string;
15619
+ };
15620
+ query?: {
15621
+ /**
15622
+ * Folder prefix to root the listing at (`''`/absent = repository root).
15623
+ * Leading/trailing slashes are ignored.
15624
+ */
15625
+ prefix?: string | null;
15626
+ /**
15627
+ * How many tree levels below `prefix` to return (default 1 = immediate
15628
+ * children, clamped to 1..=5).
15629
+ */
15630
+ depth?: number | null;
15631
+ /**
15632
+ * Maximum number of descendant nodes returned (default 200, clamped to
15633
+ * 1..=1000). `truncated` is set when the limit cut the listing.
15634
+ */
15635
+ limit?: number | null;
15636
+ };
15637
+ url: '/api/v1/repositories/{key}/storage/tree';
15638
+ };
15639
+
15640
+ export type GetRepositoryStorageTreeErrors = {
15641
+ /**
15642
+ * Repository not found
15643
+ */
15644
+ 404: unknown;
15645
+ };
15646
+
15647
+ export type GetRepositoryStorageTreeResponses = {
15648
+ /**
15649
+ * Per-prefix storage rollup
15650
+ */
15651
+ 200: RepositoryStorageTreeResponse;
15652
+ };
15653
+
15654
+ export type GetRepositoryStorageTreeResponse = GetRepositoryStorageTreeResponses[keyof GetRepositoryStorageTreeResponses];
15655
+
14922
15656
  export type TestUpstreamData = {
14923
15657
  body?: never;
14924
15658
  path: {
@@ -18167,7 +18901,7 @@ export type RotateWebhookSecretErrors = {
18167
18901
 
18168
18902
  export type RotateWebhookSecretResponses = {
18169
18903
  /**
18170
- * Secret rotated. Body includes the new raw secret exactly once.
18904
+ * Secret rotated. Body reports success and metadata only; the raw secret is not returned.
18171
18905
  */
18172
18906
  200: RotateWebhookSecretResponse;
18173
18907
  };