@forge-dashboard/sdk-node 1.1.0 → 2.0.1

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.
@@ -0,0 +1,3756 @@
1
+ /**
2
+ * This file was auto-generated by openapi-typescript.
3
+ * Do not make direct changes to the file.
4
+ */
5
+ export interface paths {
6
+ "/api/auth/registration-status": {
7
+ parameters: {
8
+ query?: never;
9
+ header?: never;
10
+ path?: never;
11
+ cookie?: never;
12
+ };
13
+ /**
14
+ * Whether self-registration is open
15
+ * @description Unauthenticated — a visitor deciding whether to show the login
16
+ * page's own "Register a new passkey instead" button has no session
17
+ * yet by definition. `open` is true only on a fresh instance with
18
+ * zero registered users; once any account exists, self-registration
19
+ * is closed and every registration after that requires a valid
20
+ * `inviteToken` (see POST /api/auth/register/begin).
21
+ */
22
+ get: operations["getRegistrationStatus"];
23
+ put?: never;
24
+ post?: never;
25
+ delete?: never;
26
+ options?: never;
27
+ head?: never;
28
+ patch?: never;
29
+ trace?: never;
30
+ };
31
+ "/api/auth/register/begin": {
32
+ parameters: {
33
+ query?: never;
34
+ header?: never;
35
+ path?: never;
36
+ cookie?: never;
37
+ };
38
+ get?: never;
39
+ put?: never;
40
+ /**
41
+ * Start a passkey registration ceremony
42
+ * @description The very first registration on a fresh instance (zero registered
43
+ * users — see GET /api/auth/registration-status) needs no
44
+ * `inviteToken` and bootstraps that account as admin. Every
45
+ * registration after that requires a valid, unexpired, unconsumed
46
+ * `inviteToken` issued by an admin (POST /api/admin/invites) for
47
+ * exactly this `username` — the invite's own `displayName` is what's
48
+ * actually used, not this request's.
49
+ */
50
+ post: operations["beginRegistration"];
51
+ delete?: never;
52
+ options?: never;
53
+ head?: never;
54
+ patch?: never;
55
+ trace?: never;
56
+ };
57
+ "/api/auth/register/finish": {
58
+ parameters: {
59
+ query?: never;
60
+ header?: never;
61
+ path?: never;
62
+ cookie?: never;
63
+ };
64
+ get?: never;
65
+ put?: never;
66
+ /** Complete a passkey registration ceremony */
67
+ post: operations["finishRegistration"];
68
+ delete?: never;
69
+ options?: never;
70
+ head?: never;
71
+ patch?: never;
72
+ trace?: never;
73
+ };
74
+ "/api/auth/login/begin": {
75
+ parameters: {
76
+ query?: never;
77
+ header?: never;
78
+ path?: never;
79
+ cookie?: never;
80
+ };
81
+ get?: never;
82
+ put?: never;
83
+ /** Start a passkey login ceremony */
84
+ post: operations["beginLogin"];
85
+ delete?: never;
86
+ options?: never;
87
+ head?: never;
88
+ patch?: never;
89
+ trace?: never;
90
+ };
91
+ "/api/auth/login/finish": {
92
+ parameters: {
93
+ query?: never;
94
+ header?: never;
95
+ path?: never;
96
+ cookie?: never;
97
+ };
98
+ get?: never;
99
+ put?: never;
100
+ /** Complete a passkey login ceremony */
101
+ post: operations["finishLogin"];
102
+ delete?: never;
103
+ options?: never;
104
+ head?: never;
105
+ patch?: never;
106
+ trace?: never;
107
+ };
108
+ "/api/auth/logout": {
109
+ parameters: {
110
+ query?: never;
111
+ header?: never;
112
+ path?: never;
113
+ cookie?: never;
114
+ };
115
+ get?: never;
116
+ put?: never;
117
+ /** End the current session */
118
+ post: operations["logout"];
119
+ delete?: never;
120
+ options?: never;
121
+ head?: never;
122
+ patch?: never;
123
+ trace?: never;
124
+ };
125
+ "/api/auth/session": {
126
+ parameters: {
127
+ query?: never;
128
+ header?: never;
129
+ path?: never;
130
+ cookie?: never;
131
+ };
132
+ /** Who, if anyone, the current session cookie belongs to */
133
+ get: operations["getSession"];
134
+ put?: never;
135
+ post?: never;
136
+ delete?: never;
137
+ options?: never;
138
+ head?: never;
139
+ patch?: never;
140
+ trace?: never;
141
+ };
142
+ "/api/auth/credentials": {
143
+ parameters: {
144
+ query?: never;
145
+ header?: never;
146
+ path?: never;
147
+ cookie?: never;
148
+ };
149
+ /**
150
+ * List the signed-in user's own passkeys
151
+ * @description Every passkey on the account (#355), oldest first — not just the
152
+ * one used to establish the current session.
153
+ */
154
+ get: operations["listCredentials"];
155
+ put?: never;
156
+ post?: never;
157
+ delete?: never;
158
+ options?: never;
159
+ head?: never;
160
+ patch?: never;
161
+ trace?: never;
162
+ };
163
+ "/api/auth/credentials/begin": {
164
+ parameters: {
165
+ query?: never;
166
+ header?: never;
167
+ path?: never;
168
+ cookie?: never;
169
+ };
170
+ get?: never;
171
+ put?: never;
172
+ /**
173
+ * Start a ceremony to add another passkey to the signed-in account
174
+ * @description The authenticated counterpart to POST /api/auth/register/begin —
175
+ * that one only ever works for a brand-new, credential-less
176
+ * account; this is how an already-registered user adds a second
177
+ * (or third...) passkey, e.g. a laptop and a security key (#355).
178
+ */
179
+ post: operations["beginAddCredential"];
180
+ delete?: never;
181
+ options?: never;
182
+ head?: never;
183
+ patch?: never;
184
+ trace?: never;
185
+ };
186
+ "/api/auth/credentials/finish": {
187
+ parameters: {
188
+ query?: never;
189
+ header?: never;
190
+ path?: never;
191
+ cookie?: never;
192
+ };
193
+ get?: never;
194
+ put?: never;
195
+ /** Complete an add-credential ceremony */
196
+ post: operations["finishAddCredential"];
197
+ delete?: never;
198
+ options?: never;
199
+ head?: never;
200
+ patch?: never;
201
+ trace?: never;
202
+ };
203
+ "/api/auth/credentials/{id}": {
204
+ parameters: {
205
+ query?: never;
206
+ header?: never;
207
+ path?: never;
208
+ cookie?: never;
209
+ };
210
+ get?: never;
211
+ put?: never;
212
+ post?: never;
213
+ /**
214
+ * Remove one of the signed-in user's own passkeys
215
+ * @description Refused on the account's last remaining passkey (#355) — this
216
+ * app is WebAuthn-only with no password fallback, so deleting it
217
+ * would lock the account out entirely.
218
+ */
219
+ delete: operations["deleteCredential"];
220
+ options?: never;
221
+ head?: never;
222
+ patch?: never;
223
+ trace?: never;
224
+ };
225
+ "/api/settings": {
226
+ parameters: {
227
+ query?: never;
228
+ header?: never;
229
+ path?: never;
230
+ cookie?: never;
231
+ };
232
+ /**
233
+ * The signed-in user's own forge configuration
234
+ * @description Tokens are never returned, before or after being saved — only
235
+ * whether one is currently on file. There is no way to read a saved
236
+ * token back out through this API.
237
+ */
238
+ get: operations["getSettings"];
239
+ /**
240
+ * Save the signed-in user's forge configuration
241
+ * @description Replaces every field except a blank token, which means "keep
242
+ * whatever's already saved" rather than "clear it" — the only
243
+ * sensible behavior for a field the browser is never shown the
244
+ * current value of. Saving triggers that user's dashboard to start
245
+ * refreshing from the new configuration.
246
+ */
247
+ put: operations["putSettings"];
248
+ post?: never;
249
+ delete?: never;
250
+ options?: never;
251
+ head?: never;
252
+ patch?: never;
253
+ trace?: never;
254
+ };
255
+ "/api/settings/bot-pr-updates": {
256
+ parameters: {
257
+ query?: never;
258
+ header?: never;
259
+ path?: never;
260
+ cookie?: never;
261
+ };
262
+ /**
263
+ * Whether bot-managed pull request branches can be updated
264
+ * @description A lightweight, side-effect-free read of one field —
265
+ * allowBotPrUpdates — for the dashboard page to check on every
266
+ * load. Deliberately not GET /api/settings itself: that handler
267
+ * also provisions webhook credentials on first call
268
+ * (EnsureWebhookCredentials), which the dashboard visiting on a
269
+ * user's behalf shouldn't trigger for someone who's never opened
270
+ * Settings at all.
271
+ */
272
+ get: operations["getBotPrUpdatesSetting"];
273
+ put?: never;
274
+ post?: never;
275
+ delete?: never;
276
+ options?: never;
277
+ head?: never;
278
+ patch?: never;
279
+ trace?: never;
280
+ };
281
+ "/api/settings/theme": {
282
+ parameters: {
283
+ query?: never;
284
+ header?: never;
285
+ path?: never;
286
+ cookie?: never;
287
+ };
288
+ /**
289
+ * The signed-in user's own saved theme preference
290
+ * @description A lightweight, side-effect-free read of one field — theme — for
291
+ * every page to check on load (#352). The same "deliberately not
292
+ * GET /api/settings itself" restraint GET /api/settings/bot-pr-updates
293
+ * already uses, for the same reason: this loads on every page visit
294
+ * and shouldn't provision webhook credentials as a side effect.
295
+ */
296
+ get: operations["getTheme"];
297
+ /**
298
+ * Save the signed-in user's own theme preference
299
+ * @description A dedicated, instant save (#352) — deliberately not routed
300
+ * through the main PUT /api/settings, whose every other field is
301
+ * a plain replace rather than a per-field merge: a request
302
+ * carrying only theme through that handler would blank every
303
+ * other saved setting. Picking a theme applies immediately, the
304
+ * same "set once and forget" convention the ticket's own research
305
+ * cites, rather than waiting on the rest of the settings form's
306
+ * own Save button.
307
+ */
308
+ put: operations["setTheme"];
309
+ post?: never;
310
+ delete?: never;
311
+ options?: never;
312
+ head?: never;
313
+ patch?: never;
314
+ trace?: never;
315
+ };
316
+ "/api/settings/filter-state": {
317
+ parameters: {
318
+ query?: never;
319
+ header?: never;
320
+ path?: never;
321
+ cookie?: never;
322
+ };
323
+ /**
324
+ * The signed-in user's own saved dashboard/Insights filter state
325
+ * @description A lightweight read of one opaque blob (#353), the same
326
+ * "deliberately not GET /api/settings itself" restraint
327
+ * GET /api/settings/bot-pr-updates already uses, for the same
328
+ * reason: this loads on every dashboard/Insights visit and
329
+ * shouldn't provision webhook credentials as a side effect.
330
+ * `{}` for a user who's never saved any filters yet, not a 404.
331
+ */
332
+ get: operations["getFilterState"];
333
+ /**
334
+ * Save the signed-in user's own dashboard/Insights filter state
335
+ * @description A dedicated, lightweight save separate from the main
336
+ * PUT /api/settings — filters change on nearly every click, a
337
+ * mismatch for that endpoint's "always a full form submit"
338
+ * convention (#353). The body replaces the saved state entirely,
339
+ * the same "always a full submit, just of a much smaller and
340
+ * much more frequent thing" shape as the main settings PUT, not a
341
+ * partial patch. Filters.js's own client-side code decides when
342
+ * to call this: immediately for a discrete control, debounced
343
+ * while the user is still typing in the free-text Title filter.
344
+ */
345
+ put: operations["setFilterState"];
346
+ post?: never;
347
+ delete?: never;
348
+ options?: never;
349
+ head?: never;
350
+ patch?: never;
351
+ trace?: never;
352
+ };
353
+ "/api/tokens": {
354
+ parameters: {
355
+ query?: never;
356
+ header?: never;
357
+ path?: never;
358
+ cookie?: never;
359
+ };
360
+ /**
361
+ * List the signed-in user's own personal API tokens
362
+ * @description Metadata only, per APIToken's own description — a raw value never reappears once created.
363
+ */
364
+ get: operations["listAPITokens"];
365
+ put?: never;
366
+ /** Generate a new personal API token */
367
+ post: operations["createAPIToken"];
368
+ delete?: never;
369
+ options?: never;
370
+ head?: never;
371
+ patch?: never;
372
+ trace?: never;
373
+ };
374
+ "/api/tokens/{id}": {
375
+ parameters: {
376
+ query?: never;
377
+ header?: never;
378
+ path?: never;
379
+ cookie?: never;
380
+ };
381
+ get?: never;
382
+ put?: never;
383
+ post?: never;
384
+ /**
385
+ * Revoke a personal API token
386
+ * @description Stops the token authenticating immediately. Idempotent — deleting
387
+ * an id that's already gone (or never belonged to the signed-in
388
+ * user) still answers 204, the same as any other delete-by-id
389
+ * endpoint here (compare DELETE /api/sharing/{username}), so a
390
+ * double-click or a retried request isn't an error.
391
+ */
392
+ delete: operations["deleteAPIToken"];
393
+ options?: never;
394
+ head?: never;
395
+ patch?: never;
396
+ trace?: never;
397
+ };
398
+ "/api/webhooks/ensure": {
399
+ parameters: {
400
+ query?: never;
401
+ header?: never;
402
+ path?: never;
403
+ cookie?: never;
404
+ };
405
+ get?: never;
406
+ put?: never;
407
+ /**
408
+ * Create or fix up a webhook on one tracked repo, on the signed-in user's behalf
409
+ * @description Creates a webhook on the named repo, pointed at the signed-in
410
+ * user's own webhook URL and secret, subscribed to the events
411
+ * docs/webhooks.md's manual steps recommend. If one already exists
412
+ * there (found the same way GET /api/dashboard's own `hasWebhook`
413
+ * does — matching by URL path, not object identity) it's brought
414
+ * back to active with the right events instead of creating a
415
+ * duplicate.
416
+ *
417
+ * One of a small number of endpoints in this API that write to a
418
+ * forge rather than just reading from it — see also the
419
+ * pull-requests tag.
420
+ */
421
+ post: operations["ensureWebhook"];
422
+ delete?: never;
423
+ options?: never;
424
+ head?: never;
425
+ patch?: never;
426
+ trace?: never;
427
+ };
428
+ "/api/repos/ignore": {
429
+ parameters: {
430
+ query?: never;
431
+ header?: never;
432
+ path?: never;
433
+ cookie?: never;
434
+ };
435
+ get?: never;
436
+ put?: never;
437
+ /**
438
+ * Hide one tracked repo's pull requests, issues, or both from the dashboard and Insights
439
+ * @description Reversible, not destructive (#363): the repo itself keeps
440
+ * appearing in GET /api/dashboard's `repos` array with accurate
441
+ * webhook-coverage status, and keeps being fetched and counted —
442
+ * only the pullRequests and/or issues entries the request scopes
443
+ * (#511) stop appearing there and on Insights. A repeat call
444
+ * replaces the previously saved scope rather than merging with it
445
+ * (ignoring PRs only, then issues only, ends with only issues
446
+ * ignored) — idempotent for an identical repeat, not additive
447
+ * across different scopes.
448
+ */
449
+ post: operations["ignoreRepo"];
450
+ delete?: never;
451
+ options?: never;
452
+ head?: never;
453
+ patch?: never;
454
+ trace?: never;
455
+ };
456
+ "/api/repos/unignore": {
457
+ parameters: {
458
+ query?: never;
459
+ header?: never;
460
+ path?: never;
461
+ cookie?: never;
462
+ };
463
+ get?: never;
464
+ put?: never;
465
+ /**
466
+ * Stop ignoring one tracked repo
467
+ * @description The reverse of POST /api/repos/ignore. Idempotent: un-ignoring a
468
+ * repo that was never ignored is a no-op, not an error.
469
+ */
470
+ post: operations["unignoreRepo"];
471
+ delete?: never;
472
+ options?: never;
473
+ head?: never;
474
+ patch?: never;
475
+ trace?: never;
476
+ };
477
+ "/api/repos/auto-update-branch/enable": {
478
+ parameters: {
479
+ query?: never;
480
+ header?: never;
481
+ path?: never;
482
+ cookie?: never;
483
+ };
484
+ get?: never;
485
+ put?: never;
486
+ /**
487
+ * Turn on automatic branch updates for one tracked repo
488
+ * @description Any of this repo's pull requests the background refresh finds
489
+ * behind its base branch gets updated automatically from then on
490
+ * (#365), the same as clicking "Update branch" would — suppressed
491
+ * for a bot-managed pull request unless bot-PR updates are
492
+ * separately allowed. Idempotent: enabling an already-enabled repo
493
+ * is a no-op, not an error.
494
+ */
495
+ post: operations["enableAutoUpdateBranch"];
496
+ delete?: never;
497
+ options?: never;
498
+ head?: never;
499
+ patch?: never;
500
+ trace?: never;
501
+ };
502
+ "/api/repos/auto-update-branch/disable": {
503
+ parameters: {
504
+ query?: never;
505
+ header?: never;
506
+ path?: never;
507
+ cookie?: never;
508
+ };
509
+ get?: never;
510
+ put?: never;
511
+ /**
512
+ * Turn off automatic branch updates for one tracked repo
513
+ * @description The reverse of POST /api/repos/auto-update-branch/enable.
514
+ * Idempotent: disabling a repo that was never enabled is a no-op,
515
+ * not an error.
516
+ */
517
+ post: operations["disableAutoUpdateBranch"];
518
+ delete?: never;
519
+ options?: never;
520
+ head?: never;
521
+ patch?: never;
522
+ trace?: never;
523
+ };
524
+ "/api/pull-requests/merge": {
525
+ parameters: {
526
+ query?: never;
527
+ header?: never;
528
+ path?: never;
529
+ cookie?: never;
530
+ };
531
+ get?: never;
532
+ put?: never;
533
+ /**
534
+ * Merge one pull request, on the signed-in user's behalf
535
+ * @description Merges the named pull request using its repo's own configured
536
+ * default merge method — GitHub is asked to pick its own repo
537
+ * default; Forgejo's API has no such default built in, so this
538
+ * looks up the repo's configured default merge style first and
539
+ * passes that explicitly. Neither takes a method override here;
540
+ * picking one is out of scope for this endpoint.
541
+ */
542
+ post: operations["mergePullRequest"];
543
+ delete?: never;
544
+ options?: never;
545
+ head?: never;
546
+ patch?: never;
547
+ trace?: never;
548
+ };
549
+ "/api/pull-requests/close": {
550
+ parameters: {
551
+ query?: never;
552
+ header?: never;
553
+ path?: never;
554
+ cookie?: never;
555
+ };
556
+ get?: never;
557
+ put?: never;
558
+ /**
559
+ * Close one pull request without merging it, on the signed-in user's behalf
560
+ * @description Closes the named pull request — for one that turns out not to
561
+ * need merging at all (a duplicate, or one whose content already
562
+ * landed another way), not a substitute for Merge.
563
+ */
564
+ post: operations["closePullRequest"];
565
+ delete?: never;
566
+ options?: never;
567
+ head?: never;
568
+ patch?: never;
569
+ trace?: never;
570
+ };
571
+ "/api/pull-requests/update-branch": {
572
+ parameters: {
573
+ query?: never;
574
+ header?: never;
575
+ path?: never;
576
+ cookie?: never;
577
+ };
578
+ get?: never;
579
+ put?: never;
580
+ /**
581
+ * Bring one pull request's branch up to date with its base, on the signed-in user's behalf
582
+ * @description Merges the named pull request's base branch into its own head
583
+ * branch. GitHub can schedule this as a background job rather than
584
+ * finishing it inline — a 202 here means exactly that, not a
585
+ * failure; a follow-up refresh a moment later reflects the result.
586
+ * Forgejo's equivalent is always synchronous, so it only ever
587
+ * answers 204.
588
+ */
589
+ post: operations["updatePullRequestBranch"];
590
+ delete?: never;
591
+ options?: never;
592
+ head?: never;
593
+ patch?: never;
594
+ trace?: never;
595
+ };
596
+ "/api/pull-requests/dependabot-action": {
597
+ parameters: {
598
+ query?: never;
599
+ header?: never;
600
+ path?: never;
601
+ cookie?: never;
602
+ };
603
+ get?: never;
604
+ put?: never;
605
+ /**
606
+ * Post one of Dependabot's own documented PR-comment commands on a pull request, on the signed-in user's behalf
607
+ * @description Posts exactly `@dependabot rebase` or `@dependabot recreate` as a
608
+ * comment on the named pull request — Dependabot's own documented
609
+ * comment-command interface, not a generic "post any comment"
610
+ * endpoint; `action` is validated server-side to one of the two
611
+ * values below and nothing else is ever sent. GitHub only —
612
+ * Dependabot doesn't run on Forgejo.
613
+ */
614
+ post: operations["postPullRequestDependabotAction"];
615
+ delete?: never;
616
+ options?: never;
617
+ head?: never;
618
+ patch?: never;
619
+ trace?: never;
620
+ };
621
+ "/api/pull-requests/renovate-rebase": {
622
+ parameters: {
623
+ query?: never;
624
+ header?: never;
625
+ path?: never;
626
+ cookie?: never;
627
+ };
628
+ get?: never;
629
+ put?: never;
630
+ /**
631
+ * Trigger Renovate's own rebase/retry on a pull request, on the signed-in user's behalf
632
+ * @description Adds the signed-in user's own configured Renovate rebase label
633
+ * (Settings' "Renovate rebase label" field, defaulting to
634
+ * Renovate's own `rebase` if left blank) to the named pull
635
+ * request — Renovate's own documented rebase/retry trigger, which
636
+ * is a label rather than a comment command. Works on both GitHub
637
+ * and Forgejo, unlike the Dependabot actions, since Renovate runs
638
+ * on both.
639
+ */
640
+ post: operations["postPullRequestRenovateRebase"];
641
+ delete?: never;
642
+ options?: never;
643
+ head?: never;
644
+ patch?: never;
645
+ trace?: never;
646
+ };
647
+ "/api/pull-requests/checks": {
648
+ parameters: {
649
+ query?: never;
650
+ header?: never;
651
+ path?: never;
652
+ cookie?: never;
653
+ };
654
+ /**
655
+ * List every job/check run against a pull request's head commit, on demand
656
+ * @description Fetched live on every call, never as part of GET /api/dashboard's
657
+ * own snapshot — this is detail a pull request's row doesn't show
658
+ * until a caller actually asks for it, and adding it to the eager
659
+ * refresh loop would multiply that refresh's cost by every open
660
+ * pull request for data most of them are never opened for.
661
+ *
662
+ * Falls back to the legacy combined commit-status API's own
663
+ * per-check entries when the forge reports no Actions runs at all
664
+ * for that commit (Actions disabled, or an instance too old to
665
+ * expose them) — never an error for that case specifically, since
666
+ * it's a normal, expected shape for an older or CI-less repo.
667
+ */
668
+ get: operations["getPullRequestChecks"];
669
+ put?: never;
670
+ post?: never;
671
+ delete?: never;
672
+ options?: never;
673
+ head?: never;
674
+ patch?: never;
675
+ trace?: never;
676
+ };
677
+ "/api/admin/users": {
678
+ parameters: {
679
+ query?: never;
680
+ header?: never;
681
+ path?: never;
682
+ cookie?: never;
683
+ };
684
+ /**
685
+ * List every registered user
686
+ * @description Never includes a passkey or a forge credential — a username,
687
+ * display name, admin flag and registration timestamp per user.
688
+ */
689
+ get: operations["listUsers"];
690
+ put?: never;
691
+ post?: never;
692
+ delete?: never;
693
+ options?: never;
694
+ head?: never;
695
+ patch?: never;
696
+ trace?: never;
697
+ };
698
+ "/api/admin/users/{username}/revoke": {
699
+ parameters: {
700
+ query?: never;
701
+ header?: never;
702
+ path?: never;
703
+ cookie?: never;
704
+ };
705
+ get?: never;
706
+ put?: never;
707
+ /**
708
+ * Revoke a user's passkeys and sessions
709
+ * @description Deletes every session and every registered passkey for this user —
710
+ * they're signed out everywhere immediately, and have to register a
711
+ * new passkey from scratch to get back in. Their saved forge
712
+ * credentials are untouched; use the delete endpoint to remove the
713
+ * account itself.
714
+ */
715
+ post: operations["revokeUser"];
716
+ delete?: never;
717
+ options?: never;
718
+ head?: never;
719
+ patch?: never;
720
+ trace?: never;
721
+ };
722
+ "/api/admin/users/{username}": {
723
+ parameters: {
724
+ query?: never;
725
+ header?: never;
726
+ path?: never;
727
+ cookie?: never;
728
+ };
729
+ get?: never;
730
+ put?: never;
731
+ post?: never;
732
+ /**
733
+ * Remove a user outright
734
+ * @description Deletes the account, every session, every registered passkey, and
735
+ * every saved forge credential — irreversible. Their username
736
+ * becomes available for a fresh registration.
737
+ */
738
+ delete: operations["deleteUser"];
739
+ options?: never;
740
+ head?: never;
741
+ patch?: never;
742
+ trace?: never;
743
+ };
744
+ "/api/admin/invites": {
745
+ parameters: {
746
+ query?: never;
747
+ header?: never;
748
+ path?: never;
749
+ cookie?: never;
750
+ };
751
+ /**
752
+ * List outstanding registration invites
753
+ * @description Every invite that's neither consumed nor expired — never the raw
754
+ * token, only its own stable id (see AdminInvite).
755
+ */
756
+ get: operations["listInvites"];
757
+ put?: never;
758
+ /**
759
+ * Generate a new single-use registration invite
760
+ * @description The admin picks the username and display name up front — the
761
+ * invitee only completes the WebAuthn ceremony at the link this
762
+ * returns (`/login?invite=<token>`, built client-side). Valid for
763
+ * one hour, fixed.
764
+ */
765
+ post: operations["createInvite"];
766
+ delete?: never;
767
+ options?: never;
768
+ head?: never;
769
+ patch?: never;
770
+ trace?: never;
771
+ };
772
+ "/api/admin/invites/{token}/revoke": {
773
+ parameters: {
774
+ query?: never;
775
+ header?: never;
776
+ path?: never;
777
+ cookie?: never;
778
+ };
779
+ get?: never;
780
+ put?: never;
781
+ /**
782
+ * Revoke an outstanding invite
783
+ * @description Stops the invite's token from ever completing a registration.
784
+ * `token` here is an invite's own `id` (from AdminInvite's own
785
+ * listing), never the raw secret an invitee would use to register —
786
+ * that's AdminInviteCreateResponse's own `token` field, and it's
787
+ * never listed again after creation.
788
+ */
789
+ post: operations["revokeInvite"];
790
+ delete?: never;
791
+ options?: never;
792
+ head?: never;
793
+ patch?: never;
794
+ trace?: never;
795
+ };
796
+ "/healthz": {
797
+ parameters: {
798
+ query?: never;
799
+ header?: never;
800
+ path?: never;
801
+ cookie?: never;
802
+ };
803
+ /**
804
+ * Liveness
805
+ * @description Answers 200 once the server has started. Doesn't reflect whether
806
+ * either forge is reachable — see forges[].reachable on the dashboard
807
+ * response for that.
808
+ */
809
+ get: operations["health"];
810
+ put?: never;
811
+ post?: never;
812
+ delete?: never;
813
+ options?: never;
814
+ head?: never;
815
+ patch?: never;
816
+ trace?: never;
817
+ };
818
+ "/api/version": {
819
+ parameters: {
820
+ query?: never;
821
+ header?: never;
822
+ path?: never;
823
+ cookie?: never;
824
+ };
825
+ /**
826
+ * The running server's own version
827
+ * @description The tag goreleaser stamped the running binary with ("dev" for a
828
+ * build outside the release pipeline). Public and unauthenticated —
829
+ * every page, including the pre-login screen, links to the matching
830
+ * GitHub release from its footer so a person can tell what's
831
+ * actually deployed without shelling into the box.
832
+ */
833
+ get: operations["getVersion"];
834
+ put?: never;
835
+ post?: never;
836
+ delete?: never;
837
+ options?: never;
838
+ head?: never;
839
+ patch?: never;
840
+ trace?: never;
841
+ };
842
+ "/api/dashboard": {
843
+ parameters: {
844
+ query?: never;
845
+ header?: never;
846
+ path?: never;
847
+ cookie?: never;
848
+ };
849
+ /**
850
+ * The aggregated view
851
+ * @description Returns the most recently fetched snapshot. The backend refreshes
852
+ * this on its own schedule in the background; this endpoint never
853
+ * blocks on a live call to either forge, so it answers instantly even
854
+ * when a forge is slow or unreachable.
855
+ *
856
+ * Omitting `owner` returns the signed-in user's own dashboard. Passing
857
+ * it returns that user's dashboard instead — allowed only when they've
858
+ * shared it with the caller (or the caller is viewing their own
859
+ * username), and refused with a 403 otherwise.
860
+ */
861
+ get: operations["getDashboard"];
862
+ put?: never;
863
+ post?: never;
864
+ delete?: never;
865
+ options?: never;
866
+ head?: never;
867
+ patch?: never;
868
+ trace?: never;
869
+ };
870
+ "/api/dashboard/stream": {
871
+ parameters: {
872
+ query?: never;
873
+ header?: never;
874
+ path?: never;
875
+ cookie?: never;
876
+ };
877
+ /**
878
+ * Server-Sent Events stream of the signed-in user's own dashboard
879
+ * @description Pushes a fresh snapshot every time this user's background
880
+ * refresh produces one — most notably right after a verified
881
+ * webhook delivery (see the webhooks tag) triggers an immediate
882
+ * one, which is what turns that into a live update instead of
883
+ * something only the next scheduled refresh picks up.
884
+ *
885
+ * Doesn't support `owner` the way GET /api/dashboard does — only
886
+ * ever the signed-in user's own dashboard, never a shared one.
887
+ * The frontend's own 30-second poll against GET /api/dashboard
888
+ * keeps running unconditionally, connected or not — a browser or
889
+ * proxy that can't hold an SSE connection open just never
890
+ * benefits from this, rather than the dashboard going stale
891
+ * silently.
892
+ */
893
+ get: operations["streamDashboard"];
894
+ put?: never;
895
+ post?: never;
896
+ delete?: never;
897
+ options?: never;
898
+ head?: never;
899
+ patch?: never;
900
+ trace?: never;
901
+ };
902
+ "/api/dashboard/refresh": {
903
+ parameters: {
904
+ query?: never;
905
+ header?: never;
906
+ path?: never;
907
+ cookie?: never;
908
+ };
909
+ get?: never;
910
+ put?: never;
911
+ /**
912
+ * Trigger an immediate refresh of the signed-in user's own dashboard
913
+ * @description Blocks until an immediate, out-of-band refresh of the signed-in
914
+ * user's own dashboard completes, then returns the resulting
915
+ * snapshot — for retrying right away after a forge was only
916
+ * briefly unreachable, instead of waiting for the next scheduled
917
+ * background refresh.
918
+ *
919
+ * Doesn't support `owner` the way GET /api/dashboard does — only
920
+ * ever the signed-in user's own dashboard, never a shared one, so
921
+ * a user with shared access to someone else's dashboard can never
922
+ * spend that owner's own forge rate-limit budget on their own
923
+ * schedule.
924
+ */
925
+ post: operations["refreshDashboard"];
926
+ delete?: never;
927
+ options?: never;
928
+ head?: never;
929
+ patch?: never;
930
+ trace?: never;
931
+ };
932
+ "/api/sharing": {
933
+ parameters: {
934
+ query?: never;
935
+ header?: never;
936
+ path?: never;
937
+ cookie?: never;
938
+ };
939
+ /**
940
+ * The signed-in user's sharing relationships
941
+ * @description Both directions at once: who the signed-in user has shared their
942
+ * own dashboard with, and whose dashboards have been shared with
943
+ * them.
944
+ */
945
+ get: operations["getSharing"];
946
+ put?: never;
947
+ post?: never;
948
+ delete?: never;
949
+ options?: never;
950
+ head?: never;
951
+ patch?: never;
952
+ trace?: never;
953
+ };
954
+ "/api/sharing/{username}": {
955
+ parameters: {
956
+ query?: never;
957
+ header?: never;
958
+ path?: never;
959
+ cookie?: never;
960
+ };
961
+ get?: never;
962
+ /**
963
+ * Share the signed-in user's dashboard with username
964
+ * @description Idempotent — sharing with a username already on the list changes
965
+ * nothing. username needs no tokens of their own configured to view
966
+ * the shared dashboard; they see the owner's aggregated data exactly
967
+ * as the owner sees it.
968
+ */
969
+ put: operations["shareWith"];
970
+ post?: never;
971
+ /**
972
+ * Stop sharing the signed-in user's dashboard with username
973
+ * @description Idempotent — removing a username that was never shared with changes nothing.
974
+ */
975
+ delete: operations["unshareWith"];
976
+ options?: never;
977
+ head?: never;
978
+ patch?: never;
979
+ trace?: never;
980
+ };
981
+ "/api/webhooks/github/{webhookToken}": {
982
+ parameters: {
983
+ query?: never;
984
+ header?: never;
985
+ path?: never;
986
+ cookie?: never;
987
+ };
988
+ get?: never;
989
+ put?: never;
990
+ /**
991
+ * Receive a GitHub repository webhook delivery
992
+ * @description Triggers an immediate refresh for the user webhookToken identifies,
993
+ * once the request's `X-Hub-Signature-256` header is verified against
994
+ * that user's webhook secret. Every delivery GitHub can send for a
995
+ * repository webhook (a new pull request, a closed issue, a status or
996
+ * check-run update, even the `ping` event GitHub sends when the
997
+ * webhook is first created) means the same thing here — something
998
+ * changed, refresh — so nothing about the payload itself is parsed.
999
+ */
1000
+ post: operations["receiveGitHubWebhook"];
1001
+ delete?: never;
1002
+ options?: never;
1003
+ head?: never;
1004
+ patch?: never;
1005
+ trace?: never;
1006
+ };
1007
+ "/api/webhooks/forgejo/{webhookToken}": {
1008
+ parameters: {
1009
+ query?: never;
1010
+ header?: never;
1011
+ path?: never;
1012
+ cookie?: never;
1013
+ };
1014
+ get?: never;
1015
+ put?: never;
1016
+ /**
1017
+ * Receive a Forgejo repository webhook delivery
1018
+ * @description Triggers an immediate refresh for the user webhookToken identifies,
1019
+ * once the request's signature header is verified against that
1020
+ * user's webhook secret — `X-Forgejo-Signature` on a webhook set up
1021
+ * with the "Forgejo" type, `X-Gitea-Signature` on one set up with the
1022
+ * legacy "Gitea" type; both carry the same raw hex HMAC-SHA256. Every
1023
+ * delivery means the same thing here — something changed, refresh —
1024
+ * so nothing about the payload itself is parsed.
1025
+ */
1026
+ post: operations["receiveForgejoWebhook"];
1027
+ delete?: never;
1028
+ options?: never;
1029
+ head?: never;
1030
+ patch?: never;
1031
+ trace?: never;
1032
+ };
1033
+ }
1034
+ export type webhooks = Record<string, never>;
1035
+ export interface components {
1036
+ schemas: {
1037
+ Health: {
1038
+ /** @constant */
1039
+ status: "ok";
1040
+ };
1041
+ Version: {
1042
+ /**
1043
+ * @description The release tag this binary was built from, with no leading
1044
+ * "v" — or "dev" for a build outside the release pipeline.
1045
+ * @example 0.12.1
1046
+ * @example dev
1047
+ */
1048
+ version: string;
1049
+ };
1050
+ Error: {
1051
+ error: string;
1052
+ };
1053
+ RegisterBeginRequest: {
1054
+ /** @example ryan */
1055
+ username: string;
1056
+ /**
1057
+ * @description Ignored once an invite is required (any account already
1058
+ * exists) — the invite's own displayName (set by the admin who
1059
+ * issued it) is what's actually used. Only the very first,
1060
+ * bootstrap registration on a fresh instance takes this value.
1061
+ * @example Ryan
1062
+ */
1063
+ displayName: string;
1064
+ /**
1065
+ * @description Required once any account already exists (see GET
1066
+ * /api/auth/registration-status) — a single-use token from POST
1067
+ * /api/admin/invites, issued for exactly this username. Omitted
1068
+ * or ignored for the very first, bootstrap registration.
1069
+ */
1070
+ inviteToken?: string;
1071
+ };
1072
+ RegistrationStatus: {
1073
+ /** @description True only when the instance has zero registered users. */
1074
+ open: boolean;
1075
+ };
1076
+ LoginBeginRequest: {
1077
+ /** @example ryan */
1078
+ username: string;
1079
+ };
1080
+ /**
1081
+ * @description The WebAuthn specification's own JSON shape for
1082
+ * `PublicKeyCredentialCreationOptions`/`PublicKeyCredentialRequestOptions`
1083
+ * (the begin responses) and `PublicKeyCredential`
1084
+ * (the finish request bodies) — passed through to and from the
1085
+ * browser's own `navigator.credentials` API untouched, so this
1086
+ * contract intentionally doesn't re-model WebAuthn's own schema.
1087
+ */
1088
+ WebAuthnCeremonyOptions: {
1089
+ [key: string]: unknown;
1090
+ };
1091
+ /**
1092
+ * @description The dashboard/Insights filter bar's own saved shape (#353) —
1093
+ * whatever `filters.js`'s `loadState`/`saveState` already produce
1094
+ * client-side (shared forge/repo/label/author/title/created/
1095
+ * updated/groupBy, plus the two board-owned extras with no
1096
+ * equivalent on the other entity type). This server stores and
1097
+ * returns it verbatim, byte for byte, and never parses or
1098
+ * validates its shape — the same "opaque blob, not this layer's
1099
+ * concern" treatment WebAuthnCeremonyOptions above gets, so a
1100
+ * client-side shape change here never needs a matching spec change.
1101
+ */
1102
+ FilterState: {
1103
+ [key: string]: unknown;
1104
+ };
1105
+ SessionUser: {
1106
+ username: string;
1107
+ displayName: string;
1108
+ isAdmin: boolean;
1109
+ };
1110
+ AdminUser: {
1111
+ username: string;
1112
+ displayName: string;
1113
+ isAdmin: boolean;
1114
+ /** Format: date-time */
1115
+ createdAt: string;
1116
+ };
1117
+ /**
1118
+ * @description An outstanding (unconsumed, unexpired) invite's own metadata —
1119
+ * never the raw token, which only AdminInviteCreateResponse ever
1120
+ * carries, once, at creation time.
1121
+ */
1122
+ AdminInvite: {
1123
+ /**
1124
+ * @description The invite's own stable identifier — pass this back to POST
1125
+ * /api/admin/invites/{token}/revoke, not the raw token an
1126
+ * invitee registers with.
1127
+ */
1128
+ id: string;
1129
+ username: string;
1130
+ displayName: string;
1131
+ /** Format: date-time */
1132
+ expiresAt: string;
1133
+ };
1134
+ AdminInviteCreateRequest: {
1135
+ /** @example alex */
1136
+ username: string;
1137
+ /** @example Alex */
1138
+ displayName: string;
1139
+ };
1140
+ /**
1141
+ * @description The one and only response that ever carries the raw invite token
1142
+ * — shown to the admin once, at creation time, for them to copy
1143
+ * into a `/login?invite=<token>` link and hand to the invitee out
1144
+ * of band. Only its hash is stored, so it can't be recovered from
1145
+ * here again.
1146
+ */
1147
+ AdminInviteCreateResponse: {
1148
+ token: string;
1149
+ username: string;
1150
+ displayName: string;
1151
+ /** Format: date-time */
1152
+ expiresAt: string;
1153
+ };
1154
+ SharedUser: {
1155
+ username: string;
1156
+ displayName: string;
1157
+ };
1158
+ SharingResponse: {
1159
+ /** @description Users the signed-in user has shared their own dashboard with. */
1160
+ sharedWith: components["schemas"]["SharedUser"][];
1161
+ /** @description Users who have shared their dashboard with the signed-in user. */
1162
+ sharedWithMe: components["schemas"]["SharedUser"][];
1163
+ };
1164
+ /**
1165
+ * @description The signed-in user's own GitHub/Forgejo configuration. Never
1166
+ * includes a forge token's value — only whether one is currently
1167
+ * saved, so the UI can show a "Configured" badge without the secret
1168
+ * ever reaching the browser. webhookToken/webhookSecret are the
1169
+ * exception: they're ours to hand back in the clear, since the user
1170
+ * has to paste them into the forge's own webhook setup.
1171
+ */
1172
+ SettingsResponse: {
1173
+ /** @description Used as a token-free public-repos fallback when no GitHub token is set. */
1174
+ githubUsername: string;
1175
+ /** @description Whether a GitHub token is currently saved. */
1176
+ githubTokenSet: boolean;
1177
+ forgejoUrl: string;
1178
+ /** @description Used as a token-free public-repos fallback when no Forgejo token is set. */
1179
+ forgejoUsername: string;
1180
+ /** @description Whether a Forgejo token is currently saved. */
1181
+ forgejoTokenSet: boolean;
1182
+ /**
1183
+ * @description Identifies this user in a webhook URL
1184
+ * (`/api/webhooks/{provider}/{webhookToken}`). Generated on
1185
+ * first visit to Settings and stable after that.
1186
+ */
1187
+ webhookToken: string;
1188
+ /**
1189
+ * @description Pasted into the forge's own webhook "Secret" field, used to
1190
+ * verify the signature header on incoming webhook deliveries
1191
+ * (`X-Hub-Signature-256` on GitHub, `X-Forgejo-Signature` on
1192
+ * Forgejo). Never appears in the webhook URL itself.
1193
+ */
1194
+ webhookSecret: string;
1195
+ /**
1196
+ * @description Overrides the default restraint the Update branch/Dependabot/
1197
+ * Renovate action buttons apply to a pull request opened by
1198
+ * release-please, Dependabot, or Renovate — those tools already
1199
+ * keep their own PRs current on their own schedule. False (the
1200
+ * default) leaves bot-managed PRs alone; true treats them the
1201
+ * same as any other PR.
1202
+ */
1203
+ allowBotPrUpdates: boolean;
1204
+ /**
1205
+ * @description The label Renovate's own rebase/retry trigger listens for on
1206
+ * a repo (Renovate's own `rebaseLabel` config option — genuinely
1207
+ * per-repo configurable, so this is a user-set override rather
1208
+ * than a hardcoded constant). Empty means Renovate's own
1209
+ * documented default, `rebase`.
1210
+ */
1211
+ renovateRebaseLabel: string;
1212
+ /**
1213
+ * @description The signed-in user's own theme preference (#352). Empty
1214
+ * means "system" — follow the browser's prefers-color-scheme
1215
+ * rather than a saved choice. Set only from Settings; every
1216
+ * other page reads it via the lightweight
1217
+ * GET /api/settings/theme instead of this endpoint.
1218
+ * @enum {string}
1219
+ */
1220
+ theme: "" | "light" | "dark";
1221
+ };
1222
+ /**
1223
+ * @description Replaces the signed-in user's saved GitHub/Forgejo configuration.
1224
+ * A blank `githubToken` or `forgejoToken` keeps whatever token is
1225
+ * already saved for that forge rather than clearing it — this is
1226
+ * the only way to update the username fields without having to
1227
+ * resubmit a token you don't want to re-paste. Theme isn't
1228
+ * settable here at all — see PUT /api/settings/theme.
1229
+ */
1230
+ SettingsRequest: {
1231
+ githubToken?: string;
1232
+ githubUsername?: string;
1233
+ forgejoUrl?: string;
1234
+ forgejoToken?: string;
1235
+ forgejoUsername?: string;
1236
+ allowBotPrUpdates?: boolean;
1237
+ renovateRebaseLabel?: string;
1238
+ };
1239
+ /** @description See GET /api/settings/bot-pr-updates's own description. */
1240
+ BotPrUpdatesResponse: {
1241
+ allowBotPrUpdates: boolean;
1242
+ };
1243
+ /** @description See GET /api/settings/theme's own description. */
1244
+ ThemeResponse: {
1245
+ /** @enum {string} */
1246
+ theme: "" | "light" | "dark";
1247
+ };
1248
+ /** @description See PUT /api/settings/theme's own description. */
1249
+ ThemeRequest: {
1250
+ /** @enum {string} */
1251
+ theme: "" | "light" | "dark";
1252
+ };
1253
+ /**
1254
+ * @description A registered passkey's own metadata (#355) — never the
1255
+ * credential itself, which never leaves the authenticator that
1256
+ * created it; WebAuthn's whole design is that the server only ever
1257
+ * sees a public key and signed assertions, not a secret to lose.
1258
+ */
1259
+ Credential: {
1260
+ /** @description This passkey's own credential ID (base64url), distinct from the account's user ID. */
1261
+ id: string;
1262
+ /** @description The name given at registration time, so a list of several is tellable apart. */
1263
+ label: string;
1264
+ /** Format: date-time */
1265
+ createdAt: string;
1266
+ };
1267
+ /**
1268
+ * @description A personal API token's own metadata — never the token value
1269
+ * itself, which only ever appears once, in
1270
+ * APITokenCreateResponse's own response body at creation time.
1271
+ */
1272
+ APIToken: {
1273
+ id: string;
1274
+ /** @description The name given at creation time, so a list of several is tellable apart. */
1275
+ label: string;
1276
+ /** Format: date-time */
1277
+ createdAt: string;
1278
+ /**
1279
+ * Format: date-time
1280
+ * @description When this token stops authenticating requests (#356) —
1281
+ * always set, mandatory at creation, no "never expires"
1282
+ * option. A token whose expiration has passed is rejected the
1283
+ * same way an invalid one is.
1284
+ */
1285
+ expiresAt: string;
1286
+ /**
1287
+ * Format: date-time
1288
+ * @description Omitted if this token has never authenticated a request yet.
1289
+ */
1290
+ lastUsedAt?: string;
1291
+ };
1292
+ APITokenCreateRequest: {
1293
+ label: string;
1294
+ /**
1295
+ * Format: date-time
1296
+ * @description Must be in the future and no more than 366 days out (#356,
1297
+ * matching GitHub's own fine-grained-token maximum) — the
1298
+ * Settings UI offers 7/30/60/90-day presets (30 pre-selected)
1299
+ * or a custom date within that same cap, never an option for
1300
+ * no expiration at all.
1301
+ */
1302
+ expiresAt: string;
1303
+ };
1304
+ /**
1305
+ * @description The one and only response that ever carries the raw token value
1306
+ * — shown to the user once, at creation time; only its hash is
1307
+ * stored, so it can't be recovered from here again. Losing it
1308
+ * means generating a new one.
1309
+ */
1310
+ APITokenCreateResponse: {
1311
+ id: string;
1312
+ label: string;
1313
+ /** Format: date-time */
1314
+ createdAt: string;
1315
+ /** Format: date-time */
1316
+ expiresAt: string;
1317
+ /** @description The raw Bearer credential: `Authorization: Bearer <token>`. */
1318
+ token: string;
1319
+ };
1320
+ /** @description Which repo to create or fix up a webhook on. */
1321
+ WebhookEnsureRequest: {
1322
+ forge: components["schemas"]["Forge"];
1323
+ /** @description "owner/repo", matching a Repo.fullName from GET /api/dashboard. */
1324
+ fullName: string;
1325
+ };
1326
+ /**
1327
+ * @description Which repo to ignore, and in which scope(s) (#511). At least one
1328
+ * of prs/issues must be true — a request with both false is
1329
+ * rejected with 400 rather than silently doing nothing; use POST
1330
+ * /api/repos/unignore to clear both at once instead.
1331
+ */
1332
+ RepoIgnoreRequest: {
1333
+ forge: components["schemas"]["Forge"];
1334
+ /** @description "owner/repo", matching a Repo.fullName from GET /api/dashboard. */
1335
+ fullName: string;
1336
+ /** @description Whether to ignore this repo's pull requests. */
1337
+ prs: boolean;
1338
+ /** @description Whether to ignore this repo's issues. */
1339
+ issues: boolean;
1340
+ };
1341
+ /** @description Which pull request to act on. */
1342
+ PullRequestActionRequest: {
1343
+ forge: components["schemas"]["Forge"];
1344
+ /** @description "owner/repo", matching a Repo.fullName from GET /api/dashboard. */
1345
+ fullName: string;
1346
+ /** @description Matching a PullRequest.number from GET /api/dashboard. */
1347
+ number: number;
1348
+ };
1349
+ /** @description Which pull request to act on, and which of Dependabot's own comment commands to send. */
1350
+ PullRequestDependabotActionRequest: {
1351
+ forge: components["schemas"]["Forge"];
1352
+ /** @description "owner/repo", matching a Repo.fullName from GET /api/dashboard. */
1353
+ fullName: string;
1354
+ /** @description Matching a PullRequest.number from GET /api/dashboard. */
1355
+ number: number;
1356
+ /**
1357
+ * @description Which Dependabot comment command to post — "@dependabot rebase" or "@dependabot recreate".
1358
+ * @enum {string}
1359
+ */
1360
+ action: "rebase" | "recreate";
1361
+ };
1362
+ /** @enum {string} */
1363
+ Forge: "github" | "forgejo";
1364
+ /**
1365
+ * @description The combined result across every check reported against the pull
1366
+ * request's head commit. "none" means neither forge reported any
1367
+ * check at all, not that one failed.
1368
+ * @enum {string}
1369
+ */
1370
+ CIStatus: "success" | "failure" | "pending" | "none";
1371
+ /**
1372
+ * @description One job/check's own status — the per-job detail CIStatus
1373
+ * deliberately doesn't carry, since CIStatus is the combined result
1374
+ * across every one of them.
1375
+ * @enum {string}
1376
+ */
1377
+ CheckState: "queued" | "running" | "success" | "failure" | "cancelled" | "skipped" | "timed_out";
1378
+ /** @description One job/check run against a pull request's head commit. */
1379
+ Check: {
1380
+ name: string;
1381
+ state: components["schemas"]["CheckState"];
1382
+ /** @description That job's own page on the forge that ran it — never the pull request's own page. */
1383
+ url: string;
1384
+ };
1385
+ PullRequestChecksResponse: {
1386
+ checks: components["schemas"]["Check"][];
1387
+ };
1388
+ /**
1389
+ * @description A pull request's mergeable/blocked state, as coarse as every forge
1390
+ * this service talks to can agree on. "blocked" covers anything
1391
+ * stopping a merge that isn't confirmed to be a real conflict —
1392
+ * including Forgejo's own mergeable flag reporting false, since its
1393
+ * server computes that asynchronously and can report it stale.
1394
+ * "unknown" covers both a forge that hasn't determined this yet and
1395
+ * this service being unable to determine it.
1396
+ * @enum {string}
1397
+ */
1398
+ MergeStatus: "mergeable" | "conflicting" | "blocked" | "unknown";
1399
+ Label: {
1400
+ /** @example kind/bug */
1401
+ name: string;
1402
+ /**
1403
+ * @description The label's colour as a hex string with no leading "#",
1404
+ * exactly as the forge reports it.
1405
+ * @example d73a4a
1406
+ */
1407
+ color: string;
1408
+ };
1409
+ /**
1410
+ * @description Why a forge is unreachable, or why a write to it was rejected, as
1411
+ * coarse as every forge this service talks to can agree on.
1412
+ * "unauthorized" covers both a bad token and a forbidden request;
1413
+ * "not_found" usually means a wrong instance URL. "conflict" is only
1414
+ * ever returned from a pull-request write — the forge reports the PR
1415
+ * itself isn't currently mergeable. "unknown" covers a signal this
1416
+ * service doesn't recognize, rather than a guessed-at specific cause.
1417
+ * @enum {string}
1418
+ */
1419
+ ForgeErrorKind: "unreachable" | "unauthorized" | "not_found" | "rate_limited" | "conflict" | "unknown";
1420
+ ForgeHealth: {
1421
+ forge: components["schemas"]["Forge"];
1422
+ /** @description Whether the last refresh attempt against this forge succeeded. */
1423
+ reachable: boolean;
1424
+ /** @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. */
1425
+ error?: string;
1426
+ errorKind?: components["schemas"]["ForgeErrorKind"];
1427
+ /** @description Repositories with write access this forge reported. */
1428
+ repoCount: number;
1429
+ /** @description GitHub's GraphQL budget (#361) — a completely separate 5000/hour allowance from rateLimitREST, populated from the rateLimit block GitHub embeds in every GraphQL response. Never set for a forge with no GraphQL API (Forgejo). */
1430
+ rateLimitGraphQL?: components["schemas"]["RateLimit"];
1431
+ /** @description The forge's REST budget, from real X-RateLimit-* response headers. For GitHub, this is checkWebhooks and every write action (merge, update branch, comment, label) — a different 5000/hour allowance from rateLimitGraphQL, not a duplicate of it. Omitted on a poll that made no REST call at all (no webhook path configured). For Forgejo, or any forge reached through GenericSource, this is the only budget there is to report — GenericSource makes exclusively REST-style calls. */
1432
+ rateLimitREST?: components["schemas"]["RateLimit"];
1433
+ };
1434
+ /** @description One of a forge API's own request budgets for the credential the last refresh used — see ForgeHealth.rateLimitGraphQL/rateLimitREST for which budget this is and when each is (or isn't) reported. */
1435
+ RateLimit: {
1436
+ /** @description Requests allowed per window. */
1437
+ limit: number;
1438
+ /** @description Requests left in the current window. */
1439
+ remaining: number;
1440
+ /**
1441
+ * Format: date-time
1442
+ * @description When the window resets and remaining goes back to limit.
1443
+ */
1444
+ resetsAt: string;
1445
+ /** @description The point price the most recent call was actually charged (#440) — 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. */
1446
+ cost?: number;
1447
+ };
1448
+ PullRequest: {
1449
+ forge: components["schemas"]["Forge"];
1450
+ /**
1451
+ * @description Owner-qualified repository name.
1452
+ * @example alrayyes/hush-hush
1453
+ */
1454
+ repo: string;
1455
+ number: number;
1456
+ title: string;
1457
+ /**
1458
+ * Format: uri
1459
+ * @description The real pull request URL on its own forge.
1460
+ */
1461
+ url: string;
1462
+ author: string;
1463
+ draft: boolean;
1464
+ labels: components["schemas"]["Label"][];
1465
+ /** Format: date-time */
1466
+ createdAt: string;
1467
+ /** Format: date-time */
1468
+ updatedAt: string;
1469
+ ci: components["schemas"]["CIStatus"];
1470
+ mergeStatus: components["schemas"]["MergeStatus"];
1471
+ /**
1472
+ * @description Whether this pull request's base branch has moved since its
1473
+ * merge-base was computed. Deliberately its own field rather
1474
+ * than a mergeStatus value: on Forgejo a pull request can be
1475
+ * both mergeable and behind at once (its mergeable flag doesn't
1476
+ * get recomputed just because the base moved), so folding this
1477
+ * into mergeStatus would force picking one and losing the
1478
+ * other.
1479
+ */
1480
+ behind: boolean;
1481
+ /**
1482
+ * @description Whether auto-merge is currently scheduled on this pull request.
1483
+ * Omitted when the owning forge has no way to report this at all
1484
+ * (Forgejo, today) — never false in that case, since this service
1485
+ * genuinely doesn't know.
1486
+ */
1487
+ autoMergeEnabled?: boolean;
1488
+ };
1489
+ Issue: {
1490
+ forge: components["schemas"]["Forge"];
1491
+ /** @example alrayyes/hush-hush */
1492
+ repo: string;
1493
+ number: number;
1494
+ title: string;
1495
+ /**
1496
+ * Format: uri
1497
+ * @description The real issue URL on its own forge.
1498
+ */
1499
+ url: string;
1500
+ author: string;
1501
+ labels: components["schemas"]["Label"][];
1502
+ /** Format: date-time */
1503
+ createdAt: string;
1504
+ /** Format: date-time */
1505
+ updatedAt: string;
1506
+ };
1507
+ Dashboard: {
1508
+ /**
1509
+ * Format: date-time
1510
+ * @description When this snapshot was refreshed, not when it was requested.
1511
+ */
1512
+ generatedAt: string;
1513
+ forges: components["schemas"]["ForgeHealth"][];
1514
+ pullRequests: components["schemas"]["PullRequest"][];
1515
+ issues: components["schemas"]["Issue"][];
1516
+ repos: components["schemas"]["RepoStatus"][];
1517
+ };
1518
+ /**
1519
+ * @description One tracked repository, whether or not it currently has anything
1520
+ * open — repoCount alone can't name it, and it wouldn't otherwise
1521
+ * appear anywhere pullRequests/issues don't already mention it.
1522
+ */
1523
+ RepoStatus: {
1524
+ forge: components["schemas"]["Forge"];
1525
+ /** @example alrayyes/forge-dashboard */
1526
+ fullName: string;
1527
+ /**
1528
+ * Format: uri
1529
+ * @description The repo's own page on its forge, for linking out.
1530
+ * @example https://github.com/alrayyes/forge-dashboard
1531
+ */
1532
+ url: string;
1533
+ /**
1534
+ * @description Whether the signed-in user has ignored this repo in either
1535
+ * scope below (#363, #511) — true whenever ignoredPRs or
1536
+ * ignoredIssues is true. The repo itself still appears here
1537
+ * with accurate hasWebhook/canManageWebhooks regardless.
1538
+ */
1539
+ ignored: boolean;
1540
+ /**
1541
+ * @description Whether the signed-in user has ignored this repo's pull
1542
+ * requests specifically (#511) — its pullRequests entries are
1543
+ * excluded from this same response and from Insights.
1544
+ */
1545
+ ignoredPRs: boolean;
1546
+ /**
1547
+ * @description Whether the signed-in user has ignored this repo's issues
1548
+ * specifically (#511) — its issues entries are excluded from
1549
+ * this same response and from Insights.
1550
+ */
1551
+ ignoredIssues: boolean;
1552
+ /**
1553
+ * @description Whether this app has ever recorded a signature-verified
1554
+ * webhook delivery for this repo. Passive: it reflects a real
1555
+ * delivery having arrived, not whether a webhook object exists
1556
+ * on the forge — a correctly configured webhook that just
1557
+ * hasn't fired yet still reads false here, the same as a
1558
+ * misconfigured one would.
1559
+ */
1560
+ hasWebhook: boolean;
1561
+ /**
1562
+ * @description Whether the signed-in user's own permission on this repo is
1563
+ * enough to list/create its webhooks — GitHub requires admin
1564
+ * specifically (write/maintain can push but still 404 on the
1565
+ * hooks endpoint, by GitHub's own design); Forgejo's equivalent
1566
+ * is its own admin permission flag. Always false for a repo
1567
+ * reached through an unauthenticated, username-only listing.
1568
+ * A point-in-time snapshot: a permission change since the last
1569
+ * refresh can still make a following ensure-webhook call fail
1570
+ * despite this having said true.
1571
+ */
1572
+ canManageWebhooks: boolean;
1573
+ /**
1574
+ * @description Whether the signed-in user has turned on automatic branch
1575
+ * updates for this repo (#365) — any of its pull requests the
1576
+ * background refresh finds behind its base branch gets updated
1577
+ * the same way a manual "Update branch" click would, without
1578
+ * one. Suppressed for a bot-managed pull request (release-please,
1579
+ * Dependabot, Renovate) unless bot-PR updates are separately
1580
+ * allowed (POST /api/settings/bot-pr-updates), the same
1581
+ * restraint the manual button already applies.
1582
+ */
1583
+ autoUpdateBranch: boolean;
1584
+ };
1585
+ };
1586
+ responses: never;
1587
+ parameters: {
1588
+ PathUsername: string;
1589
+ PathWebhookToken: string;
1590
+ PathTokenID: string;
1591
+ };
1592
+ requestBodies: never;
1593
+ headers: never;
1594
+ pathItems: never;
1595
+ }
1596
+ export type $defs = Record<string, never>;
1597
+ export interface operations {
1598
+ getRegistrationStatus: {
1599
+ parameters: {
1600
+ query?: never;
1601
+ header?: never;
1602
+ path?: never;
1603
+ cookie?: never;
1604
+ };
1605
+ requestBody?: never;
1606
+ responses: {
1607
+ /** @description The current registration status. */
1608
+ 200: {
1609
+ headers: {
1610
+ [name: string]: unknown;
1611
+ };
1612
+ content: {
1613
+ "application/json": components["schemas"]["RegistrationStatus"];
1614
+ };
1615
+ };
1616
+ };
1617
+ };
1618
+ beginRegistration: {
1619
+ parameters: {
1620
+ query?: never;
1621
+ header?: never;
1622
+ path?: never;
1623
+ cookie?: never;
1624
+ };
1625
+ requestBody: {
1626
+ content: {
1627
+ "application/json": components["schemas"]["RegisterBeginRequest"];
1628
+ };
1629
+ };
1630
+ responses: {
1631
+ /**
1632
+ * @description WebAuthn credential creation options, passed straight to the
1633
+ * browser's `navigator.credentials.create()`.
1634
+ */
1635
+ 200: {
1636
+ headers: {
1637
+ [name: string]: unknown;
1638
+ };
1639
+ content: {
1640
+ "application/json": components["schemas"]["WebAuthnCeremonyOptions"];
1641
+ };
1642
+ };
1643
+ /**
1644
+ * @description Self-registration is closed (an account already exists) and
1645
+ * no valid, unexpired, unconsumed invite for this username was
1646
+ * presented.
1647
+ */
1648
+ 403: {
1649
+ headers: {
1650
+ [name: string]: unknown;
1651
+ };
1652
+ content: {
1653
+ "application/json": components["schemas"]["Error"];
1654
+ };
1655
+ };
1656
+ /** @description That username is already registered. */
1657
+ 409: {
1658
+ headers: {
1659
+ [name: string]: unknown;
1660
+ };
1661
+ content: {
1662
+ "application/json": components["schemas"]["Error"];
1663
+ };
1664
+ };
1665
+ };
1666
+ };
1667
+ finishRegistration: {
1668
+ parameters: {
1669
+ query: {
1670
+ username: string;
1671
+ };
1672
+ header?: never;
1673
+ path?: never;
1674
+ cookie?: never;
1675
+ };
1676
+ /**
1677
+ * @description The raw response from `navigator.credentials.create()`, exactly as
1678
+ * the browser produced it — forwarded to the server untouched.
1679
+ */
1680
+ requestBody: {
1681
+ content: {
1682
+ "application/json": components["schemas"]["WebAuthnCeremonyOptions"];
1683
+ };
1684
+ };
1685
+ responses: {
1686
+ /** @description Registration succeeded; a session cookie is now set. */
1687
+ 200: {
1688
+ headers: {
1689
+ [name: string]: unknown;
1690
+ };
1691
+ content: {
1692
+ "application/json": components["schemas"]["SessionUser"];
1693
+ };
1694
+ };
1695
+ /** @description The ceremony failed verification, or had already expired. */
1696
+ 400: {
1697
+ headers: {
1698
+ [name: string]: unknown;
1699
+ };
1700
+ content: {
1701
+ "application/json": components["schemas"]["Error"];
1702
+ };
1703
+ };
1704
+ };
1705
+ };
1706
+ beginLogin: {
1707
+ parameters: {
1708
+ query?: never;
1709
+ header?: never;
1710
+ path?: never;
1711
+ cookie?: never;
1712
+ };
1713
+ requestBody: {
1714
+ content: {
1715
+ "application/json": components["schemas"]["LoginBeginRequest"];
1716
+ };
1717
+ };
1718
+ responses: {
1719
+ /**
1720
+ * @description WebAuthn credential request options, passed straight to the
1721
+ * browser's `navigator.credentials.get()`.
1722
+ */
1723
+ 200: {
1724
+ headers: {
1725
+ [name: string]: unknown;
1726
+ };
1727
+ content: {
1728
+ "application/json": components["schemas"]["WebAuthnCeremonyOptions"];
1729
+ };
1730
+ };
1731
+ /** @description No account is registered under that username. */
1732
+ 404: {
1733
+ headers: {
1734
+ [name: string]: unknown;
1735
+ };
1736
+ content: {
1737
+ "application/json": components["schemas"]["Error"];
1738
+ };
1739
+ };
1740
+ };
1741
+ };
1742
+ finishLogin: {
1743
+ parameters: {
1744
+ query: {
1745
+ username: string;
1746
+ };
1747
+ header?: never;
1748
+ path?: never;
1749
+ cookie?: never;
1750
+ };
1751
+ /**
1752
+ * @description The raw response from `navigator.credentials.get()`, exactly as
1753
+ * the browser produced it — forwarded to the server untouched.
1754
+ */
1755
+ requestBody: {
1756
+ content: {
1757
+ "application/json": components["schemas"]["WebAuthnCeremonyOptions"];
1758
+ };
1759
+ };
1760
+ responses: {
1761
+ /** @description Login succeeded; a session cookie is now set. */
1762
+ 200: {
1763
+ headers: {
1764
+ [name: string]: unknown;
1765
+ };
1766
+ content: {
1767
+ "application/json": components["schemas"]["SessionUser"];
1768
+ };
1769
+ };
1770
+ /** @description The ceremony failed verification, or had already expired. */
1771
+ 400: {
1772
+ headers: {
1773
+ [name: string]: unknown;
1774
+ };
1775
+ content: {
1776
+ "application/json": components["schemas"]["Error"];
1777
+ };
1778
+ };
1779
+ };
1780
+ };
1781
+ logout: {
1782
+ parameters: {
1783
+ query?: never;
1784
+ header?: never;
1785
+ path?: never;
1786
+ cookie?: never;
1787
+ };
1788
+ requestBody?: never;
1789
+ responses: {
1790
+ /** @description Logged out; the session cookie is now cleared. */
1791
+ 204: {
1792
+ headers: {
1793
+ [name: string]: unknown;
1794
+ };
1795
+ content?: never;
1796
+ };
1797
+ };
1798
+ };
1799
+ getSession: {
1800
+ parameters: {
1801
+ query?: never;
1802
+ header?: never;
1803
+ path?: never;
1804
+ cookie?: never;
1805
+ };
1806
+ requestBody?: never;
1807
+ responses: {
1808
+ /** @description The current session's user. */
1809
+ 200: {
1810
+ headers: {
1811
+ [name: string]: unknown;
1812
+ };
1813
+ content: {
1814
+ "application/json": components["schemas"]["SessionUser"];
1815
+ };
1816
+ };
1817
+ /** @description No valid session cookie was presented. */
1818
+ 401: {
1819
+ headers: {
1820
+ [name: string]: unknown;
1821
+ };
1822
+ content: {
1823
+ "application/json": components["schemas"]["Error"];
1824
+ };
1825
+ };
1826
+ };
1827
+ };
1828
+ listCredentials: {
1829
+ parameters: {
1830
+ query?: never;
1831
+ header?: never;
1832
+ path?: never;
1833
+ cookie?: never;
1834
+ };
1835
+ requestBody?: never;
1836
+ responses: {
1837
+ /** @description Every registered passkey. */
1838
+ 200: {
1839
+ headers: {
1840
+ [name: string]: unknown;
1841
+ };
1842
+ content: {
1843
+ "application/json": components["schemas"]["Credential"][];
1844
+ };
1845
+ };
1846
+ /** @description No valid session cookie was presented. */
1847
+ 401: {
1848
+ headers: {
1849
+ [name: string]: unknown;
1850
+ };
1851
+ content: {
1852
+ "application/json": components["schemas"]["Error"];
1853
+ };
1854
+ };
1855
+ };
1856
+ };
1857
+ beginAddCredential: {
1858
+ parameters: {
1859
+ query?: never;
1860
+ header?: never;
1861
+ path?: never;
1862
+ cookie?: never;
1863
+ };
1864
+ requestBody?: never;
1865
+ responses: {
1866
+ /**
1867
+ * @description WebAuthn credential creation options, passed straight to the
1868
+ * browser's `navigator.credentials.create()`. `excludeCredentials`
1869
+ * already lists every passkey the account has, so re-registering
1870
+ * the same authenticator is refused by the browser itself.
1871
+ */
1872
+ 200: {
1873
+ headers: {
1874
+ [name: string]: unknown;
1875
+ };
1876
+ content: {
1877
+ "application/json": components["schemas"]["WebAuthnCeremonyOptions"];
1878
+ };
1879
+ };
1880
+ /** @description No valid session cookie was presented. */
1881
+ 401: {
1882
+ headers: {
1883
+ [name: string]: unknown;
1884
+ };
1885
+ content: {
1886
+ "application/json": components["schemas"]["Error"];
1887
+ };
1888
+ };
1889
+ };
1890
+ };
1891
+ finishAddCredential: {
1892
+ parameters: {
1893
+ query: {
1894
+ /**
1895
+ * @description A name the user recognizes, e.g. "MacBook" or "YubiKey"
1896
+ * (#355) — prompted for at registration time, never derived
1897
+ * from the authenticator itself.
1898
+ */
1899
+ label: string;
1900
+ };
1901
+ header?: never;
1902
+ path?: never;
1903
+ cookie?: never;
1904
+ };
1905
+ /**
1906
+ * @description The raw response from `navigator.credentials.create()`, exactly as
1907
+ * the browser produced it — forwarded to the server untouched.
1908
+ */
1909
+ requestBody: {
1910
+ content: {
1911
+ "application/json": components["schemas"]["WebAuthnCeremonyOptions"];
1912
+ };
1913
+ };
1914
+ responses: {
1915
+ /** @description The new passkey is now registered. */
1916
+ 201: {
1917
+ headers: {
1918
+ [name: string]: unknown;
1919
+ };
1920
+ content: {
1921
+ "application/json": components["schemas"]["Credential"];
1922
+ };
1923
+ };
1924
+ /** @description label was blank, or the ceremony failed verification, or had already expired. */
1925
+ 400: {
1926
+ headers: {
1927
+ [name: string]: unknown;
1928
+ };
1929
+ content: {
1930
+ "application/json": components["schemas"]["Error"];
1931
+ };
1932
+ };
1933
+ /** @description No valid session cookie was presented. */
1934
+ 401: {
1935
+ headers: {
1936
+ [name: string]: unknown;
1937
+ };
1938
+ content: {
1939
+ "application/json": components["schemas"]["Error"];
1940
+ };
1941
+ };
1942
+ };
1943
+ };
1944
+ deleteCredential: {
1945
+ parameters: {
1946
+ query?: never;
1947
+ header?: never;
1948
+ path: {
1949
+ id: string;
1950
+ };
1951
+ cookie?: never;
1952
+ };
1953
+ requestBody?: never;
1954
+ responses: {
1955
+ /** @description Removed. */
1956
+ 204: {
1957
+ headers: {
1958
+ [name: string]: unknown;
1959
+ };
1960
+ content?: never;
1961
+ };
1962
+ /** @description This is the account's last remaining passkey. */
1963
+ 400: {
1964
+ headers: {
1965
+ [name: string]: unknown;
1966
+ };
1967
+ content: {
1968
+ "application/json": components["schemas"]["Error"];
1969
+ };
1970
+ };
1971
+ /** @description No valid session cookie was presented. */
1972
+ 401: {
1973
+ headers: {
1974
+ [name: string]: unknown;
1975
+ };
1976
+ content: {
1977
+ "application/json": components["schemas"]["Error"];
1978
+ };
1979
+ };
1980
+ };
1981
+ };
1982
+ getSettings: {
1983
+ parameters: {
1984
+ query?: never;
1985
+ header?: never;
1986
+ path?: never;
1987
+ cookie?: never;
1988
+ };
1989
+ requestBody?: never;
1990
+ responses: {
1991
+ /** @description The current settings. */
1992
+ 200: {
1993
+ headers: {
1994
+ [name: string]: unknown;
1995
+ };
1996
+ content: {
1997
+ "application/json": components["schemas"]["SettingsResponse"];
1998
+ };
1999
+ };
2000
+ /** @description No valid session cookie was presented. */
2001
+ 401: {
2002
+ headers: {
2003
+ [name: string]: unknown;
2004
+ };
2005
+ content: {
2006
+ "application/json": components["schemas"]["Error"];
2007
+ };
2008
+ };
2009
+ };
2010
+ };
2011
+ putSettings: {
2012
+ parameters: {
2013
+ query?: never;
2014
+ header?: never;
2015
+ path?: never;
2016
+ cookie?: never;
2017
+ };
2018
+ requestBody: {
2019
+ content: {
2020
+ "application/json": components["schemas"]["SettingsRequest"];
2021
+ };
2022
+ };
2023
+ responses: {
2024
+ /** @description Saved. */
2025
+ 200: {
2026
+ headers: {
2027
+ [name: string]: unknown;
2028
+ };
2029
+ content: {
2030
+ "application/json": components["schemas"]["SettingsResponse"];
2031
+ };
2032
+ };
2033
+ /**
2034
+ * @description The request body wasn't valid JSON, or a Forgejo token/username
2035
+ * was set with no Forgejo URL — a combination the dashboard can't
2036
+ * use, since the URL is what a token or username connects to.
2037
+ */
2038
+ 400: {
2039
+ headers: {
2040
+ [name: string]: unknown;
2041
+ };
2042
+ content: {
2043
+ "application/json": components["schemas"]["Error"];
2044
+ };
2045
+ };
2046
+ /** @description No valid session cookie was presented. */
2047
+ 401: {
2048
+ headers: {
2049
+ [name: string]: unknown;
2050
+ };
2051
+ content: {
2052
+ "application/json": components["schemas"]["Error"];
2053
+ };
2054
+ };
2055
+ };
2056
+ };
2057
+ getBotPrUpdatesSetting: {
2058
+ parameters: {
2059
+ query?: never;
2060
+ header?: never;
2061
+ path?: never;
2062
+ cookie?: never;
2063
+ };
2064
+ requestBody?: never;
2065
+ responses: {
2066
+ /** @description The current value. */
2067
+ 200: {
2068
+ headers: {
2069
+ [name: string]: unknown;
2070
+ };
2071
+ content: {
2072
+ "application/json": components["schemas"]["BotPrUpdatesResponse"];
2073
+ };
2074
+ };
2075
+ /** @description No valid session cookie was presented. */
2076
+ 401: {
2077
+ headers: {
2078
+ [name: string]: unknown;
2079
+ };
2080
+ content: {
2081
+ "application/json": components["schemas"]["Error"];
2082
+ };
2083
+ };
2084
+ };
2085
+ };
2086
+ getTheme: {
2087
+ parameters: {
2088
+ query?: never;
2089
+ header?: never;
2090
+ path?: never;
2091
+ cookie?: never;
2092
+ };
2093
+ requestBody?: never;
2094
+ responses: {
2095
+ /** @description The current value. */
2096
+ 200: {
2097
+ headers: {
2098
+ [name: string]: unknown;
2099
+ };
2100
+ content: {
2101
+ "application/json": components["schemas"]["ThemeResponse"];
2102
+ };
2103
+ };
2104
+ /** @description No valid session cookie was presented. */
2105
+ 401: {
2106
+ headers: {
2107
+ [name: string]: unknown;
2108
+ };
2109
+ content: {
2110
+ "application/json": components["schemas"]["Error"];
2111
+ };
2112
+ };
2113
+ };
2114
+ };
2115
+ setTheme: {
2116
+ parameters: {
2117
+ query?: never;
2118
+ header?: never;
2119
+ path?: never;
2120
+ cookie?: never;
2121
+ };
2122
+ requestBody: {
2123
+ content: {
2124
+ "application/json": components["schemas"]["ThemeRequest"];
2125
+ };
2126
+ };
2127
+ responses: {
2128
+ /** @description The saved value. */
2129
+ 200: {
2130
+ headers: {
2131
+ [name: string]: unknown;
2132
+ };
2133
+ content: {
2134
+ "application/json": components["schemas"]["ThemeResponse"];
2135
+ };
2136
+ };
2137
+ /** @description theme wasn't "", "light", or "dark". */
2138
+ 400: {
2139
+ headers: {
2140
+ [name: string]: unknown;
2141
+ };
2142
+ content: {
2143
+ "application/json": components["schemas"]["Error"];
2144
+ };
2145
+ };
2146
+ /** @description No valid session cookie was presented. */
2147
+ 401: {
2148
+ headers: {
2149
+ [name: string]: unknown;
2150
+ };
2151
+ content: {
2152
+ "application/json": components["schemas"]["Error"];
2153
+ };
2154
+ };
2155
+ };
2156
+ };
2157
+ getFilterState: {
2158
+ parameters: {
2159
+ query?: never;
2160
+ header?: never;
2161
+ path?: never;
2162
+ cookie?: never;
2163
+ };
2164
+ requestBody?: never;
2165
+ responses: {
2166
+ /** @description The saved state, or `{}` if none has ever been saved. */
2167
+ 200: {
2168
+ headers: {
2169
+ [name: string]: unknown;
2170
+ };
2171
+ content: {
2172
+ "application/json": components["schemas"]["FilterState"];
2173
+ };
2174
+ };
2175
+ /** @description No valid session cookie was presented. */
2176
+ 401: {
2177
+ headers: {
2178
+ [name: string]: unknown;
2179
+ };
2180
+ content: {
2181
+ "application/json": components["schemas"]["Error"];
2182
+ };
2183
+ };
2184
+ };
2185
+ };
2186
+ setFilterState: {
2187
+ parameters: {
2188
+ query?: never;
2189
+ header?: never;
2190
+ path?: never;
2191
+ cookie?: never;
2192
+ };
2193
+ requestBody: {
2194
+ content: {
2195
+ "application/json": components["schemas"]["FilterState"];
2196
+ };
2197
+ };
2198
+ responses: {
2199
+ /** @description Saved. */
2200
+ 204: {
2201
+ headers: {
2202
+ [name: string]: unknown;
2203
+ };
2204
+ content?: never;
2205
+ };
2206
+ /** @description The request body wasn't valid JSON, or exceeded the size this endpoint accepts. */
2207
+ 400: {
2208
+ headers: {
2209
+ [name: string]: unknown;
2210
+ };
2211
+ content: {
2212
+ "application/json": components["schemas"]["Error"];
2213
+ };
2214
+ };
2215
+ /** @description No valid session cookie was presented. */
2216
+ 401: {
2217
+ headers: {
2218
+ [name: string]: unknown;
2219
+ };
2220
+ content: {
2221
+ "application/json": components["schemas"]["Error"];
2222
+ };
2223
+ };
2224
+ };
2225
+ };
2226
+ listAPITokens: {
2227
+ parameters: {
2228
+ query?: never;
2229
+ header?: never;
2230
+ path?: never;
2231
+ cookie?: never;
2232
+ };
2233
+ requestBody?: never;
2234
+ responses: {
2235
+ /** @description Every live token, oldest first. */
2236
+ 200: {
2237
+ headers: {
2238
+ [name: string]: unknown;
2239
+ };
2240
+ content: {
2241
+ "application/json": components["schemas"]["APIToken"][];
2242
+ };
2243
+ };
2244
+ /** @description No valid session cookie was presented. */
2245
+ 401: {
2246
+ headers: {
2247
+ [name: string]: unknown;
2248
+ };
2249
+ content: {
2250
+ "application/json": components["schemas"]["Error"];
2251
+ };
2252
+ };
2253
+ };
2254
+ };
2255
+ createAPIToken: {
2256
+ parameters: {
2257
+ query?: never;
2258
+ header?: never;
2259
+ path?: never;
2260
+ cookie?: never;
2261
+ };
2262
+ requestBody: {
2263
+ content: {
2264
+ "application/json": components["schemas"]["APITokenCreateRequest"];
2265
+ };
2266
+ };
2267
+ responses: {
2268
+ /** @description Created — the only response that ever carries the raw token. */
2269
+ 201: {
2270
+ headers: {
2271
+ [name: string]: unknown;
2272
+ };
2273
+ content: {
2274
+ "application/json": components["schemas"]["APITokenCreateResponse"];
2275
+ };
2276
+ };
2277
+ /**
2278
+ * @description The request body wasn't valid JSON, label was blank, or
2279
+ * expiresAt wasn't in the future or was more than 366 days out.
2280
+ */
2281
+ 400: {
2282
+ headers: {
2283
+ [name: string]: unknown;
2284
+ };
2285
+ content: {
2286
+ "application/json": components["schemas"]["Error"];
2287
+ };
2288
+ };
2289
+ /** @description No valid session cookie was presented. */
2290
+ 401: {
2291
+ headers: {
2292
+ [name: string]: unknown;
2293
+ };
2294
+ content: {
2295
+ "application/json": components["schemas"]["Error"];
2296
+ };
2297
+ };
2298
+ };
2299
+ };
2300
+ deleteAPIToken: {
2301
+ parameters: {
2302
+ query?: never;
2303
+ header?: never;
2304
+ path: {
2305
+ id: components["parameters"]["PathTokenID"];
2306
+ };
2307
+ cookie?: never;
2308
+ };
2309
+ requestBody?: never;
2310
+ responses: {
2311
+ /** @description Revoked (or already gone). */
2312
+ 204: {
2313
+ headers: {
2314
+ [name: string]: unknown;
2315
+ };
2316
+ content?: never;
2317
+ };
2318
+ /** @description No valid session cookie was presented. */
2319
+ 401: {
2320
+ headers: {
2321
+ [name: string]: unknown;
2322
+ };
2323
+ content: {
2324
+ "application/json": components["schemas"]["Error"];
2325
+ };
2326
+ };
2327
+ };
2328
+ };
2329
+ ensureWebhook: {
2330
+ parameters: {
2331
+ query?: never;
2332
+ header?: never;
2333
+ path?: never;
2334
+ cookie?: never;
2335
+ };
2336
+ requestBody: {
2337
+ content: {
2338
+ "application/json": components["schemas"]["WebhookEnsureRequest"];
2339
+ };
2340
+ };
2341
+ responses: {
2342
+ /** @description The webhook now exists and is correctly configured. */
2343
+ 204: {
2344
+ headers: {
2345
+ [name: string]: unknown;
2346
+ };
2347
+ content?: never;
2348
+ };
2349
+ /**
2350
+ * @description The request body wasn't valid JSON, `fullName` wasn't
2351
+ * "owner/repo", no credentials are saved for that forge, or
2352
+ * that forge's client doesn't support managing webhooks at all.
2353
+ */
2354
+ 400: {
2355
+ headers: {
2356
+ [name: string]: unknown;
2357
+ };
2358
+ content: {
2359
+ "application/json": components["schemas"]["Error"];
2360
+ };
2361
+ };
2362
+ /** @description No valid session cookie was presented. */
2363
+ 401: {
2364
+ headers: {
2365
+ [name: string]: unknown;
2366
+ };
2367
+ content: {
2368
+ "application/json": components["schemas"]["Error"];
2369
+ };
2370
+ };
2371
+ /** @description The forge rejected the request as unauthorized — the saved token's scope doesn't cover managing webhooks, or it isn't an admin on that repo. */
2372
+ 403: {
2373
+ headers: {
2374
+ [name: string]: unknown;
2375
+ };
2376
+ content: {
2377
+ "application/json": components["schemas"]["Error"];
2378
+ };
2379
+ };
2380
+ /** @description The forge reported the repo itself doesn't exist (or isn't visible to this token). */
2381
+ 404: {
2382
+ headers: {
2383
+ [name: string]: unknown;
2384
+ };
2385
+ content: {
2386
+ "application/json": components["schemas"]["Error"];
2387
+ };
2388
+ };
2389
+ /** @description The forge rate-limited the request. */
2390
+ 429: {
2391
+ headers: {
2392
+ [name: string]: unknown;
2393
+ };
2394
+ content: {
2395
+ "application/json": components["schemas"]["Error"];
2396
+ };
2397
+ };
2398
+ /** @description The forge was unreachable, or answered with something this app couldn't classify more specifically. */
2399
+ 502: {
2400
+ headers: {
2401
+ [name: string]: unknown;
2402
+ };
2403
+ content: {
2404
+ "application/json": components["schemas"]["Error"];
2405
+ };
2406
+ };
2407
+ };
2408
+ };
2409
+ ignoreRepo: {
2410
+ parameters: {
2411
+ query?: never;
2412
+ header?: never;
2413
+ path?: never;
2414
+ cookie?: never;
2415
+ };
2416
+ requestBody: {
2417
+ content: {
2418
+ "application/json": components["schemas"]["RepoIgnoreRequest"];
2419
+ };
2420
+ };
2421
+ responses: {
2422
+ /** @description The repo is now ignored in the requested scope (or already was). */
2423
+ 204: {
2424
+ headers: {
2425
+ [name: string]: unknown;
2426
+ };
2427
+ content?: never;
2428
+ };
2429
+ /**
2430
+ * @description The request body wasn't valid JSON, `fullName` wasn't
2431
+ * "owner/repo", or both `prs` and `issues` were false.
2432
+ */
2433
+ 400: {
2434
+ headers: {
2435
+ [name: string]: unknown;
2436
+ };
2437
+ content: {
2438
+ "application/json": components["schemas"]["Error"];
2439
+ };
2440
+ };
2441
+ /** @description No valid session cookie was presented. */
2442
+ 401: {
2443
+ headers: {
2444
+ [name: string]: unknown;
2445
+ };
2446
+ content: {
2447
+ "application/json": components["schemas"]["Error"];
2448
+ };
2449
+ };
2450
+ };
2451
+ };
2452
+ unignoreRepo: {
2453
+ parameters: {
2454
+ query?: never;
2455
+ header?: never;
2456
+ path?: never;
2457
+ cookie?: never;
2458
+ };
2459
+ requestBody: {
2460
+ content: {
2461
+ "application/json": components["schemas"]["WebhookEnsureRequest"];
2462
+ };
2463
+ };
2464
+ responses: {
2465
+ /** @description The repo is no longer ignored (or never was). */
2466
+ 204: {
2467
+ headers: {
2468
+ [name: string]: unknown;
2469
+ };
2470
+ content?: never;
2471
+ };
2472
+ /** @description The request body wasn't valid JSON, or `fullName` wasn't "owner/repo". */
2473
+ 400: {
2474
+ headers: {
2475
+ [name: string]: unknown;
2476
+ };
2477
+ content: {
2478
+ "application/json": components["schemas"]["Error"];
2479
+ };
2480
+ };
2481
+ /** @description No valid session cookie was presented. */
2482
+ 401: {
2483
+ headers: {
2484
+ [name: string]: unknown;
2485
+ };
2486
+ content: {
2487
+ "application/json": components["schemas"]["Error"];
2488
+ };
2489
+ };
2490
+ };
2491
+ };
2492
+ enableAutoUpdateBranch: {
2493
+ parameters: {
2494
+ query?: never;
2495
+ header?: never;
2496
+ path?: never;
2497
+ cookie?: never;
2498
+ };
2499
+ requestBody: {
2500
+ content: {
2501
+ "application/json": components["schemas"]["WebhookEnsureRequest"];
2502
+ };
2503
+ };
2504
+ responses: {
2505
+ /** @description Auto-update-branch is now on for this repo (or already was). */
2506
+ 204: {
2507
+ headers: {
2508
+ [name: string]: unknown;
2509
+ };
2510
+ content?: never;
2511
+ };
2512
+ /** @description The request body wasn't valid JSON, or `fullName` wasn't "owner/repo". */
2513
+ 400: {
2514
+ headers: {
2515
+ [name: string]: unknown;
2516
+ };
2517
+ content: {
2518
+ "application/json": components["schemas"]["Error"];
2519
+ };
2520
+ };
2521
+ /** @description No valid session cookie was presented. */
2522
+ 401: {
2523
+ headers: {
2524
+ [name: string]: unknown;
2525
+ };
2526
+ content: {
2527
+ "application/json": components["schemas"]["Error"];
2528
+ };
2529
+ };
2530
+ };
2531
+ };
2532
+ disableAutoUpdateBranch: {
2533
+ parameters: {
2534
+ query?: never;
2535
+ header?: never;
2536
+ path?: never;
2537
+ cookie?: never;
2538
+ };
2539
+ requestBody: {
2540
+ content: {
2541
+ "application/json": components["schemas"]["WebhookEnsureRequest"];
2542
+ };
2543
+ };
2544
+ responses: {
2545
+ /** @description Auto-update-branch is now off for this repo (or never was on). */
2546
+ 204: {
2547
+ headers: {
2548
+ [name: string]: unknown;
2549
+ };
2550
+ content?: never;
2551
+ };
2552
+ /** @description The request body wasn't valid JSON, or `fullName` wasn't "owner/repo". */
2553
+ 400: {
2554
+ headers: {
2555
+ [name: string]: unknown;
2556
+ };
2557
+ content: {
2558
+ "application/json": components["schemas"]["Error"];
2559
+ };
2560
+ };
2561
+ /** @description No valid session cookie was presented. */
2562
+ 401: {
2563
+ headers: {
2564
+ [name: string]: unknown;
2565
+ };
2566
+ content: {
2567
+ "application/json": components["schemas"]["Error"];
2568
+ };
2569
+ };
2570
+ };
2571
+ };
2572
+ mergePullRequest: {
2573
+ parameters: {
2574
+ query?: never;
2575
+ header?: never;
2576
+ path?: never;
2577
+ cookie?: never;
2578
+ };
2579
+ requestBody: {
2580
+ content: {
2581
+ "application/json": components["schemas"]["PullRequestActionRequest"];
2582
+ };
2583
+ };
2584
+ responses: {
2585
+ /** @description Merged. */
2586
+ 204: {
2587
+ headers: {
2588
+ [name: string]: unknown;
2589
+ };
2590
+ content?: never;
2591
+ };
2592
+ /**
2593
+ * @description The request body wasn't valid JSON, `fullName` wasn't
2594
+ * "owner/repo", no credentials are saved for that forge, or
2595
+ * that forge's client doesn't support merging pull requests at
2596
+ * all.
2597
+ */
2598
+ 400: {
2599
+ headers: {
2600
+ [name: string]: unknown;
2601
+ };
2602
+ content: {
2603
+ "application/json": components["schemas"]["Error"];
2604
+ };
2605
+ };
2606
+ /** @description No valid session cookie was presented. */
2607
+ 401: {
2608
+ headers: {
2609
+ [name: string]: unknown;
2610
+ };
2611
+ content: {
2612
+ "application/json": components["schemas"]["Error"];
2613
+ };
2614
+ };
2615
+ /** @description The forge rejected the request as unauthorized — the saved token's scope doesn't cover merging, or it isn't allowed to merge on that repo. */
2616
+ 403: {
2617
+ headers: {
2618
+ [name: string]: unknown;
2619
+ };
2620
+ content: {
2621
+ "application/json": components["schemas"]["Error"];
2622
+ };
2623
+ };
2624
+ /** @description The forge reported the repo or pull request doesn't exist (or isn't visible to this token). */
2625
+ 404: {
2626
+ headers: {
2627
+ [name: string]: unknown;
2628
+ };
2629
+ content: {
2630
+ "application/json": components["schemas"]["Error"];
2631
+ };
2632
+ };
2633
+ /** @description The forge rejected the merge because the pull request isn't currently mergeable — a real conflict, or its state changed since the dashboard's last refresh. */
2634
+ 409: {
2635
+ headers: {
2636
+ [name: string]: unknown;
2637
+ };
2638
+ content: {
2639
+ "application/json": components["schemas"]["Error"];
2640
+ };
2641
+ };
2642
+ /** @description The forge rate-limited the request. */
2643
+ 429: {
2644
+ headers: {
2645
+ [name: string]: unknown;
2646
+ };
2647
+ content: {
2648
+ "application/json": components["schemas"]["Error"];
2649
+ };
2650
+ };
2651
+ /** @description The forge was unreachable, or answered with something this app couldn't classify more specifically. */
2652
+ 502: {
2653
+ headers: {
2654
+ [name: string]: unknown;
2655
+ };
2656
+ content: {
2657
+ "application/json": components["schemas"]["Error"];
2658
+ };
2659
+ };
2660
+ };
2661
+ };
2662
+ closePullRequest: {
2663
+ parameters: {
2664
+ query?: never;
2665
+ header?: never;
2666
+ path?: never;
2667
+ cookie?: never;
2668
+ };
2669
+ requestBody: {
2670
+ content: {
2671
+ "application/json": components["schemas"]["PullRequestActionRequest"];
2672
+ };
2673
+ };
2674
+ responses: {
2675
+ /** @description Closed. */
2676
+ 204: {
2677
+ headers: {
2678
+ [name: string]: unknown;
2679
+ };
2680
+ content?: never;
2681
+ };
2682
+ /**
2683
+ * @description The request body wasn't valid JSON, `fullName` wasn't
2684
+ * "owner/repo", no credentials are saved for that forge, or
2685
+ * that forge's client doesn't support closing pull requests at
2686
+ * all.
2687
+ */
2688
+ 400: {
2689
+ headers: {
2690
+ [name: string]: unknown;
2691
+ };
2692
+ content: {
2693
+ "application/json": components["schemas"]["Error"];
2694
+ };
2695
+ };
2696
+ /** @description No valid session cookie was presented. */
2697
+ 401: {
2698
+ headers: {
2699
+ [name: string]: unknown;
2700
+ };
2701
+ content: {
2702
+ "application/json": components["schemas"]["Error"];
2703
+ };
2704
+ };
2705
+ /** @description The forge rejected the request as unauthorized — the saved token's scope doesn't cover closing, or it isn't allowed to close on that repo. */
2706
+ 403: {
2707
+ headers: {
2708
+ [name: string]: unknown;
2709
+ };
2710
+ content: {
2711
+ "application/json": components["schemas"]["Error"];
2712
+ };
2713
+ };
2714
+ /** @description The forge reported the repo or pull request doesn't exist (or isn't visible to this token). */
2715
+ 404: {
2716
+ headers: {
2717
+ [name: string]: unknown;
2718
+ };
2719
+ content: {
2720
+ "application/json": components["schemas"]["Error"];
2721
+ };
2722
+ };
2723
+ /** @description The forge rate-limited the request. */
2724
+ 429: {
2725
+ headers: {
2726
+ [name: string]: unknown;
2727
+ };
2728
+ content: {
2729
+ "application/json": components["schemas"]["Error"];
2730
+ };
2731
+ };
2732
+ /** @description The forge was unreachable, or answered with something this app couldn't classify more specifically. */
2733
+ 502: {
2734
+ headers: {
2735
+ [name: string]: unknown;
2736
+ };
2737
+ content: {
2738
+ "application/json": components["schemas"]["Error"];
2739
+ };
2740
+ };
2741
+ };
2742
+ };
2743
+ updatePullRequestBranch: {
2744
+ parameters: {
2745
+ query?: never;
2746
+ header?: never;
2747
+ path?: never;
2748
+ cookie?: never;
2749
+ };
2750
+ requestBody: {
2751
+ content: {
2752
+ "application/json": components["schemas"]["PullRequestActionRequest"];
2753
+ };
2754
+ };
2755
+ responses: {
2756
+ /** @description The forge scheduled the update as a background job rather than finishing it inline. Not a failure — a follow-up refresh reflects the result once it lands. */
2757
+ 202: {
2758
+ headers: {
2759
+ [name: string]: unknown;
2760
+ };
2761
+ content?: never;
2762
+ };
2763
+ /** @description Updated. */
2764
+ 204: {
2765
+ headers: {
2766
+ [name: string]: unknown;
2767
+ };
2768
+ content?: never;
2769
+ };
2770
+ /**
2771
+ * @description The request body wasn't valid JSON, `fullName` wasn't
2772
+ * "owner/repo", no credentials are saved for that forge, or
2773
+ * that forge's client doesn't support updating pull request
2774
+ * branches at all.
2775
+ */
2776
+ 400: {
2777
+ headers: {
2778
+ [name: string]: unknown;
2779
+ };
2780
+ content: {
2781
+ "application/json": components["schemas"]["Error"];
2782
+ };
2783
+ };
2784
+ /** @description No valid session cookie was presented. */
2785
+ 401: {
2786
+ headers: {
2787
+ [name: string]: unknown;
2788
+ };
2789
+ content: {
2790
+ "application/json": components["schemas"]["Error"];
2791
+ };
2792
+ };
2793
+ /** @description The forge rejected the request as unauthorized — the saved token's scope doesn't cover updating the branch, or it isn't allowed to push on that repo. */
2794
+ 403: {
2795
+ headers: {
2796
+ [name: string]: unknown;
2797
+ };
2798
+ content: {
2799
+ "application/json": components["schemas"]["Error"];
2800
+ };
2801
+ };
2802
+ /** @description The forge reported the repo or pull request doesn't exist (or isn't visible to this token). */
2803
+ 404: {
2804
+ headers: {
2805
+ [name: string]: unknown;
2806
+ };
2807
+ content: {
2808
+ "application/json": components["schemas"]["Error"];
2809
+ };
2810
+ };
2811
+ /** @description The forge rejected the update because the branches can't be merged cleanly — a real conflict updating would need to resolve by hand. */
2812
+ 409: {
2813
+ headers: {
2814
+ [name: string]: unknown;
2815
+ };
2816
+ content: {
2817
+ "application/json": components["schemas"]["Error"];
2818
+ };
2819
+ };
2820
+ /** @description The forge rate-limited the request. */
2821
+ 429: {
2822
+ headers: {
2823
+ [name: string]: unknown;
2824
+ };
2825
+ content: {
2826
+ "application/json": components["schemas"]["Error"];
2827
+ };
2828
+ };
2829
+ /** @description The forge was unreachable, or answered with something this app couldn't classify more specifically. */
2830
+ 502: {
2831
+ headers: {
2832
+ [name: string]: unknown;
2833
+ };
2834
+ content: {
2835
+ "application/json": components["schemas"]["Error"];
2836
+ };
2837
+ };
2838
+ };
2839
+ };
2840
+ postPullRequestDependabotAction: {
2841
+ parameters: {
2842
+ query?: never;
2843
+ header?: never;
2844
+ path?: never;
2845
+ cookie?: never;
2846
+ };
2847
+ requestBody: {
2848
+ content: {
2849
+ "application/json": components["schemas"]["PullRequestDependabotActionRequest"];
2850
+ };
2851
+ };
2852
+ responses: {
2853
+ /** @description Comment posted. */
2854
+ 204: {
2855
+ headers: {
2856
+ [name: string]: unknown;
2857
+ };
2858
+ content?: never;
2859
+ };
2860
+ /**
2861
+ * @description The request body wasn't valid JSON, `action` wasn't "rebase"
2862
+ * or "recreate", `fullName` wasn't "owner/repo", no credentials
2863
+ * are saved for that forge, or that forge's client doesn't
2864
+ * support commenting on pull requests at all.
2865
+ */
2866
+ 400: {
2867
+ headers: {
2868
+ [name: string]: unknown;
2869
+ };
2870
+ content: {
2871
+ "application/json": components["schemas"]["Error"];
2872
+ };
2873
+ };
2874
+ /** @description No valid session cookie was presented. */
2875
+ 401: {
2876
+ headers: {
2877
+ [name: string]: unknown;
2878
+ };
2879
+ content: {
2880
+ "application/json": components["schemas"]["Error"];
2881
+ };
2882
+ };
2883
+ /** @description The forge rejected the request as unauthorized — the saved token's scope doesn't cover commenting, or it isn't allowed to comment on that repo. */
2884
+ 403: {
2885
+ headers: {
2886
+ [name: string]: unknown;
2887
+ };
2888
+ content: {
2889
+ "application/json": components["schemas"]["Error"];
2890
+ };
2891
+ };
2892
+ /** @description The forge reported the repo or pull request doesn't exist (or isn't visible to this token). */
2893
+ 404: {
2894
+ headers: {
2895
+ [name: string]: unknown;
2896
+ };
2897
+ content: {
2898
+ "application/json": components["schemas"]["Error"];
2899
+ };
2900
+ };
2901
+ /** @description The forge rejected the comment because of the pull request's current state. */
2902
+ 409: {
2903
+ headers: {
2904
+ [name: string]: unknown;
2905
+ };
2906
+ content: {
2907
+ "application/json": components["schemas"]["Error"];
2908
+ };
2909
+ };
2910
+ /** @description The forge rate-limited the request. */
2911
+ 429: {
2912
+ headers: {
2913
+ [name: string]: unknown;
2914
+ };
2915
+ content: {
2916
+ "application/json": components["schemas"]["Error"];
2917
+ };
2918
+ };
2919
+ /** @description The forge was unreachable, or answered with something this app couldn't classify more specifically. */
2920
+ 502: {
2921
+ headers: {
2922
+ [name: string]: unknown;
2923
+ };
2924
+ content: {
2925
+ "application/json": components["schemas"]["Error"];
2926
+ };
2927
+ };
2928
+ };
2929
+ };
2930
+ postPullRequestRenovateRebase: {
2931
+ parameters: {
2932
+ query?: never;
2933
+ header?: never;
2934
+ path?: never;
2935
+ cookie?: never;
2936
+ };
2937
+ requestBody: {
2938
+ content: {
2939
+ "application/json": components["schemas"]["PullRequestActionRequest"];
2940
+ };
2941
+ };
2942
+ responses: {
2943
+ /** @description Label added. */
2944
+ 204: {
2945
+ headers: {
2946
+ [name: string]: unknown;
2947
+ };
2948
+ content?: never;
2949
+ };
2950
+ /**
2951
+ * @description The request body wasn't valid JSON, `fullName` wasn't
2952
+ * "owner/repo", no credentials are saved for that forge, or
2953
+ * that forge's client doesn't support labeling pull requests
2954
+ * at all.
2955
+ */
2956
+ 400: {
2957
+ headers: {
2958
+ [name: string]: unknown;
2959
+ };
2960
+ content: {
2961
+ "application/json": components["schemas"]["Error"];
2962
+ };
2963
+ };
2964
+ /** @description No valid session cookie was presented. */
2965
+ 401: {
2966
+ headers: {
2967
+ [name: string]: unknown;
2968
+ };
2969
+ content: {
2970
+ "application/json": components["schemas"]["Error"];
2971
+ };
2972
+ };
2973
+ /** @description The forge rejected the request as unauthorized — the saved token's scope doesn't cover labeling, or it isn't allowed to label on that repo. */
2974
+ 403: {
2975
+ headers: {
2976
+ [name: string]: unknown;
2977
+ };
2978
+ content: {
2979
+ "application/json": components["schemas"]["Error"];
2980
+ };
2981
+ };
2982
+ /** @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. */
2983
+ 404: {
2984
+ headers: {
2985
+ [name: string]: unknown;
2986
+ };
2987
+ content: {
2988
+ "application/json": components["schemas"]["Error"];
2989
+ };
2990
+ };
2991
+ /** @description The forge rate-limited the request. */
2992
+ 429: {
2993
+ headers: {
2994
+ [name: string]: unknown;
2995
+ };
2996
+ content: {
2997
+ "application/json": components["schemas"]["Error"];
2998
+ };
2999
+ };
3000
+ /** @description The forge was unreachable, or answered with something this app couldn't classify more specifically. */
3001
+ 502: {
3002
+ headers: {
3003
+ [name: string]: unknown;
3004
+ };
3005
+ content: {
3006
+ "application/json": components["schemas"]["Error"];
3007
+ };
3008
+ };
3009
+ };
3010
+ };
3011
+ getPullRequestChecks: {
3012
+ parameters: {
3013
+ query: {
3014
+ forge: components["schemas"]["Forge"];
3015
+ /** @description "owner/repo", matching a Repo.fullName from GET /api/dashboard. */
3016
+ fullName: string;
3017
+ /** @description Matching a PullRequest.number from GET /api/dashboard. */
3018
+ number: number;
3019
+ };
3020
+ header?: never;
3021
+ path?: never;
3022
+ cookie?: never;
3023
+ };
3024
+ requestBody?: never;
3025
+ responses: {
3026
+ /** @description Every check/job found for that commit — empty when none were. */
3027
+ 200: {
3028
+ headers: {
3029
+ [name: string]: unknown;
3030
+ };
3031
+ content: {
3032
+ "application/json": components["schemas"]["PullRequestChecksResponse"];
3033
+ };
3034
+ };
3035
+ /** @description `number` wasn't an integer, `fullName` wasn't "owner/repo", no credentials are saved for that forge, or that forge's client doesn't support listing pull request checks at all. */
3036
+ 400: {
3037
+ headers: {
3038
+ [name: string]: unknown;
3039
+ };
3040
+ content: {
3041
+ "application/json": components["schemas"]["Error"];
3042
+ };
3043
+ };
3044
+ /** @description No valid session cookie was presented. */
3045
+ 401: {
3046
+ headers: {
3047
+ [name: string]: unknown;
3048
+ };
3049
+ content: {
3050
+ "application/json": components["schemas"]["Error"];
3051
+ };
3052
+ };
3053
+ /** @description The forge rejected the request as unauthorized — the saved token's scope doesn't cover reading checks, or it isn't allowed to see that repo. */
3054
+ 403: {
3055
+ headers: {
3056
+ [name: string]: unknown;
3057
+ };
3058
+ content: {
3059
+ "application/json": components["schemas"]["Error"];
3060
+ };
3061
+ };
3062
+ /** @description The forge reported the repo or pull request doesn't exist (or isn't visible to this token). */
3063
+ 404: {
3064
+ headers: {
3065
+ [name: string]: unknown;
3066
+ };
3067
+ content: {
3068
+ "application/json": components["schemas"]["Error"];
3069
+ };
3070
+ };
3071
+ /** @description The forge rate-limited the request. */
3072
+ 429: {
3073
+ headers: {
3074
+ [name: string]: unknown;
3075
+ };
3076
+ content: {
3077
+ "application/json": components["schemas"]["Error"];
3078
+ };
3079
+ };
3080
+ /** @description The forge was unreachable, or answered with something this app couldn't classify more specifically. */
3081
+ 502: {
3082
+ headers: {
3083
+ [name: string]: unknown;
3084
+ };
3085
+ content: {
3086
+ "application/json": components["schemas"]["Error"];
3087
+ };
3088
+ };
3089
+ };
3090
+ };
3091
+ listUsers: {
3092
+ parameters: {
3093
+ query?: never;
3094
+ header?: never;
3095
+ path?: never;
3096
+ cookie?: never;
3097
+ };
3098
+ requestBody?: never;
3099
+ responses: {
3100
+ /** @description Every registered user. */
3101
+ 200: {
3102
+ headers: {
3103
+ [name: string]: unknown;
3104
+ };
3105
+ content: {
3106
+ "application/json": components["schemas"]["AdminUser"][];
3107
+ };
3108
+ };
3109
+ /** @description No valid session cookie was presented. */
3110
+ 401: {
3111
+ headers: {
3112
+ [name: string]: unknown;
3113
+ };
3114
+ content: {
3115
+ "application/json": components["schemas"]["Error"];
3116
+ };
3117
+ };
3118
+ /** @description The signed-in user isn't the designated admin. */
3119
+ 403: {
3120
+ headers: {
3121
+ [name: string]: unknown;
3122
+ };
3123
+ content: {
3124
+ "application/json": components["schemas"]["Error"];
3125
+ };
3126
+ };
3127
+ };
3128
+ };
3129
+ revokeUser: {
3130
+ parameters: {
3131
+ query?: never;
3132
+ header?: never;
3133
+ path: {
3134
+ username: components["parameters"]["PathUsername"];
3135
+ };
3136
+ cookie?: never;
3137
+ };
3138
+ requestBody?: never;
3139
+ responses: {
3140
+ /** @description Revoked. */
3141
+ 204: {
3142
+ headers: {
3143
+ [name: string]: unknown;
3144
+ };
3145
+ content?: never;
3146
+ };
3147
+ /** @description An admin can't revoke their own account through this endpoint. */
3148
+ 400: {
3149
+ headers: {
3150
+ [name: string]: unknown;
3151
+ };
3152
+ content: {
3153
+ "application/json": components["schemas"]["Error"];
3154
+ };
3155
+ };
3156
+ /** @description No valid session cookie was presented. */
3157
+ 401: {
3158
+ headers: {
3159
+ [name: string]: unknown;
3160
+ };
3161
+ content: {
3162
+ "application/json": components["schemas"]["Error"];
3163
+ };
3164
+ };
3165
+ /** @description The signed-in user isn't the designated admin. */
3166
+ 403: {
3167
+ headers: {
3168
+ [name: string]: unknown;
3169
+ };
3170
+ content: {
3171
+ "application/json": components["schemas"]["Error"];
3172
+ };
3173
+ };
3174
+ /** @description No user is registered under that username. */
3175
+ 404: {
3176
+ headers: {
3177
+ [name: string]: unknown;
3178
+ };
3179
+ content: {
3180
+ "application/json": components["schemas"]["Error"];
3181
+ };
3182
+ };
3183
+ };
3184
+ };
3185
+ deleteUser: {
3186
+ parameters: {
3187
+ query?: never;
3188
+ header?: never;
3189
+ path: {
3190
+ username: components["parameters"]["PathUsername"];
3191
+ };
3192
+ cookie?: never;
3193
+ };
3194
+ requestBody?: never;
3195
+ responses: {
3196
+ /** @description Removed. */
3197
+ 204: {
3198
+ headers: {
3199
+ [name: string]: unknown;
3200
+ };
3201
+ content?: never;
3202
+ };
3203
+ /** @description An admin can't remove their own account through this endpoint. */
3204
+ 400: {
3205
+ headers: {
3206
+ [name: string]: unknown;
3207
+ };
3208
+ content: {
3209
+ "application/json": components["schemas"]["Error"];
3210
+ };
3211
+ };
3212
+ /** @description No valid session cookie was presented. */
3213
+ 401: {
3214
+ headers: {
3215
+ [name: string]: unknown;
3216
+ };
3217
+ content: {
3218
+ "application/json": components["schemas"]["Error"];
3219
+ };
3220
+ };
3221
+ /** @description The signed-in user isn't the designated admin. */
3222
+ 403: {
3223
+ headers: {
3224
+ [name: string]: unknown;
3225
+ };
3226
+ content: {
3227
+ "application/json": components["schemas"]["Error"];
3228
+ };
3229
+ };
3230
+ /** @description No user is registered under that username. */
3231
+ 404: {
3232
+ headers: {
3233
+ [name: string]: unknown;
3234
+ };
3235
+ content: {
3236
+ "application/json": components["schemas"]["Error"];
3237
+ };
3238
+ };
3239
+ };
3240
+ };
3241
+ listInvites: {
3242
+ parameters: {
3243
+ query?: never;
3244
+ header?: never;
3245
+ path?: never;
3246
+ cookie?: never;
3247
+ };
3248
+ requestBody?: never;
3249
+ responses: {
3250
+ /** @description Every outstanding invite. */
3251
+ 200: {
3252
+ headers: {
3253
+ [name: string]: unknown;
3254
+ };
3255
+ content: {
3256
+ "application/json": components["schemas"]["AdminInvite"][];
3257
+ };
3258
+ };
3259
+ /** @description No valid session cookie was presented. */
3260
+ 401: {
3261
+ headers: {
3262
+ [name: string]: unknown;
3263
+ };
3264
+ content: {
3265
+ "application/json": components["schemas"]["Error"];
3266
+ };
3267
+ };
3268
+ /** @description The signed-in user isn't the designated admin. */
3269
+ 403: {
3270
+ headers: {
3271
+ [name: string]: unknown;
3272
+ };
3273
+ content: {
3274
+ "application/json": components["schemas"]["Error"];
3275
+ };
3276
+ };
3277
+ };
3278
+ };
3279
+ createInvite: {
3280
+ parameters: {
3281
+ query?: never;
3282
+ header?: never;
3283
+ path?: never;
3284
+ cookie?: never;
3285
+ };
3286
+ requestBody: {
3287
+ content: {
3288
+ "application/json": components["schemas"]["AdminInviteCreateRequest"];
3289
+ };
3290
+ };
3291
+ responses: {
3292
+ /** @description Created — the only response that ever carries the raw token. */
3293
+ 201: {
3294
+ headers: {
3295
+ [name: string]: unknown;
3296
+ };
3297
+ content: {
3298
+ "application/json": components["schemas"]["AdminInviteCreateResponse"];
3299
+ };
3300
+ };
3301
+ /** @description username or displayName was blank. */
3302
+ 400: {
3303
+ headers: {
3304
+ [name: string]: unknown;
3305
+ };
3306
+ content: {
3307
+ "application/json": components["schemas"]["Error"];
3308
+ };
3309
+ };
3310
+ /** @description No valid session cookie was presented. */
3311
+ 401: {
3312
+ headers: {
3313
+ [name: string]: unknown;
3314
+ };
3315
+ content: {
3316
+ "application/json": components["schemas"]["Error"];
3317
+ };
3318
+ };
3319
+ /** @description The signed-in user isn't the designated admin. */
3320
+ 403: {
3321
+ headers: {
3322
+ [name: string]: unknown;
3323
+ };
3324
+ content: {
3325
+ "application/json": components["schemas"]["Error"];
3326
+ };
3327
+ };
3328
+ /** @description That username is already registered. */
3329
+ 409: {
3330
+ headers: {
3331
+ [name: string]: unknown;
3332
+ };
3333
+ content: {
3334
+ "application/json": components["schemas"]["Error"];
3335
+ };
3336
+ };
3337
+ };
3338
+ };
3339
+ revokeInvite: {
3340
+ parameters: {
3341
+ query?: never;
3342
+ header?: never;
3343
+ path: {
3344
+ token: string;
3345
+ };
3346
+ cookie?: never;
3347
+ };
3348
+ requestBody?: never;
3349
+ responses: {
3350
+ /** @description Revoked. */
3351
+ 204: {
3352
+ headers: {
3353
+ [name: string]: unknown;
3354
+ };
3355
+ content?: never;
3356
+ };
3357
+ /** @description No valid session cookie was presented. */
3358
+ 401: {
3359
+ headers: {
3360
+ [name: string]: unknown;
3361
+ };
3362
+ content: {
3363
+ "application/json": components["schemas"]["Error"];
3364
+ };
3365
+ };
3366
+ /** @description The signed-in user isn't the designated admin. */
3367
+ 403: {
3368
+ headers: {
3369
+ [name: string]: unknown;
3370
+ };
3371
+ content: {
3372
+ "application/json": components["schemas"]["Error"];
3373
+ };
3374
+ };
3375
+ /** @description No outstanding invite with that id. */
3376
+ 404: {
3377
+ headers: {
3378
+ [name: string]: unknown;
3379
+ };
3380
+ content: {
3381
+ "application/json": components["schemas"]["Error"];
3382
+ };
3383
+ };
3384
+ };
3385
+ };
3386
+ health: {
3387
+ parameters: {
3388
+ query?: never;
3389
+ header?: never;
3390
+ path?: never;
3391
+ cookie?: never;
3392
+ };
3393
+ requestBody?: never;
3394
+ responses: {
3395
+ /** @description The process is up. */
3396
+ 200: {
3397
+ headers: {
3398
+ [name: string]: unknown;
3399
+ };
3400
+ content: {
3401
+ /**
3402
+ * @example {
3403
+ * "status": "ok"
3404
+ * }
3405
+ */
3406
+ "application/json": components["schemas"]["Health"];
3407
+ };
3408
+ };
3409
+ };
3410
+ };
3411
+ getVersion: {
3412
+ parameters: {
3413
+ query?: never;
3414
+ header?: never;
3415
+ path?: never;
3416
+ cookie?: never;
3417
+ };
3418
+ requestBody?: never;
3419
+ responses: {
3420
+ /** @description The running version. */
3421
+ 200: {
3422
+ headers: {
3423
+ [name: string]: unknown;
3424
+ };
3425
+ content: {
3426
+ /**
3427
+ * @example {
3428
+ * "version": "0.12.1"
3429
+ * }
3430
+ */
3431
+ "application/json": components["schemas"]["Version"];
3432
+ };
3433
+ };
3434
+ };
3435
+ };
3436
+ getDashboard: {
3437
+ parameters: {
3438
+ query?: {
3439
+ /** @description A username that has shared their dashboard with the caller. Defaults to the caller's own. */
3440
+ owner?: string;
3441
+ };
3442
+ header?: never;
3443
+ path?: never;
3444
+ cookie?: never;
3445
+ };
3446
+ requestBody?: never;
3447
+ responses: {
3448
+ /** @description The current snapshot. */
3449
+ 200: {
3450
+ headers: {
3451
+ [name: string]: unknown;
3452
+ };
3453
+ content: {
3454
+ "application/json": components["schemas"]["Dashboard"];
3455
+ };
3456
+ };
3457
+ /** @description No valid session cookie was presented. */
3458
+ 401: {
3459
+ headers: {
3460
+ [name: string]: unknown;
3461
+ };
3462
+ content: {
3463
+ "application/json": components["schemas"]["Error"];
3464
+ };
3465
+ };
3466
+ /** @description owner hasn't shared their dashboard with the signed-in user. */
3467
+ 403: {
3468
+ headers: {
3469
+ [name: string]: unknown;
3470
+ };
3471
+ content: {
3472
+ "application/json": components["schemas"]["Error"];
3473
+ };
3474
+ };
3475
+ /** @description No user is registered under owner. */
3476
+ 404: {
3477
+ headers: {
3478
+ [name: string]: unknown;
3479
+ };
3480
+ content: {
3481
+ "application/json": components["schemas"]["Error"];
3482
+ };
3483
+ };
3484
+ };
3485
+ };
3486
+ streamDashboard: {
3487
+ parameters: {
3488
+ query?: never;
3489
+ header?: never;
3490
+ path?: never;
3491
+ cookie?: never;
3492
+ };
3493
+ requestBody?: never;
3494
+ responses: {
3495
+ /**
3496
+ * @description An SSE stream. Each event's `data` field is a JSON-encoded
3497
+ * snapshot, identical in shape to GET /api/dashboard's
3498
+ * response body.
3499
+ */
3500
+ 200: {
3501
+ headers: {
3502
+ [name: string]: unknown;
3503
+ };
3504
+ content: {
3505
+ "text/event-stream": components["schemas"]["Dashboard"];
3506
+ };
3507
+ };
3508
+ /** @description No valid session cookie was presented. */
3509
+ 401: {
3510
+ headers: {
3511
+ [name: string]: unknown;
3512
+ };
3513
+ content: {
3514
+ "application/json": components["schemas"]["Error"];
3515
+ };
3516
+ };
3517
+ /** @description No background refresh is running yet for this user — Settings has never been saved. */
3518
+ 404: {
3519
+ headers: {
3520
+ [name: string]: unknown;
3521
+ };
3522
+ content: {
3523
+ "application/json": components["schemas"]["Error"];
3524
+ };
3525
+ };
3526
+ };
3527
+ };
3528
+ refreshDashboard: {
3529
+ parameters: {
3530
+ query?: never;
3531
+ header?: never;
3532
+ path?: never;
3533
+ cookie?: never;
3534
+ };
3535
+ requestBody?: never;
3536
+ responses: {
3537
+ /** @description The freshly refreshed snapshot. */
3538
+ 200: {
3539
+ headers: {
3540
+ [name: string]: unknown;
3541
+ };
3542
+ content: {
3543
+ "application/json": components["schemas"]["Dashboard"];
3544
+ };
3545
+ };
3546
+ /** @description No valid session cookie was presented. */
3547
+ 401: {
3548
+ headers: {
3549
+ [name: string]: unknown;
3550
+ };
3551
+ content: {
3552
+ "application/json": components["schemas"]["Error"];
3553
+ };
3554
+ };
3555
+ /** @description No background refresh is running yet for this user — Settings has never been saved. */
3556
+ 404: {
3557
+ headers: {
3558
+ [name: string]: unknown;
3559
+ };
3560
+ content: {
3561
+ "application/json": components["schemas"]["Error"];
3562
+ };
3563
+ };
3564
+ };
3565
+ };
3566
+ getSharing: {
3567
+ parameters: {
3568
+ query?: never;
3569
+ header?: never;
3570
+ path?: never;
3571
+ cookie?: never;
3572
+ };
3573
+ requestBody?: never;
3574
+ responses: {
3575
+ /** @description The current sharing relationships. */
3576
+ 200: {
3577
+ headers: {
3578
+ [name: string]: unknown;
3579
+ };
3580
+ content: {
3581
+ "application/json": components["schemas"]["SharingResponse"];
3582
+ };
3583
+ };
3584
+ /** @description No valid session cookie was presented. */
3585
+ 401: {
3586
+ headers: {
3587
+ [name: string]: unknown;
3588
+ };
3589
+ content: {
3590
+ "application/json": components["schemas"]["Error"];
3591
+ };
3592
+ };
3593
+ };
3594
+ };
3595
+ shareWith: {
3596
+ parameters: {
3597
+ query?: never;
3598
+ header?: never;
3599
+ path: {
3600
+ username: components["parameters"]["PathUsername"];
3601
+ };
3602
+ cookie?: never;
3603
+ };
3604
+ requestBody?: never;
3605
+ responses: {
3606
+ /** @description Shared. */
3607
+ 204: {
3608
+ headers: {
3609
+ [name: string]: unknown;
3610
+ };
3611
+ content?: never;
3612
+ };
3613
+ /** @description Can't share your own dashboard with yourself. */
3614
+ 400: {
3615
+ headers: {
3616
+ [name: string]: unknown;
3617
+ };
3618
+ content: {
3619
+ "application/json": components["schemas"]["Error"];
3620
+ };
3621
+ };
3622
+ /** @description No valid session cookie was presented. */
3623
+ 401: {
3624
+ headers: {
3625
+ [name: string]: unknown;
3626
+ };
3627
+ content: {
3628
+ "application/json": components["schemas"]["Error"];
3629
+ };
3630
+ };
3631
+ /** @description No user is registered under that username. */
3632
+ 404: {
3633
+ headers: {
3634
+ [name: string]: unknown;
3635
+ };
3636
+ content: {
3637
+ "application/json": components["schemas"]["Error"];
3638
+ };
3639
+ };
3640
+ };
3641
+ };
3642
+ unshareWith: {
3643
+ parameters: {
3644
+ query?: never;
3645
+ header?: never;
3646
+ path: {
3647
+ username: components["parameters"]["PathUsername"];
3648
+ };
3649
+ cookie?: never;
3650
+ };
3651
+ requestBody?: never;
3652
+ responses: {
3653
+ /** @description No longer shared. */
3654
+ 204: {
3655
+ headers: {
3656
+ [name: string]: unknown;
3657
+ };
3658
+ content?: never;
3659
+ };
3660
+ /** @description No valid session cookie was presented. */
3661
+ 401: {
3662
+ headers: {
3663
+ [name: string]: unknown;
3664
+ };
3665
+ content: {
3666
+ "application/json": components["schemas"]["Error"];
3667
+ };
3668
+ };
3669
+ };
3670
+ };
3671
+ receiveGitHubWebhook: {
3672
+ parameters: {
3673
+ query?: never;
3674
+ header?: never;
3675
+ path: {
3676
+ webhookToken: components["parameters"]["PathWebhookToken"];
3677
+ };
3678
+ cookie?: never;
3679
+ };
3680
+ requestBody: {
3681
+ content: {
3682
+ "application/json": Record<string, never>;
3683
+ };
3684
+ };
3685
+ responses: {
3686
+ /** @description Signature verified; a refresh was triggered. */
3687
+ 204: {
3688
+ headers: {
3689
+ [name: string]: unknown;
3690
+ };
3691
+ content?: never;
3692
+ };
3693
+ /** @description The X-Hub-Signature-256 header was missing or didn't verify against this user's webhook secret. */
3694
+ 401: {
3695
+ headers: {
3696
+ [name: string]: unknown;
3697
+ };
3698
+ content: {
3699
+ "application/json": components["schemas"]["Error"];
3700
+ };
3701
+ };
3702
+ /** @description No user's webhook token matches webhookToken. */
3703
+ 404: {
3704
+ headers: {
3705
+ [name: string]: unknown;
3706
+ };
3707
+ content: {
3708
+ "application/json": components["schemas"]["Error"];
3709
+ };
3710
+ };
3711
+ };
3712
+ };
3713
+ receiveForgejoWebhook: {
3714
+ parameters: {
3715
+ query?: never;
3716
+ header?: never;
3717
+ path: {
3718
+ webhookToken: components["parameters"]["PathWebhookToken"];
3719
+ };
3720
+ cookie?: never;
3721
+ };
3722
+ requestBody: {
3723
+ content: {
3724
+ "application/json": Record<string, never>;
3725
+ };
3726
+ };
3727
+ responses: {
3728
+ /** @description Signature verified; a refresh was triggered. */
3729
+ 204: {
3730
+ headers: {
3731
+ [name: string]: unknown;
3732
+ };
3733
+ content?: never;
3734
+ };
3735
+ /** @description Both signature headers were missing, or neither verified against this user's webhook secret. */
3736
+ 401: {
3737
+ headers: {
3738
+ [name: string]: unknown;
3739
+ };
3740
+ content: {
3741
+ "application/json": components["schemas"]["Error"];
3742
+ };
3743
+ };
3744
+ /** @description No user's webhook token matches webhookToken. */
3745
+ 404: {
3746
+ headers: {
3747
+ [name: string]: unknown;
3748
+ };
3749
+ content: {
3750
+ "application/json": components["schemas"]["Error"];
3751
+ };
3752
+ };
3753
+ };
3754
+ };
3755
+ }
3756
+ //# sourceMappingURL=schema.d.ts.map