@forge-dashboard/sdk-node 4.0.0 → 5.1.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.
@@ -288,6 +288,35 @@ export interface paths {
288
288
  patch?: never;
289
289
  trace?: never;
290
290
  };
291
+ "/api/settings/timezone": {
292
+ parameters: {
293
+ query?: never;
294
+ header?: never;
295
+ path?: never;
296
+ cookie?: never;
297
+ };
298
+ /**
299
+ * The signed-in user's own saved time zone
300
+ * @description A lightweight, side-effect-free read of one field, for every page to
301
+ * check on load so it can show times in the user's zone. Deliberately
302
+ * not GET /api/settings, for the reason GET /api/settings/theme isn't.
303
+ * Empty means "use the browser's own zone".
304
+ */
305
+ get: operations["getTimezone"];
306
+ /**
307
+ * Save the signed-in user's own time zone
308
+ * @description A dedicated, instant save, not routed through PUT /api/settings,
309
+ * which replaces every other field. Exists for browsers that report
310
+ * UTC to every page, such as Firefox with fingerprint resistance.
311
+ */
312
+ put: operations["setTimezone"];
313
+ post?: never;
314
+ delete?: never;
315
+ options?: never;
316
+ head?: never;
317
+ patch?: never;
318
+ trace?: never;
319
+ };
291
320
  "/api/settings/filter-state": {
292
321
  parameters: {
293
322
  query?: never;
@@ -302,6 +331,8 @@ export interface paths {
302
331
  * isn't either: this loads on every dashboard/Insights visit and
303
332
  * shouldn't provision webhook credentials as a side effect.
304
333
  * `{}` for a user who's never saved any filters yet, not a 404.
334
+ * These are the web UI's own state: a signed-in browser session only,
335
+ * and a personal API token is refused with 403 (#1000).
305
336
  */
306
337
  get: operations["getFilterState"];
307
338
  /**
@@ -315,6 +346,9 @@ export interface paths {
315
346
  * partial patch. Filters.js's own client-side code decides when
316
347
  * to call this: immediately for a discrete control, debounced
317
348
  * while the user is still typing in the free-text Title filter.
349
+ * A signed-in browser session only: a personal API token is refused
350
+ * with 403, so a script or agent can't change the filters the user
351
+ * sees (#1000). Each save is logged with the user agent.
318
352
  */
319
353
  put: operations["setFilterState"];
320
354
  post?: never;
@@ -391,6 +425,15 @@ export interface paths {
391
425
  * One of a small number of endpoints in this API that write to a
392
426
  * forge rather than just reading from it — see also the
393
427
  * pull-requests tag.
428
+ *
429
+ * A refusal from the forge (403, 404, 429 and 502) answers with the
430
+ * same `ActionError` a refused pull request action does, so a client
431
+ * reads one shape: `code` is `permission` or `rate_limited` where
432
+ * the forge said so (with `resetsAt` for a rate limit), and
433
+ * `unknown` otherwise, with a plain `message` either way. No new
434
+ * code is needed: a repo the forge can't find is `unknown` with its
435
+ * own message. 400 and 401 stay a plain `Error`, since they are
436
+ * about the request, not a refusal by the forge.
394
437
  */
395
438
  post: operations["ensureWebhook"];
396
439
  delete?: never;
@@ -508,7 +551,8 @@ export interface paths {
508
551
  * Merge one pull request, on the signed-in user's behalf
509
552
  * @description Merges the named pull request using its repo's own configured
510
553
  * default merge method — GitHub is asked to pick its own repo
511
- * default; Forgejo's API has no such default built in, so this
554
+ * default, except that a base branch requiring linear history gets
555
+ * squash or rebase, never a merge commit; Forgejo's API has no such default built in, so this
512
556
  * looks up the repo's configured default merge style first and
513
557
  * passes that explicitly. Neither takes a method override here;
514
558
  * picking one is out of scope for this endpoint.
@@ -545,9 +589,27 @@ export interface paths {
545
589
  * mutation asks for an explicit merge method rather than picking
546
590
  * the repo's own default itself, so this looks the repo's allowed
547
591
  * methods up first and picks one with the same merge > squash >
548
- * rebase precedence Merge already uses; no override is exposed
592
+ * rebase precedence Merge already uses, skipping merge when the
593
+ * default branch requires linear history; no override is exposed
549
594
  * here either. The pull request stays open and unmerged until the
550
595
  * forge's own required checks pass on their own.
596
+ *
597
+ * When the forge refuses, the server re-reads the pull request and
598
+ * answers an `ActionError` (see Merge): `already_merged` or
599
+ * `already_closed` when the row was stale, otherwise a `code` and a
600
+ * plain-words `message` safe to show a person.
601
+ *
602
+ * When the pull request is on the signed-in user's board and its
603
+ * `allowedActions` has no `auto_merge` entry, this server answers 409
604
+ * itself and never asks the forge: `auto_merge_not_allowed`,
605
+ * `already_up_to_date`, `conflict`, `stacked` or `ready_to_merge` for
606
+ * the reasons the board already knows, and `not_mergeable` for
607
+ * auto-merge already on or a forge that has none.
608
+ * `auto_merge_not_allowed` means the repo doesn't allow auto-merge
609
+ * (or not for this pull request); `ready_to_merge` means it is
610
+ * already clean, so there is nothing to wait for and Merge is the
611
+ * action; `checks_pending` means a non-required check is still
612
+ * running, so trying again later can work.
551
613
  */
552
614
  post: operations["enablePullRequestAutoMerge"];
553
615
  delete?: never;
@@ -570,6 +632,12 @@ export interface paths {
570
632
  * @description Closes the named pull request — for one that turns out not to
571
633
  * need merging at all (a duplicate, or one whose content already
572
634
  * landed another way), not a substitute for Merge.
635
+ *
636
+ * When the forge refuses, the server re-reads the pull request and
637
+ * answers an `ActionError` (see Merge): `already_merged` or
638
+ * `already_closed` when the row was stale, otherwise a `code` and a
639
+ * plain-words `message` safe to show a person.
640
+ * Closing a merged pull request is `already_merged`.
573
641
  */
574
642
  post: operations["closePullRequest"];
575
643
  delete?: never;
@@ -578,6 +646,43 @@ export interface paths {
578
646
  patch?: never;
579
647
  trace?: never;
580
648
  };
649
+ "/api/pull-requests/rerun-checks": {
650
+ parameters: {
651
+ query?: never;
652
+ header?: never;
653
+ path?: never;
654
+ cookie?: never;
655
+ };
656
+ get?: never;
657
+ put?: never;
658
+ /**
659
+ * Rerun only the failed jobs of one pull request's checks, on the signed-in user's behalf
660
+ * @description Asks the forge to rerun the failed jobs of the Actions workflow
661
+ * runs on the pull request's head commit, and nothing that passed. It
662
+ * answers once the forge has queued them, not when they finish, so a
663
+ * client shows a queued state and lets the next refresh carry the
664
+ * result.
665
+ *
666
+ * A pull request offers it as a `rerun_checks` entry in
667
+ * `allowedActions`, on GitHub and Forgejo, when its CI is failing. A
668
+ * Forgejo commit status doesn't say which workflow run it came from, so
669
+ * Forgejo's runs are found by the head commit instead. A failed check
670
+ * that isn't an Actions job (a third-party check, a legacy status, an
671
+ * external CI) can't be rerun here and is skipped. A Forgejo instance
672
+ * too old to have the rerun route refuses with its own words.
673
+ *
674
+ * Refusals are an `ActionError` (see Merge). `not_mergeable` with a 409
675
+ * means the pull request has no failed check to rerun. Anything the
676
+ * forge refuses (the token may not write to Actions, the run is too
677
+ * old or already running) arrives with its own plain-words `message`.
678
+ */
679
+ post: operations["rerunPullRequestChecks"];
680
+ delete?: never;
681
+ options?: never;
682
+ head?: never;
683
+ patch?: never;
684
+ trace?: never;
685
+ };
581
686
  "/api/pull-requests/update-branch": {
582
687
  parameters: {
583
688
  query?: never;
@@ -595,6 +700,13 @@ export interface paths {
595
700
  * failure; a follow-up refresh a moment later reflects the result.
596
701
  * Forgejo's equivalent is always synchronous, so it only ever
597
702
  * answers 204.
703
+ *
704
+ * When the forge refuses, the server re-reads the pull request and
705
+ * answers an `ActionError` (see Merge): `already_merged` or
706
+ * `already_closed` when the row was stale, otherwise a `code` and a
707
+ * plain-words `message` safe to show a person.
708
+ * `conflict` means the branches can't be merged cleanly;
709
+ * `already_up_to_date` means there was nothing to bring in.
598
710
  */
599
711
  post: operations["updatePullRequestBranch"];
600
712
  delete?: never;
@@ -620,6 +732,13 @@ export interface paths {
620
732
  * endpoint; `action` is validated server-side to one of the two
621
733
  * values below and nothing else is ever sent. GitHub only —
622
734
  * Dependabot doesn't run on Forgejo.
735
+ *
736
+ * When the forge refuses, the server re-reads the pull request and
737
+ * answers an `ActionError` (see Merge): `already_merged` or
738
+ * `already_closed` when the row was stale, otherwise a `code` and a
739
+ * plain-words `message` safe to show a person.
740
+ * A connected App with no personal token saved is `permission`, with
741
+ * the reason in `message`; nothing is posted.
623
742
  */
624
743
  post: operations["postPullRequestDependabotAction"];
625
744
  delete?: never;
@@ -646,6 +765,11 @@ export interface paths {
646
765
  * is a label rather than a comment command. Works on both GitHub
647
766
  * and Forgejo, unlike the Dependabot actions, since Renovate runs
648
767
  * on both.
768
+ *
769
+ * When the forge refuses, the server re-reads the pull request and
770
+ * answers an `ActionError` (see Merge): `already_merged` or
771
+ * `already_closed` when the row was stale, otherwise a `code` and a
772
+ * plain-words `message` safe to show a person.
649
773
  */
650
774
  post: operations["postPullRequestRenovateRebase"];
651
775
  delete?: never;
@@ -860,11 +984,23 @@ export interface paths {
860
984
  * Readiness
861
985
  * @description Answers 200 once the server can actually serve: the database answers
862
986
  * a ping with its schema in place, and the first dashboard refresh has
863
- * completed. A refresh that finished with a forge unreachable still
864
- * counts, and a forge going unreachable afterwards never turns this
865
- * into a 503 — see forges[].reachable on the dashboard response for
866
- * that. Before any account has signed in there is no refresh to wait
867
- * for, so only the database is checked.
987
+ * completed, or 30 seconds have passed since it started. The wait is
988
+ * bounded because how fast a forge answers is how fresh the data is,
989
+ * not whether the server can serve: a slow or unreachable forge must not
990
+ * keep the container unready. A refresh that finished with a forge
991
+ * unreachable counts, and a forge going unreachable afterwards never
992
+ * turns this into a 503. See forges[].reachable on the dashboard
993
+ * response for that. Before any account has signed in there is no
994
+ * refresh to wait for, so only the database is checked.
995
+ *
996
+ * The database ping gets 2 seconds, less than the HEALTHCHECK's own 5,
997
+ * so a database that doesn't answer turns into a 503 instead of a hung
998
+ * probe. The ping's result, pass or fail, is reused for about 3
999
+ * seconds, so probes arriving every second don't each reach the
1000
+ * database. On SIGTERM this answers 503 ("shutting down") at once, and
1001
+ * the server waits a drain period (`SHUTDOWN_DRAIN`, default 5 seconds)
1002
+ * before it stops accepting connections, so a router that polls this
1003
+ * path stops sending traffic first.
868
1004
  *
869
1005
  * The container's HEALTHCHECK probes this path (`/healthz` stays the
870
1006
  * cheap liveness answer), so Docker's single health state and Compose's
@@ -944,6 +1080,11 @@ export interface paths {
944
1080
  * it returns that user's dashboard instead — allowed only when they've
945
1081
  * shared it with the caller (or the caller is viewing their own
946
1082
  * username), and refused with a 403 otherwise.
1083
+ *
1084
+ * Draft pull requests are left out unless `includeDrafts=true`. With
1085
+ * `owner`, the same rule applies to that user's dashboard, and
1086
+ * `hiddenDrafts` counts only the drafts in repos that user hasn't
1087
+ * ignored, the same repos whose other pull requests show.
947
1088
  */
948
1089
  get: operations["getDashboard"];
949
1090
  put?: never;
@@ -976,6 +1117,10 @@ export interface paths {
976
1117
  * proxy that can't hold an SSE connection open just never
977
1118
  * benefits from this, rather than the dashboard going stale
978
1119
  * silently.
1120
+ *
1121
+ * `includeDrafts` is read once, when the connection opens, and
1122
+ * applies to every event on it. A client that changes its mind
1123
+ * reconnects with the new value.
979
1124
  */
980
1125
  get: operations["streamDashboard"];
981
1126
  put?: never;
@@ -1125,6 +1270,17 @@ export interface components {
1125
1270
  /** @constant */
1126
1271
  status: "ok";
1127
1272
  };
1273
+ Ready: {
1274
+ /** @constant */
1275
+ status: "ok";
1276
+ /** @description Goroutines the process holds right now. */
1277
+ goroutines: number;
1278
+ /**
1279
+ * @description OS threads the process holds right now, read from
1280
+ * `/proc/self/status`. Left out where that can't be read.
1281
+ */
1282
+ threads?: number;
1283
+ };
1128
1284
  Version: {
1129
1285
  /**
1130
1286
  * @description The release tag this binary was built from, with no leading
@@ -1136,29 +1292,59 @@ export interface components {
1136
1292
  };
1137
1293
  Error: {
1138
1294
  error: string;
1295
+ /**
1296
+ * @description Present when the rejection is about one field of the request
1297
+ * body (a settings save, for instance), named as it appears there,
1298
+ * so a client can mark that input without parsing `error`.
1299
+ */
1300
+ field?: string;
1139
1301
  };
1140
- /** @description The structured result of a refused pull request action (Merge today; the other actions adopt it next, so it isn't merge-specific). `error` is the same string every Error carries (the forge's own text, for logs); `code` and `message` are what a client should act on and show. */
1302
+ /** @description The structured result of a refused pull request action (Merge, Close, Update branch, Enable auto-merge, Dependabot and Renovate rebase). `code` and `message` are what a client should act on and show. */
1141
1303
  ActionError: {
1142
- /** @description The underlying error text, unchanged. */
1304
+ /**
1305
+ * @description The same string every Error carries. With `code: unknown` it
1306
+ * is the same plain words as `message`, since the raw text
1307
+ * (internal prefixes, API paths, URLs) goes to the server log.
1308
+ * With any other code it is the forge's own text, for logs.
1309
+ */
1143
1310
  error: string;
1144
1311
  /**
1145
1312
  * @description Why the action was refused, from a re-read of the pull
1146
1313
  * request's real state. `already_merged` and `already_closed`
1147
1314
  * mean the dashboard's row was stale: the pull request has
1148
1315
  * nothing left to merge.
1316
+ *
1317
+ * Three codes belong to one action each: `already_up_to_date`
1318
+ * (Update branch: nothing to bring in), `auto_merge_not_allowed`
1319
+ * (Enable auto-merge: the repo or pull request doesn't allow it)
1320
+ * and `ready_to_merge` (Enable auto-merge: already clean, use
1321
+ * Merge).
1149
1322
  * @enum {string}
1150
1323
  */
1151
- code: "already_merged" | "already_closed" | "not_mergeable" | "conflict" | "behind" | "checks_pending" | "checks_failing" | "blocked_by_protection" | "permission" | "rate_limited" | "unknown";
1152
- /** @description A short reason in plain words, safe to show a person. */
1324
+ code: "already_merged" | "already_closed" | "not_mergeable" | "conflict" | "behind" | "checks_pending" | "checks_failing" | "blocked_by_protection" | "already_up_to_date" | "auto_merge_not_allowed" | "ready_to_merge" | "permission" | "rate_limited" | "unknown";
1325
+ /**
1326
+ * @description A short reason in plain words, safe to show a person, always.
1327
+ * With `code: unknown` it is the forge's own sentence when that
1328
+ * reads as one, "The forge didn't answer. Try again in a moment."
1329
+ * when the forge was unreachable (including a 502, 503 or 504),
1330
+ * and "The forge refused this action and gave no reason."
1331
+ * otherwise. It never holds an internal prefix, an API path, a
1332
+ * URL or JSON.
1333
+ */
1153
1334
  message: string;
1154
1335
  /**
1155
1336
  * Format: date-time
1156
- * @description Only with `rate_limited`, when the forge said so. When the budget comes back.
1337
+ * @description Only with `rate_limited`, when the forge said so. When the budget comes back. On Forgejo it comes from the `Retry-After` header, in seconds or as a date.
1157
1338
  */
1158
1339
  resetsAt?: string;
1159
1340
  };
1160
1341
  RegisterBeginRequest: {
1161
- /** @example ryan */
1342
+ /**
1343
+ * @description Surrounding whitespace is trimmed by the server, and what is
1344
+ * left must not be empty. Clients may check the same pattern for
1345
+ * quick feedback; the server decides.
1346
+ * @example ryan
1347
+ */
1162
1348
  username: string;
1163
1349
  /**
1164
1350
  * @description Ignored once an invite is required (any account already
@@ -1181,7 +1367,12 @@ export interface components {
1181
1367
  open: boolean;
1182
1368
  };
1183
1369
  LoginBeginRequest: {
1184
- /** @example ryan */
1370
+ /**
1371
+ * @description Surrounding whitespace is trimmed by the server, and what is
1372
+ * left must not be empty. Clients may check the same pattern for
1373
+ * quick feedback; the server decides.
1374
+ * @example ryan
1375
+ */
1185
1376
  username: string;
1186
1377
  };
1187
1378
  /**
@@ -1239,7 +1430,12 @@ export interface components {
1239
1430
  expiresAt: string;
1240
1431
  };
1241
1432
  AdminInviteCreateRequest: {
1242
- /** @example alex */
1433
+ /**
1434
+ * @description Surrounding whitespace is trimmed by the server, and what is
1435
+ * left must not be empty. Clients may check the same pattern for
1436
+ * quick feedback; the server decides.
1437
+ * @example alex
1438
+ */
1243
1439
  username: string;
1244
1440
  /** @example Alex */
1245
1441
  displayName: string;
@@ -1373,6 +1569,13 @@ export interface components {
1373
1569
  * @enum {string}
1374
1570
  */
1375
1571
  theme: "" | "light" | "dark";
1572
+ /**
1573
+ * @description The signed-in user's own time zone as an IANA name such as
1574
+ * `Europe/Amsterdam`. Empty means the browser's own zone. Set only
1575
+ * from Settings (PUT /api/settings/timezone); every other page reads
1576
+ * it via GET /api/settings/timezone.
1577
+ */
1578
+ timezone?: string;
1376
1579
  };
1377
1580
  /**
1378
1581
  * @description Replaces the signed-in user's saved GitHub/Forgejo configuration.
@@ -1389,8 +1592,19 @@ export interface components {
1389
1592
  SettingsRequest: {
1390
1593
  githubToken?: string;
1391
1594
  githubUsername?: string;
1392
- /** Format: int64 */
1595
+ /**
1596
+ * Format: int64
1597
+ * @description 0 means none. A negative or non-integer value is a 400 naming
1598
+ * this field, as is any value on a server with no GitHub App
1599
+ * configured.
1600
+ */
1393
1601
  githubAppInstallationId?: number;
1602
+ /**
1603
+ * @description Required, once the save is merged with what is already stored,
1604
+ * whenever a Forgejo token or username is set. That depends on
1605
+ * stored state, so a schema alone can't express it: a save that
1606
+ * breaks it is a 400 naming `forgejoUrl`.
1607
+ */
1394
1608
  forgejoUrl?: string;
1395
1609
  forgejoToken?: string;
1396
1610
  forgejoUsername?: string;
@@ -1406,6 +1620,19 @@ export interface components {
1406
1620
  /** @enum {string} */
1407
1621
  theme: "" | "light" | "dark";
1408
1622
  };
1623
+ /** @description See GET /api/settings/timezone's own description. */
1624
+ TimezoneResponse: {
1625
+ /**
1626
+ * @description An IANA zone name such as `Europe/Amsterdam`, or empty for the browser's own.
1627
+ * @example Europe/Amsterdam
1628
+ */
1629
+ timezone: string;
1630
+ };
1631
+ /** @description See PUT /api/settings/timezone's own description. */
1632
+ TimezoneRequest: {
1633
+ /** @description An IANA zone name, or empty for the browser's own. `Local` is refused. */
1634
+ timezone: string;
1635
+ };
1409
1636
  /**
1410
1637
  * @description A registered passkey's own metadata — never the
1411
1638
  * credential itself, which never leaves the authenticator that
@@ -1545,6 +1772,28 @@ export interface components {
1545
1772
  * mapped to a protection entry. Absent is not the same as false.
1546
1773
  */
1547
1774
  required?: boolean;
1775
+ /**
1776
+ * @description How long a completed check ran. Absent while it runs, or when
1777
+ * the forge doesn't say. GitHub only: Forgejo's API doesn't give
1778
+ * a job's timing.
1779
+ */
1780
+ durationSeconds?: number;
1781
+ /**
1782
+ * @description The name of the step of a failed job that broke. Absent when
1783
+ * the check isn't a job the token can read (a third-party check,
1784
+ * a forge with no step data, a token without access).
1785
+ */
1786
+ failedStep?: string;
1787
+ /**
1788
+ * @description The tail of the failed job's log as plain text: the last lines,
1789
+ * with per-line timestamps and colour codes removed, at most 2,000
1790
+ * characters. Never markup, and a client must render it as text.
1791
+ * Whatever the forge already masks stays masked. Absent when the
1792
+ * log can't be read or has expired. GitHub only: Forgejo's API
1793
+ * doesn't serve job logs, so there the link to the run is all a
1794
+ * failed check offers.
1795
+ */
1796
+ excerpt?: string;
1548
1797
  };
1549
1798
  PullRequestChecksResponse: {
1550
1799
  checks: components["schemas"]["Check"][];
@@ -1555,11 +1804,14 @@ export interface components {
1555
1804
  * stopping a merge that isn't confirmed to be a real conflict —
1556
1805
  * including Forgejo's own mergeable flag reporting false, since its
1557
1806
  * server computes that asynchronously and can report it stale.
1807
+ * "unstable" is GitHub's UNSTABLE: the pull request can be merged, but
1808
+ * a check that branch protection doesn't require is failing or still
1809
+ * running. Merge stays available.
1558
1810
  * "unknown" covers both a forge that hasn't determined this yet and
1559
1811
  * this service being unable to determine it.
1560
1812
  * @enum {string}
1561
1813
  */
1562
- MergeStatus: "mergeable" | "conflicting" | "blocked" | "unknown";
1814
+ MergeStatus: "mergeable" | "conflicting" | "blocked" | "unstable" | "unknown";
1563
1815
  Label: {
1564
1816
  /** @example kind/bug */
1565
1817
  name: string;
@@ -1585,6 +1837,16 @@ export interface components {
1585
1837
  forge: components["schemas"]["Forge"];
1586
1838
  /** @description Whether the last refresh attempt against this forge succeeded. */
1587
1839
  reachable: boolean;
1840
+ /**
1841
+ * Format: date-time
1842
+ * @description Present when the last refresh against this forge failed and the
1843
+ * pull requests, issues and repos in the response are the last good
1844
+ * ones, fetched at this time, instead of none. Absent when the data
1845
+ * is current, and for a forge that has never fetched successfully,
1846
+ * which has nothing to show. A client can say "unreachable, showing
1847
+ * data from 3 minutes ago".
1848
+ */
1849
+ staleSince?: string;
1588
1850
  /** @description A human-readable explanation of the last failure, if reachable is false. Mapped from errorKind, not the raw underlying error text. Omitted when reachable. */
1589
1851
  error?: string;
1590
1852
  errorKind?: components["schemas"]["ForgeErrorKind"];
@@ -1610,6 +1872,18 @@ export interface components {
1610
1872
  resetsAt: string;
1611
1873
  /** @description The point price the most recent call was actually charged — GraphQL-specific, since a REST request has no separate cost concept beyond the flat one-request-one-point REST's own budget already counts. Omitted for a REST-sourced RateLimit. */
1612
1874
  cost?: number;
1875
+ /**
1876
+ * @description How worried a client should be about this budget, graded by
1877
+ * the server as of the response, so no client needs its own
1878
+ * threshold or clock check. `exceeded`: nothing left and the
1879
+ * reset hasn't been seen to pass. `low`: under 5% left (also a
1880
+ * spent budget whose reset time has passed, until the next
1881
+ * snapshot says otherwise). `warning`: under 20% left but not
1882
+ * yet low, for a gauge's amber stage; a banner or a lock has no
1883
+ * reason to act on it. `ok`: everything else.
1884
+ * @enum {string}
1885
+ */
1886
+ severity: "ok" | "warning" | "low" | "exceeded";
1613
1887
  };
1614
1888
  PullRequest: {
1615
1889
  forge: components["schemas"]["Forge"];
@@ -1644,6 +1918,93 @@ export interface components {
1644
1918
  * other.
1645
1919
  */
1646
1920
  behind: boolean;
1921
+ /**
1922
+ * @description The commit the pull request's head branch points at. A bot's
1923
+ * rebase moves it, which shows the bot acted even when the pull
1924
+ * request is still reported behind, or wasn't behind to begin
1925
+ * with. Empty when the forge didn't say. Always present.
1926
+ */
1927
+ headSha: string;
1928
+ /**
1929
+ * @description What sort of pull request this is, decided by the server so no
1930
+ * client keeps its own copy of the rule. `release`: release-please's,
1931
+ * by its `autorelease:` label (a person opens these, so the label is
1932
+ * the only signal, and it wins over any bot author). `dependency`:
1933
+ * opened by Dependabot or Renovate, in either spelling of the login
1934
+ * (the bare slug GraphQL gives, or REST's `[bot]` form), on either
1935
+ * forge. `regular`: everything else. Always present.
1936
+ * @enum {string}
1937
+ */
1938
+ kind: "release" | "dependency" | "regular";
1939
+ /**
1940
+ * @description The branch the pull request targets. Empty when the forge didn't
1941
+ * say.
1942
+ */
1943
+ baseBranch: string;
1944
+ /**
1945
+ * @description The branch the pull request comes from. Empty when the forge
1946
+ * didn't say.
1947
+ */
1948
+ headBranch: string;
1949
+ /**
1950
+ * @description True when the head branch lives in another repository (a fork).
1951
+ * A fork pull request is never part of a stack.
1952
+ */
1953
+ crossRepository: boolean;
1954
+ /**
1955
+ * @description Where this pull request sits in a stack of pull requests, or
1956
+ * null when it is in none. A stack is worked out on the server:
1957
+ * pull request B is stacked on A when B's base branch is A's head
1958
+ * branch, in the same repository on the same forge, and neither is
1959
+ * a fork. A branch with several open pull requests takes the one
1960
+ * with the lowest number as parent, and a loop of branches is
1961
+ * treated as no stack. The snapshot holds open pull requests
1962
+ * only, so a base branch that no open pull request owns (a parent
1963
+ * that already merged and was not retargeted) is not flagged.
1964
+ */
1965
+ stack: null | components["schemas"]["StackPosition"];
1966
+ /**
1967
+ * @description The open pull request this one is stacked on, or null when its
1968
+ * base is not another open pull request's head.
1969
+ */
1970
+ stackedOn: null | components["schemas"]["StackRef"];
1971
+ /**
1972
+ * @description The numbers of the open pull requests stacked directly on this
1973
+ * one. Always a list, empty when none.
1974
+ */
1975
+ stackChildren: number[];
1976
+ /**
1977
+ * @description A Dependabot or Renovate rebase asked for through this app and not
1978
+ * settled yet, or null. The server keeps it, so a reload during the
1979
+ * wait still shows it, and moves it along on every snapshot that
1980
+ * came from a fetch started after the request. Held in memory per
1981
+ * account: a server restart forgets it.
1982
+ */
1983
+ botRequest?: null | components["schemas"]["BotRequest"];
1984
+ /**
1985
+ * @description An Update branch the forge accepted and that no snapshot has shown
1986
+ * landing yet, or null. The server keeps it, so a reload during the
1987
+ * wait still shows it. It is dropped once a snapshot from a fetch
1988
+ * started after the request shows the pull request no longer
1989
+ * behind, or when the pull request is gone. Held in memory per
1990
+ * account: a server restart forgets it.
1991
+ */
1992
+ updateRequest?: null | components["schemas"]["UpdateRequest"];
1993
+ /**
1994
+ * @description The logins of the users asked to review this pull request, on
1995
+ * both forges. A team request has no login and is left out.
1996
+ * Always present, and empty when nobody was asked. Costs no
1997
+ * extra request: GitHub returns it with the reviewRequests count
1998
+ * already queried, Forgejo with the pull request itself.
1999
+ */
2000
+ requestedReviewerLogins: string[];
2001
+ /**
2002
+ * @description True when this open, non-draft pull request asks the signed-in
2003
+ * user to review it, matched without regard to case against the
2004
+ * username saved in Settings for its forge. False when no
2005
+ * username is saved for that forge. Always present.
2006
+ */
2007
+ reviewRequestedFromMe: boolean;
1647
2008
  /**
1648
2009
  * @description Whether merging this pull request would produce an empty
1649
2010
  * commit — its content already landed on the base branch some
@@ -1675,6 +2036,113 @@ export interface components {
1675
2036
  */
1676
2037
  autoMergeAllowed?: boolean;
1677
2038
  review?: components["schemas"]["ReviewState"];
2039
+ /**
2040
+ * @description The actions this pull request offers, worked out on the server
2041
+ * from its own fields, so a client needs no copy of the rules. An
2042
+ * action that doesn't apply (Update branch on a pull request that
2043
+ * isn't behind, a Dependabot command on a Renovate pull request)
2044
+ * is absent, not listed as blocked. Always present; `close` is
2045
+ * always in it. Live state is the client's: a rate-limited or
2046
+ * unreachable forge, a missing token and an action already in
2047
+ * flight can still stop an offered action.
2048
+ */
2049
+ allowedActions: components["schemas"]["AllowedAction"][];
2050
+ /**
2051
+ * @description True when the pull request is mergeable, its CI is green and it
2052
+ * isn't a draft: what the Ready quick filter lists. Always
2053
+ * present. A pull request with no checks isn't ready.
2054
+ */
2055
+ readyToMerge: boolean;
2056
+ /**
2057
+ * @description True when a review is outstanding: the forge requires one, or a
2058
+ * reviewer was asked and hasn't answered, and the pull request
2059
+ * isn't a draft. Unreviewed with nobody asked, approved, changes
2060
+ * requested and an unknown review state are all false. Always
2061
+ * present.
2062
+ */
2063
+ needsReview: boolean;
2064
+ };
2065
+ BotRequest: {
2066
+ /** @enum {string} */
2067
+ bot: "dependabot" | "renovate";
2068
+ /**
2069
+ * @description `recreate` is Dependabot's only. Renovate's rebase label is
2070
+ * reported as `rebase`.
2071
+ * @enum {string}
2072
+ */
2073
+ action: "rebase" | "recreate";
2074
+ /**
2075
+ * @description `queued`: asked, and nothing seen yet. `rebasing`: the bot
2076
+ * pushed (the head changed, or the pull request was behind and
2077
+ * isn't), and CI hasn't restarted yet. `expired`: the bot didn't
2078
+ * act within 5 minutes. An expired request stays until the pull
2079
+ * request is gone, a new request replaces it, or an hour passes.
2080
+ * A request is dropped once CI shows pending after the push, 2
2081
+ * minutes into `rebasing`, or when the pull request is gone.
2082
+ * @enum {string}
2083
+ */
2084
+ phase: "queued" | "rebasing" | "expired";
2085
+ /** Format: date-time */
2086
+ requestedAt: string;
2087
+ /**
2088
+ * Format: date-time
2089
+ * @description When the server stops waiting in the current phase: 5 minutes
2090
+ * after the request while `queued`, 2 minutes after the pickup
2091
+ * while `rebasing`.
2092
+ */
2093
+ expiresAt: string;
2094
+ };
2095
+ UpdateRequest: {
2096
+ /**
2097
+ * @description `queued`: accepted, and the pull request is still behind.
2098
+ * `expired`: still behind after 5 minutes. An expired request stays
2099
+ * until the pull request is gone, a new request replaces it, or an
2100
+ * hour passes.
2101
+ * @enum {string}
2102
+ */
2103
+ phase: "queued" | "expired";
2104
+ /** Format: date-time */
2105
+ requestedAt: string;
2106
+ /**
2107
+ * Format: date-time
2108
+ * @description When the server stops waiting in the current phase: 5 minutes
2109
+ * after the request while `queued`.
2110
+ */
2111
+ expiresAt: string;
2112
+ };
2113
+ StackPosition: {
2114
+ /**
2115
+ * @description 1 for the pull request at the bottom of the stack (the one
2116
+ * targeting a branch no open pull request owns), 2 for one
2117
+ * stacked directly on it, and so on.
2118
+ */
2119
+ position: number;
2120
+ /** @description How many open pull requests the stack holds. */
2121
+ size: number;
2122
+ };
2123
+ StackRef: {
2124
+ number: number;
2125
+ /** Format: uri */
2126
+ url: string;
2127
+ };
2128
+ AllowedAction: {
2129
+ /** @enum {string} */
2130
+ action: "merge" | "close" | "update_branch" | "auto_merge" | "dependabot_rebase" | "dependabot_recreate" | "renovate_rebase" | "rerun_checks";
2131
+ /**
2132
+ * @description Present when the action is offered but can't be taken yet. Merge
2133
+ * is never hidden for an open pull request, only blocked.
2134
+ */
2135
+ blocked?: {
2136
+ /**
2137
+ * @description The same codes as `ActionError.code`.
2138
+ * @enum {string}
2139
+ */
2140
+ code: "already_up_to_date" | "conflict" | "not_mergeable" | "checks_pending" | "checks_failing" | "behind" | "blocked_by_protection" | "stacked";
2141
+ /** @description Plain words, safe to show a person. */
2142
+ message: string;
2143
+ /** @description What unlocks it, when something does. */
2144
+ next?: string;
2145
+ };
1678
2146
  };
1679
2147
  /**
1680
2148
  * @description Where a pull request stands on code review. The whole object is
@@ -1720,6 +2188,13 @@ export interface components {
1720
2188
  * @description The real issue URL on its own forge.
1721
2189
  */
1722
2190
  url: string;
2191
+ /**
2192
+ * @description True for an issue a bot keeps open and rewrites, Renovate's
2193
+ * "Dependency Dashboard", which is not work for a person. The
2194
+ * server decides, so every client lists and counts the same
2195
+ * issues. It stays in `issues`; `openIssueCount` leaves it out.
2196
+ */
2197
+ housekeeping: boolean;
1723
2198
  author: string;
1724
2199
  labels: components["schemas"]["Label"][];
1725
2200
  /** Format: date-time */
@@ -1728,11 +2203,24 @@ export interface components {
1728
2203
  updatedAt: string;
1729
2204
  };
1730
2205
  Dashboard: {
2206
+ /**
2207
+ * @description How many of `issues` are real work: all of them except the
2208
+ * `housekeeping` ones. What the Issues badge shows.
2209
+ */
2210
+ openIssueCount: number;
1731
2211
  /**
1732
2212
  * Format: date-time
1733
2213
  * @description When this snapshot was refreshed, not when it was requested.
1734
2214
  */
1735
2215
  generatedAt: string;
2216
+ /**
2217
+ * @description How many draft pull requests `pullRequests` leaves out. Always
2218
+ * present, and `0` when the request set `includeDrafts=true`, so
2219
+ * a client can render "N hidden" without a special case. Drafts
2220
+ * in a repo the account ignores aren't counted, since none of
2221
+ * that repo's pull requests show.
2222
+ */
2223
+ hiddenDrafts: number;
1736
2224
  forges: components["schemas"]["ForgeHealth"][];
1737
2225
  pullRequests: components["schemas"]["PullRequest"][];
1738
2226
  issues: components["schemas"]["Issue"][];
@@ -1814,6 +2302,14 @@ export interface components {
1814
2302
  PathUsername: string;
1815
2303
  PathWebhookToken: string;
1816
2304
  PathTokenID: string;
2305
+ /**
2306
+ * @description Whether draft pull requests are in `pullRequests`. Defaults to
2307
+ * `false`: nothing can be merged, auto-merged or updated on a draft,
2308
+ * so a draft is left out and counted in the response's `hiddenDrafts`
2309
+ * instead. The stream and the refresh endpoint take the same
2310
+ * parameter, so every snapshot a client receives follows one rule.
2311
+ */
2312
+ QueryIncludeDrafts: boolean;
1817
2313
  /** @description Narrow to entries against this forge only. Omitted matches every forge. */
1818
2314
  QueryRequestLogForge: components["schemas"]["Forge"];
1819
2315
  /**
@@ -2361,6 +2857,77 @@ export interface operations {
2361
2857
  };
2362
2858
  };
2363
2859
  };
2860
+ getTimezone: {
2861
+ parameters: {
2862
+ query?: never;
2863
+ header?: never;
2864
+ path?: never;
2865
+ cookie?: never;
2866
+ };
2867
+ requestBody?: never;
2868
+ responses: {
2869
+ /** @description The current value. */
2870
+ 200: {
2871
+ headers: {
2872
+ [name: string]: unknown;
2873
+ };
2874
+ content: {
2875
+ "application/json": components["schemas"]["TimezoneResponse"];
2876
+ };
2877
+ };
2878
+ /** @description No valid session cookie was presented. */
2879
+ 401: {
2880
+ headers: {
2881
+ [name: string]: unknown;
2882
+ };
2883
+ content: {
2884
+ "application/json": components["schemas"]["Error"];
2885
+ };
2886
+ };
2887
+ };
2888
+ };
2889
+ setTimezone: {
2890
+ parameters: {
2891
+ query?: never;
2892
+ header?: never;
2893
+ path?: never;
2894
+ cookie?: never;
2895
+ };
2896
+ requestBody: {
2897
+ content: {
2898
+ "application/json": components["schemas"]["TimezoneRequest"];
2899
+ };
2900
+ };
2901
+ responses: {
2902
+ /** @description The saved value. */
2903
+ 200: {
2904
+ headers: {
2905
+ [name: string]: unknown;
2906
+ };
2907
+ content: {
2908
+ "application/json": components["schemas"]["TimezoneResponse"];
2909
+ };
2910
+ };
2911
+ /** @description timezone wasn't empty or an IANA zone name. */
2912
+ 400: {
2913
+ headers: {
2914
+ [name: string]: unknown;
2915
+ };
2916
+ content: {
2917
+ "application/json": components["schemas"]["Error"];
2918
+ };
2919
+ };
2920
+ /** @description No valid session cookie was presented. */
2921
+ 401: {
2922
+ headers: {
2923
+ [name: string]: unknown;
2924
+ };
2925
+ content: {
2926
+ "application/json": components["schemas"]["Error"];
2927
+ };
2928
+ };
2929
+ };
2930
+ };
2364
2931
  getFilterState: {
2365
2932
  parameters: {
2366
2933
  query?: never;
@@ -2388,6 +2955,15 @@ export interface operations {
2388
2955
  "application/json": components["schemas"]["Error"];
2389
2956
  };
2390
2957
  };
2958
+ /** @description A personal API token was presented. This endpoint is for a browser session. */
2959
+ 403: {
2960
+ headers: {
2961
+ [name: string]: unknown;
2962
+ };
2963
+ content: {
2964
+ "application/json": components["schemas"]["Error"];
2965
+ };
2966
+ };
2391
2967
  };
2392
2968
  };
2393
2969
  setFilterState: {
@@ -2428,6 +3004,15 @@ export interface operations {
2428
3004
  "application/json": components["schemas"]["Error"];
2429
3005
  };
2430
3006
  };
3007
+ /** @description A personal API token was presented. This endpoint is for a browser session. */
3008
+ 403: {
3009
+ headers: {
3010
+ [name: string]: unknown;
3011
+ };
3012
+ content: {
3013
+ "application/json": components["schemas"]["Error"];
3014
+ };
3015
+ };
2431
3016
  };
2432
3017
  };
2433
3018
  listAPITokens: {
@@ -2581,7 +3166,7 @@ export interface operations {
2581
3166
  [name: string]: unknown;
2582
3167
  };
2583
3168
  content: {
2584
- "application/json": components["schemas"]["Error"];
3169
+ "application/json": components["schemas"]["ActionError"];
2585
3170
  };
2586
3171
  };
2587
3172
  /** @description The forge reported the repo itself doesn't exist (or isn't visible to this token). */
@@ -2590,7 +3175,7 @@ export interface operations {
2590
3175
  [name: string]: unknown;
2591
3176
  };
2592
3177
  content: {
2593
- "application/json": components["schemas"]["Error"];
3178
+ "application/json": components["schemas"]["ActionError"];
2594
3179
  };
2595
3180
  };
2596
3181
  /** @description The forge rate-limited the request. */
@@ -2599,7 +3184,7 @@ export interface operations {
2599
3184
  [name: string]: unknown;
2600
3185
  };
2601
3186
  content: {
2602
- "application/json": components["schemas"]["Error"];
3187
+ "application/json": components["schemas"]["ActionError"];
2603
3188
  };
2604
3189
  };
2605
3190
  /** @description The forge was unreachable, or answered with something this app couldn't classify more specifically. */
@@ -2608,7 +3193,7 @@ export interface operations {
2608
3193
  [name: string]: unknown;
2609
3194
  };
2610
3195
  content: {
2611
- "application/json": components["schemas"]["Error"];
3196
+ "application/json": components["schemas"]["ActionError"];
2612
3197
  };
2613
3198
  };
2614
3199
  };
@@ -2838,10 +3423,15 @@ export interface operations {
2838
3423
  };
2839
3424
  };
2840
3425
  /**
2841
- * @description The forge refused the merge and the pull request's current
2842
- * state says why. `code` is one of `already_merged`,
2843
- * `already_closed`, `not_mergeable`, `conflict`, `behind`,
2844
- * `checks_pending`, `checks_failing` or `blocked_by_protection`.
3426
+ * @description The merge was refused, by this server or by the forge, and the
3427
+ * pull request's state says why. When the pull request is on the
3428
+ * signed-in user's board and its `allowedActions` entry for
3429
+ * `merge` is blocked, this server answers with that entry's `code`
3430
+ * and `message` and never asks the forge. Otherwise the forge
3431
+ * refused and the re-read says why. `code` is one of
3432
+ * `already_merged`, `already_closed`, `not_mergeable`, `conflict`,
3433
+ * `behind`, `checks_pending`, `checks_failing`,
3434
+ * `blocked_by_protection` or `stacked`.
2845
3435
  */
2846
3436
  409: {
2847
3437
  headers: {
@@ -2920,25 +3510,25 @@ export interface operations {
2920
3510
  [name: string]: unknown;
2921
3511
  };
2922
3512
  content: {
2923
- "application/json": components["schemas"]["Error"];
3513
+ "application/json": components["schemas"]["ActionError"];
2924
3514
  };
2925
3515
  };
2926
- /** @description The forge reported the repo or pull request doesn't exist (or isn't visible to this token). */
3516
+ /** @description The forge reported the repo or pull request doesn't exist (or isn't visible to this token). `code` is `unknown`. */
2927
3517
  404: {
2928
3518
  headers: {
2929
3519
  [name: string]: unknown;
2930
3520
  };
2931
3521
  content: {
2932
- "application/json": components["schemas"]["Error"];
3522
+ "application/json": components["schemas"]["ActionError"];
2933
3523
  };
2934
3524
  };
2935
- /** @description The forge rate-limited the request. */
3525
+ /** @description The forge rate-limited the request. `code` is `rate_limited`; `resetsAt` carries when the budget comes back, when the forge said. */
2936
3526
  429: {
2937
3527
  headers: {
2938
3528
  [name: string]: unknown;
2939
3529
  };
2940
3530
  content: {
2941
- "application/json": components["schemas"]["Error"];
3531
+ "application/json": components["schemas"]["ActionError"];
2942
3532
  };
2943
3533
  };
2944
3534
  /** @description The forge was unreachable, or answered with something this app couldn't classify more specifically — including the repo rejecting auto-merge for a reason this app has no more specific status for. */
@@ -2947,7 +3537,7 @@ export interface operations {
2947
3537
  [name: string]: unknown;
2948
3538
  };
2949
3539
  content: {
2950
- "application/json": components["schemas"]["Error"];
3540
+ "application/json": components["schemas"]["ActionError"];
2951
3541
  };
2952
3542
  };
2953
3543
  };
@@ -3001,29 +3591,73 @@ export interface operations {
3001
3591
  [name: string]: unknown;
3002
3592
  };
3003
3593
  content: {
3004
- "application/json": components["schemas"]["Error"];
3594
+ "application/json": components["schemas"]["ActionError"];
3005
3595
  };
3006
3596
  };
3007
- /** @description The forge reported the repo or pull request doesn't exist (or isn't visible to this token). */
3597
+ /** @description The forge reported the repo or pull request doesn't exist (or isn't visible to this token). `code` is `unknown`. */
3008
3598
  404: {
3009
3599
  headers: {
3010
3600
  [name: string]: unknown;
3011
3601
  };
3012
3602
  content: {
3013
- "application/json": components["schemas"]["Error"];
3603
+ "application/json": components["schemas"]["ActionError"];
3014
3604
  };
3015
3605
  };
3016
- /** @description The forge rate-limited the request. */
3606
+ /** @description The forge rate-limited the request. `code` is `rate_limited`; `resetsAt` carries when the budget comes back, when the forge said. */
3017
3607
  429: {
3018
3608
  headers: {
3019
3609
  [name: string]: unknown;
3020
3610
  };
3021
3611
  content: {
3022
- "application/json": components["schemas"]["Error"];
3612
+ "application/json": components["schemas"]["ActionError"];
3023
3613
  };
3024
3614
  };
3025
3615
  /** @description The forge was unreachable, or answered with something this app couldn't classify more specifically. */
3026
3616
  502: {
3617
+ headers: {
3618
+ [name: string]: unknown;
3619
+ };
3620
+ content: {
3621
+ "application/json": components["schemas"]["ActionError"];
3622
+ };
3623
+ };
3624
+ };
3625
+ };
3626
+ rerunPullRequestChecks: {
3627
+ parameters: {
3628
+ query?: never;
3629
+ header?: never;
3630
+ path?: never;
3631
+ cookie?: never;
3632
+ };
3633
+ requestBody: {
3634
+ content: {
3635
+ "application/json": components["schemas"]["PullRequestActionRequest"];
3636
+ };
3637
+ };
3638
+ responses: {
3639
+ /** @description The failed jobs were queued to rerun. */
3640
+ 204: {
3641
+ headers: {
3642
+ [name: string]: unknown;
3643
+ };
3644
+ content?: never;
3645
+ };
3646
+ /**
3647
+ * @description The request body wasn't valid JSON, `fullName` wasn't
3648
+ * "owner/repo", no credentials are saved for that forge, or that
3649
+ * forge's client doesn't support rerunning checks.
3650
+ */
3651
+ 400: {
3652
+ headers: {
3653
+ [name: string]: unknown;
3654
+ };
3655
+ content: {
3656
+ "application/json": components["schemas"]["Error"];
3657
+ };
3658
+ };
3659
+ /** @description No valid session cookie was presented. */
3660
+ 401: {
3027
3661
  headers: {
3028
3662
  [name: string]: unknown;
3029
3663
  };
@@ -3031,6 +3665,51 @@ export interface operations {
3031
3665
  "application/json": components["schemas"]["Error"];
3032
3666
  };
3033
3667
  };
3668
+ /** @description The forge rejected the request as unauthorized. The saved token can't write to Actions on that repo. `code` is `permission`. */
3669
+ 403: {
3670
+ headers: {
3671
+ [name: string]: unknown;
3672
+ };
3673
+ content: {
3674
+ "application/json": components["schemas"]["ActionError"];
3675
+ };
3676
+ };
3677
+ /** @description The forge reported the repo or pull request doesn't exist (or isn't visible to this token). `code` is `unknown`. */
3678
+ 404: {
3679
+ headers: {
3680
+ [name: string]: unknown;
3681
+ };
3682
+ content: {
3683
+ "application/json": components["schemas"]["ActionError"];
3684
+ };
3685
+ };
3686
+ /** @description There is no failed Actions job to rerun ("no failed job to rerun"), or the pull request was already merged or closed. */
3687
+ 409: {
3688
+ headers: {
3689
+ [name: string]: unknown;
3690
+ };
3691
+ content: {
3692
+ "application/json": components["schemas"]["ActionError"];
3693
+ };
3694
+ };
3695
+ /** @description The forge rate-limited the request. `code` is `rate_limited`; `resetsAt` carries when the budget comes back, when the forge said. */
3696
+ 429: {
3697
+ headers: {
3698
+ [name: string]: unknown;
3699
+ };
3700
+ content: {
3701
+ "application/json": components["schemas"]["ActionError"];
3702
+ };
3703
+ };
3704
+ /** @description The forge was unreachable, or answered with something this app couldn't classify more specifically. */
3705
+ 502: {
3706
+ headers: {
3707
+ [name: string]: unknown;
3708
+ };
3709
+ content: {
3710
+ "application/json": components["schemas"]["ActionError"];
3711
+ };
3712
+ };
3034
3713
  };
3035
3714
  };
3036
3715
  updatePullRequestBranch: {
@@ -3089,34 +3768,44 @@ export interface operations {
3089
3768
  [name: string]: unknown;
3090
3769
  };
3091
3770
  content: {
3092
- "application/json": components["schemas"]["Error"];
3771
+ "application/json": components["schemas"]["ActionError"];
3093
3772
  };
3094
3773
  };
3095
- /** @description The forge reported the repo or pull request doesn't exist (or isn't visible to this token). */
3774
+ /** @description The forge reported the repo or pull request doesn't exist (or isn't visible to this token). `code` is `unknown`. */
3096
3775
  404: {
3097
3776
  headers: {
3098
3777
  [name: string]: unknown;
3099
3778
  };
3100
3779
  content: {
3101
- "application/json": components["schemas"]["Error"];
3780
+ "application/json": components["schemas"]["ActionError"];
3102
3781
  };
3103
3782
  };
3104
- /** @description The forge rejected the update because the branches can't be merged cleanly — a real conflict updating would need to resolve by hand. */
3783
+ /**
3784
+ * @description The update was refused. When the pull request is on the
3785
+ * signed-in user's board and its `allowedActions` has no
3786
+ * `update_branch` entry, or a blocked one, this server answers
3787
+ * without asking the forge: the blocked entry's `code` and
3788
+ * `message`, or `already_up_to_date` for a pull request that is not
3789
+ * behind, or `not_mergeable` for one that updates through its
3790
+ * bot's own rebase. Otherwise the forge rejected the update
3791
+ * because the branches can't be merged cleanly: a real conflict
3792
+ * updating would need to resolve by hand.
3793
+ */
3105
3794
  409: {
3106
3795
  headers: {
3107
3796
  [name: string]: unknown;
3108
3797
  };
3109
3798
  content: {
3110
- "application/json": components["schemas"]["Error"];
3799
+ "application/json": components["schemas"]["ActionError"];
3111
3800
  };
3112
3801
  };
3113
- /** @description The forge rate-limited the request. */
3802
+ /** @description The forge rate-limited the request. `code` is `rate_limited`; `resetsAt` carries when the budget comes back, when the forge said. */
3114
3803
  429: {
3115
3804
  headers: {
3116
3805
  [name: string]: unknown;
3117
3806
  };
3118
3807
  content: {
3119
- "application/json": components["schemas"]["Error"];
3808
+ "application/json": components["schemas"]["ActionError"];
3120
3809
  };
3121
3810
  };
3122
3811
  /** @description The forge was unreachable, or answered with something this app couldn't classify more specifically. */
@@ -3125,7 +3814,7 @@ export interface operations {
3125
3814
  [name: string]: unknown;
3126
3815
  };
3127
3816
  content: {
3128
- "application/json": components["schemas"]["Error"];
3817
+ "application/json": components["schemas"]["ActionError"];
3129
3818
  };
3130
3819
  };
3131
3820
  };
@@ -3143,7 +3832,10 @@ export interface operations {
3143
3832
  };
3144
3833
  };
3145
3834
  responses: {
3146
- /** @description Comment posted. */
3835
+ /**
3836
+ * @description Comment posted. The request is recorded as `botRequest` on the
3837
+ * pull request in the next snapshot.
3838
+ */
3147
3839
  204: {
3148
3840
  headers: {
3149
3841
  [name: string]: unknown;
@@ -3179,16 +3871,16 @@ export interface operations {
3179
3871
  [name: string]: unknown;
3180
3872
  };
3181
3873
  content: {
3182
- "application/json": components["schemas"]["Error"];
3874
+ "application/json": components["schemas"]["ActionError"];
3183
3875
  };
3184
3876
  };
3185
- /** @description The forge reported the repo or pull request doesn't exist (or isn't visible to this token). */
3877
+ /** @description The forge reported the repo or pull request doesn't exist (or isn't visible to this token). `code` is `unknown`. */
3186
3878
  404: {
3187
3879
  headers: {
3188
3880
  [name: string]: unknown;
3189
3881
  };
3190
3882
  content: {
3191
- "application/json": components["schemas"]["Error"];
3883
+ "application/json": components["schemas"]["ActionError"];
3192
3884
  };
3193
3885
  };
3194
3886
  /**
@@ -3197,23 +3889,27 @@ export interface operations {
3197
3889
  * the connected GitHub credential is an App with no personal
3198
3890
  * access token saved, and Dependabot ignores App accounts. The
3199
3891
  * error text is ForgeHealth.dependabotCommandsBlocked in the
3200
- * second case. Nothing was posted.
3892
+ * second case. A third case: the pull request is on the
3893
+ * signed-in user's board and its `allowedActions` has no
3894
+ * `dependabot_rebase` or `dependabot_recreate` entry (it isn't a
3895
+ * Dependabot pull request on GitHub), so this server refuses with
3896
+ * `not_mergeable` and never asks the forge. Nothing was posted.
3201
3897
  */
3202
3898
  409: {
3203
3899
  headers: {
3204
3900
  [name: string]: unknown;
3205
3901
  };
3206
3902
  content: {
3207
- "application/json": components["schemas"]["Error"];
3903
+ "application/json": components["schemas"]["ActionError"];
3208
3904
  };
3209
3905
  };
3210
- /** @description The forge rate-limited the request. */
3906
+ /** @description The forge rate-limited the request. `code` is `rate_limited`; `resetsAt` carries when the budget comes back, when the forge said. */
3211
3907
  429: {
3212
3908
  headers: {
3213
3909
  [name: string]: unknown;
3214
3910
  };
3215
3911
  content: {
3216
- "application/json": components["schemas"]["Error"];
3912
+ "application/json": components["schemas"]["ActionError"];
3217
3913
  };
3218
3914
  };
3219
3915
  /** @description The forge was unreachable, or answered with something this app couldn't classify more specifically. */
@@ -3222,7 +3918,7 @@ export interface operations {
3222
3918
  [name: string]: unknown;
3223
3919
  };
3224
3920
  content: {
3225
- "application/json": components["schemas"]["Error"];
3921
+ "application/json": components["schemas"]["ActionError"];
3226
3922
  };
3227
3923
  };
3228
3924
  };
@@ -3240,7 +3936,10 @@ export interface operations {
3240
3936
  };
3241
3937
  };
3242
3938
  responses: {
3243
- /** @description Label added. */
3939
+ /**
3940
+ * @description Label added. The request is recorded as `botRequest` on the pull
3941
+ * request in the next snapshot.
3942
+ */
3244
3943
  204: {
3245
3944
  headers: {
3246
3945
  [name: string]: unknown;
@@ -3276,7 +3975,7 @@ export interface operations {
3276
3975
  [name: string]: unknown;
3277
3976
  };
3278
3977
  content: {
3279
- "application/json": components["schemas"]["Error"];
3978
+ "application/json": components["schemas"]["ActionError"];
3280
3979
  };
3281
3980
  };
3282
3981
  /** @description The forge reported the repo or pull request doesn't exist, or (Forgejo only) the configured label doesn't exist on that repo — Forgejo's labels API takes an existing label's ID, not an arbitrary name, so it has to already be there. */
@@ -3285,16 +3984,31 @@ export interface operations {
3285
3984
  [name: string]: unknown;
3286
3985
  };
3287
3986
  content: {
3288
- "application/json": components["schemas"]["Error"];
3987
+ "application/json": components["schemas"]["ActionError"];
3289
3988
  };
3290
3989
  };
3291
- /** @description The forge rate-limited the request. */
3990
+ /**
3991
+ * @description The pull request is on the signed-in user's board and its
3992
+ * `allowedActions` has no `renovate_rebase` entry (it isn't a
3993
+ * Renovate pull request), so this server refuses with
3994
+ * `not_mergeable` and never asks the forge. The label was not
3995
+ * added.
3996
+ */
3997
+ 409: {
3998
+ headers: {
3999
+ [name: string]: unknown;
4000
+ };
4001
+ content: {
4002
+ "application/json": components["schemas"]["ActionError"];
4003
+ };
4004
+ };
4005
+ /** @description The forge rate-limited the request. `code` is `rate_limited`; `resetsAt` carries when the budget comes back, when the forge said. */
3292
4006
  429: {
3293
4007
  headers: {
3294
4008
  [name: string]: unknown;
3295
4009
  };
3296
4010
  content: {
3297
- "application/json": components["schemas"]["Error"];
4011
+ "application/json": components["schemas"]["ActionError"];
3298
4012
  };
3299
4013
  };
3300
4014
  /** @description The forge was unreachable, or answered with something this app couldn't classify more specifically. */
@@ -3303,7 +4017,7 @@ export interface operations {
3303
4017
  [name: string]: unknown;
3304
4018
  };
3305
4019
  content: {
3306
- "application/json": components["schemas"]["Error"];
4020
+ "application/json": components["schemas"]["ActionError"];
3307
4021
  };
3308
4022
  };
3309
4023
  };
@@ -3790,7 +4504,12 @@ export interface operations {
3790
4504
  };
3791
4505
  requestBody?: never;
3792
4506
  responses: {
3793
- /** @description The server can serve. */
4507
+ /**
4508
+ * @description The server can serve. The body also says how many goroutines and
4509
+ * OS threads the process holds. The container's pids limit counts
4510
+ * threads, so a climb here shows before the healthcheck can no
4511
+ * longer start.
4512
+ */
3794
4513
  200: {
3795
4514
  headers: {
3796
4515
  [name: string]: unknown;
@@ -3798,15 +4517,18 @@ export interface operations {
3798
4517
  content: {
3799
4518
  /**
3800
4519
  * @example {
3801
- * "status": "ok"
4520
+ * "status": "ok",
4521
+ * "goroutines": 42,
4522
+ * "threads": 14
3802
4523
  * }
3803
4524
  */
3804
- "application/json": components["schemas"]["Health"];
4525
+ "application/json": components["schemas"]["Ready"];
3805
4526
  };
3806
4527
  };
3807
4528
  /**
3808
- * @description Not ready yet, or the database is failing. The body carries a
3809
- * short reason only: no paths, no driver errors, no secrets.
4529
+ * @description Not ready yet, the database is failing or slow, or the server is
4530
+ * shutting down. The body carries a short reason only: no paths, no
4531
+ * driver errors, no secrets.
3810
4532
  */
3811
4533
  503: {
3812
4534
  headers: {
@@ -3878,6 +4600,14 @@ export interface operations {
3878
4600
  query?: {
3879
4601
  /** @description A username that has shared their dashboard with the caller. Defaults to the caller's own. */
3880
4602
  owner?: string;
4603
+ /**
4604
+ * @description Whether draft pull requests are in `pullRequests`. Defaults to
4605
+ * `false`: nothing can be merged, auto-merged or updated on a draft,
4606
+ * so a draft is left out and counted in the response's `hiddenDrafts`
4607
+ * instead. The stream and the refresh endpoint take the same
4608
+ * parameter, so every snapshot a client receives follows one rule.
4609
+ */
4610
+ includeDrafts?: components["parameters"]["QueryIncludeDrafts"];
3881
4611
  };
3882
4612
  header?: never;
3883
4613
  path?: never;
@@ -3925,7 +4655,16 @@ export interface operations {
3925
4655
  };
3926
4656
  streamDashboard: {
3927
4657
  parameters: {
3928
- query?: never;
4658
+ query?: {
4659
+ /**
4660
+ * @description Whether draft pull requests are in `pullRequests`. Defaults to
4661
+ * `false`: nothing can be merged, auto-merged or updated on a draft,
4662
+ * so a draft is left out and counted in the response's `hiddenDrafts`
4663
+ * instead. The stream and the refresh endpoint take the same
4664
+ * parameter, so every snapshot a client receives follows one rule.
4665
+ */
4666
+ includeDrafts?: components["parameters"]["QueryIncludeDrafts"];
4667
+ };
3929
4668
  header?: never;
3930
4669
  path?: never;
3931
4670
  cookie?: never;
@@ -3967,7 +4706,16 @@ export interface operations {
3967
4706
  };
3968
4707
  refreshDashboard: {
3969
4708
  parameters: {
3970
- query?: never;
4709
+ query?: {
4710
+ /**
4711
+ * @description Whether draft pull requests are in `pullRequests`. Defaults to
4712
+ * `false`: nothing can be merged, auto-merged or updated on a draft,
4713
+ * so a draft is left out and counted in the response's `hiddenDrafts`
4714
+ * instead. The stream and the refresh endpoint take the same
4715
+ * parameter, so every snapshot a client receives follows one rule.
4716
+ */
4717
+ includeDrafts?: components["parameters"]["QueryIncludeDrafts"];
4718
+ };
3971
4719
  header?: never;
3972
4720
  path?: never;
3973
4721
  cookie?: never;