@runlot/api 0.1.0-rc.96 → 0.1.0-rc.98
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +31 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +39 -0
- package/dist/index.js.map +1 -1
- package/dist/schema.d.ts +1398 -70
- package/dist/schema.d.ts.map +1 -1
- package/package.json +2 -2
package/dist/schema.d.ts
CHANGED
|
@@ -336,6 +336,183 @@ export interface paths {
|
|
|
336
336
|
patch?: never;
|
|
337
337
|
trace?: never;
|
|
338
338
|
};
|
|
339
|
+
"/.well-known/oauth-authorization-server": {
|
|
340
|
+
parameters: {
|
|
341
|
+
query?: never;
|
|
342
|
+
header?: never;
|
|
343
|
+
path?: never;
|
|
344
|
+
cookie?: never;
|
|
345
|
+
};
|
|
346
|
+
/**
|
|
347
|
+
* Authorization server metadata (RFC 8414)
|
|
348
|
+
* @description What a client reads before it has any credential, so it is open by definition.
|
|
349
|
+
*
|
|
350
|
+
* `authorization_endpoint` points at the **dashboard**, not at this API: the
|
|
351
|
+
* authorization step has to see the user's login session, which lives in the browser
|
|
352
|
+
* (docs/studio.md §8.1). `runlot_access_token_audience` is not in RFC 8414 — it is here
|
|
353
|
+
* so a resource server learns the `aud` it must require from the issuer rather than from
|
|
354
|
+
* a second configured value that can disagree.
|
|
355
|
+
*/
|
|
356
|
+
get: operations["oauthMetadata"];
|
|
357
|
+
put?: never;
|
|
358
|
+
post?: never;
|
|
359
|
+
delete?: never;
|
|
360
|
+
options?: never;
|
|
361
|
+
head?: never;
|
|
362
|
+
patch?: never;
|
|
363
|
+
trace?: never;
|
|
364
|
+
};
|
|
365
|
+
"/.well-known/jwks.json": {
|
|
366
|
+
parameters: {
|
|
367
|
+
query?: never;
|
|
368
|
+
header?: never;
|
|
369
|
+
path?: never;
|
|
370
|
+
cookie?: never;
|
|
371
|
+
};
|
|
372
|
+
/**
|
|
373
|
+
* The access tokens' public keys
|
|
374
|
+
* @description Every non-retired signing key. **Two are published during a rotation**, which is the
|
|
375
|
+
* whole reason this is a set: a verifier that cached one key would refuse tokens minted
|
|
376
|
+
* with the other. Cacheable for a minute, and no longer — a stale copy refuses fresh
|
|
377
|
+
* tokens.
|
|
378
|
+
*/
|
|
379
|
+
get: operations["oauthJwks"];
|
|
380
|
+
put?: never;
|
|
381
|
+
post?: never;
|
|
382
|
+
delete?: never;
|
|
383
|
+
options?: never;
|
|
384
|
+
head?: never;
|
|
385
|
+
patch?: never;
|
|
386
|
+
trace?: never;
|
|
387
|
+
};
|
|
388
|
+
"/v1/oauth/authorize": {
|
|
389
|
+
parameters: {
|
|
390
|
+
query?: never;
|
|
391
|
+
header?: never;
|
|
392
|
+
path?: never;
|
|
393
|
+
cookie?: never;
|
|
394
|
+
};
|
|
395
|
+
get?: never;
|
|
396
|
+
put?: never;
|
|
397
|
+
/**
|
|
398
|
+
* Approve a connected app and mint an authorization code
|
|
399
|
+
* @description Called by the dashboard's `/oauth/authorize` screen with the **user's login session**.
|
|
400
|
+
* A personal access token is refused whatever its scopes: a credential must never be
|
|
401
|
+
* able to widen itself into a longer-lived one.
|
|
402
|
+
*
|
|
403
|
+
* The parameters carry OAuth's own names rather than this document's camelCase, because
|
|
404
|
+
* the screen forwards the query string it was handed.
|
|
405
|
+
*/
|
|
406
|
+
post: operations["oauthAuthorize"];
|
|
407
|
+
delete?: never;
|
|
408
|
+
options?: never;
|
|
409
|
+
head?: never;
|
|
410
|
+
patch?: never;
|
|
411
|
+
trace?: never;
|
|
412
|
+
};
|
|
413
|
+
"/oauth/token": {
|
|
414
|
+
parameters: {
|
|
415
|
+
query?: never;
|
|
416
|
+
header?: never;
|
|
417
|
+
path?: never;
|
|
418
|
+
cookie?: never;
|
|
419
|
+
};
|
|
420
|
+
get?: never;
|
|
421
|
+
put?: never;
|
|
422
|
+
/**
|
|
423
|
+
* Exchange a code, or refresh (RFC 6749)
|
|
424
|
+
* @description Form-encoded, not JSON — RFC 6749 §4.1.3, and what every client library sends.
|
|
425
|
+
*
|
|
426
|
+
* **The failures are RFC 6749 §5.2's body, not this document's error envelope**, because
|
|
427
|
+
* these two endpoints are read by generic OAuth clients that cannot parse ours.
|
|
428
|
+
*
|
|
429
|
+
* Refresh tokens rotate: using one invalidates it and returns the next. Rate limited per
|
|
430
|
+
* client and per address (`429`).
|
|
431
|
+
*/
|
|
432
|
+
post: operations["oauthToken"];
|
|
433
|
+
delete?: never;
|
|
434
|
+
options?: never;
|
|
435
|
+
head?: never;
|
|
436
|
+
patch?: never;
|
|
437
|
+
trace?: never;
|
|
438
|
+
};
|
|
439
|
+
"/oauth/revoke": {
|
|
440
|
+
parameters: {
|
|
441
|
+
query?: never;
|
|
442
|
+
header?: never;
|
|
443
|
+
path?: never;
|
|
444
|
+
cookie?: never;
|
|
445
|
+
};
|
|
446
|
+
get?: never;
|
|
447
|
+
put?: never;
|
|
448
|
+
/**
|
|
449
|
+
* Sign a connected app out (RFC 7009)
|
|
450
|
+
* @description Form-encoded. **It answers 200 for a token it does not know** — RFC 7009 §2.2 requires
|
|
451
|
+
* it, and the reason is that any other answer turns the endpoint into an oracle for which
|
|
452
|
+
* tokens exist.
|
|
453
|
+
*
|
|
454
|
+
* Revoking a refresh token revokes **the whole grant**, not one rotation generation:
|
|
455
|
+
* "sign out in Studio" means the device is gone from Connected apps too (docs/studio.md
|
|
456
|
+
* §8.4). Rate limited per client and per address (`429`).
|
|
457
|
+
*/
|
|
458
|
+
post: operations["oauthRevoke"];
|
|
459
|
+
delete?: never;
|
|
460
|
+
options?: never;
|
|
461
|
+
head?: never;
|
|
462
|
+
patch?: never;
|
|
463
|
+
trace?: never;
|
|
464
|
+
};
|
|
465
|
+
"/v1/oauth/grants": {
|
|
466
|
+
parameters: {
|
|
467
|
+
query?: never;
|
|
468
|
+
header?: never;
|
|
469
|
+
path?: never;
|
|
470
|
+
cookie?: never;
|
|
471
|
+
};
|
|
472
|
+
/**
|
|
473
|
+
* Connected apps
|
|
474
|
+
* @description What can reach this account right now (docs/studio.md §8.4). Revoked grants are not
|
|
475
|
+
* listed: a list that keeps dead rows makes the answer a filter the reader has to apply.
|
|
476
|
+
*
|
|
477
|
+
* Session only, for `POST /v1/oauth/authorize`'s reason.
|
|
478
|
+
*/
|
|
479
|
+
get: operations["listOAuthGrants"];
|
|
480
|
+
put?: never;
|
|
481
|
+
post?: never;
|
|
482
|
+
delete?: never;
|
|
483
|
+
options?: never;
|
|
484
|
+
head?: never;
|
|
485
|
+
patch?: never;
|
|
486
|
+
trace?: never;
|
|
487
|
+
};
|
|
488
|
+
"/v1/oauth/grants/{sid}": {
|
|
489
|
+
parameters: {
|
|
490
|
+
query?: never;
|
|
491
|
+
header?: never;
|
|
492
|
+
path: {
|
|
493
|
+
/** @description The grant's session id, as `GET /v1/oauth/grants` returned it. */
|
|
494
|
+
sid: string;
|
|
495
|
+
};
|
|
496
|
+
cookie?: never;
|
|
497
|
+
};
|
|
498
|
+
get?: never;
|
|
499
|
+
put?: never;
|
|
500
|
+
post?: never;
|
|
501
|
+
/**
|
|
502
|
+
* Remove a connected app
|
|
503
|
+
* @description Its refresh tokens die with it, its access token dies on the next request through the
|
|
504
|
+
* `sid` check, and the revocation reaches the Studio service through cp-core's feed — so
|
|
505
|
+
* a lent model drops at once rather than within the access token's fifteen minutes.
|
|
506
|
+
*
|
|
507
|
+
* A grant that is not this user's is a **404**, not a 403: telling a caller that somebody
|
|
508
|
+
* else's grant id exists is a probe for grant ids.
|
|
509
|
+
*/
|
|
510
|
+
delete: operations["revokeOAuthGrant"];
|
|
511
|
+
options?: never;
|
|
512
|
+
head?: never;
|
|
513
|
+
patch?: never;
|
|
514
|
+
trace?: never;
|
|
515
|
+
};
|
|
339
516
|
"/v1/me": {
|
|
340
517
|
parameters: {
|
|
341
518
|
query?: never;
|
|
@@ -692,6 +869,41 @@ export interface paths {
|
|
|
692
869
|
patch?: never;
|
|
693
870
|
trace?: never;
|
|
694
871
|
};
|
|
872
|
+
"/v1/orgs/{orgSlug}/projects/{projectName}/deployments/{deploymentId}": {
|
|
873
|
+
parameters: {
|
|
874
|
+
query?: never;
|
|
875
|
+
header?: never;
|
|
876
|
+
path: {
|
|
877
|
+
orgSlug: components["parameters"]["OrgSlug"];
|
|
878
|
+
projectName: components["parameters"]["ProjectName"];
|
|
879
|
+
deploymentId: string;
|
|
880
|
+
};
|
|
881
|
+
cookie?: never;
|
|
882
|
+
};
|
|
883
|
+
/**
|
|
884
|
+
* One deployment, with the status of any migrations the CP applied
|
|
885
|
+
* @description The same object the history lists, plus `migrations` — which only a deployment the
|
|
886
|
+
* control plane migrates for you carries.
|
|
887
|
+
*
|
|
888
|
+
* Normally `migrations/` is applied by the **client**: `runlot deploy` connects over the
|
|
889
|
+
* wire and runs the files, watched by the person who typed the command. A **preview**
|
|
890
|
+
* deploy is the exception, because the CLI can only name the parent project's database
|
|
891
|
+
* and running a preview's migrations there is the accident `db=branch` exists to
|
|
892
|
+
* prevent. For those the control plane applies them to the branch instead, after the
|
|
893
|
+
* branch finishes pouring, and this is where the outcome is read.
|
|
894
|
+
*
|
|
895
|
+
* A preview whose id was returned by `createDeployment` is readable **under its parent
|
|
896
|
+
* project's name** — the name the caller deployed through.
|
|
897
|
+
*/
|
|
898
|
+
get: operations["getDeployment"];
|
|
899
|
+
put?: never;
|
|
900
|
+
post?: never;
|
|
901
|
+
delete?: never;
|
|
902
|
+
options?: never;
|
|
903
|
+
head?: never;
|
|
904
|
+
patch?: never;
|
|
905
|
+
trace?: never;
|
|
906
|
+
};
|
|
695
907
|
"/v1/orgs/{orgSlug}/projects/{projectName}/cron": {
|
|
696
908
|
parameters: {
|
|
697
909
|
query?: never;
|
|
@@ -1050,8 +1262,10 @@ export interface paths {
|
|
|
1050
1262
|
get: operations["getDatabase"];
|
|
1051
1263
|
put?: never;
|
|
1052
1264
|
/**
|
|
1053
|
-
*
|
|
1054
|
-
* @description
|
|
1265
|
+
* Creates a new database after the previous one was deleted
|
|
1266
|
+
* @description Every project has a database from the start; this creates a new, empty one after a
|
|
1267
|
+
* delete, and clears the turn-off so later deploys keep it. It returns the connection
|
|
1268
|
+
* details. Shortly afterwards
|
|
1055
1269
|
* the running worker picks up a connected `env.db`. No redeploy is needed.
|
|
1056
1270
|
*
|
|
1057
1271
|
* **It is idempotent and never rotates the password.** A second call returns the same
|
|
@@ -1202,6 +1416,12 @@ export interface paths {
|
|
|
1202
1416
|
* to your statement**, so `rowCount` still reports what the statement actually did and
|
|
1203
1417
|
* `truncated` tells you the listing was cut.
|
|
1204
1418
|
*
|
|
1419
|
+
* **Write mode belongs to a dashboard session.** A personal access token reaches this
|
|
1420
|
+
* route with `db:read` and runs read-only statements; asking for `readOnly: false`
|
|
1421
|
+
* with a token is 403 `console_write_needs_session`. No scope opens it — a credential
|
|
1422
|
+
* that has to write goes through `…/database/connect` or `…/database/tokens` and
|
|
1423
|
+
* connects, where the power it carries is named on the token.
|
|
1424
|
+
*
|
|
1205
1425
|
* Requires member or higher. A write leaves a `db.execute` audit event; a read leaves
|
|
1206
1426
|
* none.
|
|
1207
1427
|
*/
|
|
@@ -1631,7 +1851,7 @@ export interface paths {
|
|
|
1631
1851
|
get: operations["getStorage"];
|
|
1632
1852
|
put?: never;
|
|
1633
1853
|
/**
|
|
1634
|
-
*
|
|
1854
|
+
* Turns storage back on after it was turned off
|
|
1635
1855
|
* @description **This is idempotent** — calling it twice leaves the prefix unchanged, so a retry can
|
|
1636
1856
|
* never move objects out of view.
|
|
1637
1857
|
*
|
|
@@ -1717,6 +1937,81 @@ export interface paths {
|
|
|
1717
1937
|
patch?: never;
|
|
1718
1938
|
trace?: never;
|
|
1719
1939
|
};
|
|
1940
|
+
"/v1/orgs/{orgSlug}/projects/{projectName}/storage/objects": {
|
|
1941
|
+
parameters: {
|
|
1942
|
+
query?: never;
|
|
1943
|
+
header?: never;
|
|
1944
|
+
path: {
|
|
1945
|
+
orgSlug: components["parameters"]["OrgSlug"];
|
|
1946
|
+
projectName: components["parameters"]["ProjectName"];
|
|
1947
|
+
};
|
|
1948
|
+
cookie?: never;
|
|
1949
|
+
};
|
|
1950
|
+
/**
|
|
1951
|
+
* List objects (`runlot storage ls`)
|
|
1952
|
+
* @description One page of the project's objects, **grouped by `/`** the way a file browser groups
|
|
1953
|
+
* them: `entries` are the objects directly under `prefix`, and `prefixes` are the
|
|
1954
|
+
* directories one level down.
|
|
1955
|
+
*
|
|
1956
|
+
* Keys are the ones the worker writes — `env.storage.put(key, …)` — never the
|
|
1957
|
+
* internal `p/<projectId>/` prefix, which is an isolation boundary and not part of
|
|
1958
|
+
* any address.
|
|
1959
|
+
*
|
|
1960
|
+
* `public` is true when the key sits under a prefix this project has published
|
|
1961
|
+
* (`…/storage/public`), and `url` is then the unsigned address anyone can read. A
|
|
1962
|
+
* private object carries no `url`: this field means "anyone can read this", and a
|
|
1963
|
+
* signed URL in it would show a private object as a public one. For those, ask
|
|
1964
|
+
* `…/storage/objects/{key}`.
|
|
1965
|
+
*
|
|
1966
|
+
* **Paging is by `cursor`, and the boundary lands between groups** — no directory is
|
|
1967
|
+
* listed twice and none is skipped. Feed `cursor` back unchanged; its absence is the
|
|
1968
|
+
* end.
|
|
1969
|
+
*
|
|
1970
|
+
* Requires viewer or higher.
|
|
1971
|
+
*/
|
|
1972
|
+
get: operations["listStorageObjects"];
|
|
1973
|
+
put?: never;
|
|
1974
|
+
post?: never;
|
|
1975
|
+
delete?: never;
|
|
1976
|
+
options?: never;
|
|
1977
|
+
head?: never;
|
|
1978
|
+
patch?: never;
|
|
1979
|
+
trace?: never;
|
|
1980
|
+
};
|
|
1981
|
+
"/v1/orgs/{orgSlug}/projects/{projectName}/storage/objects/{key}": {
|
|
1982
|
+
parameters: {
|
|
1983
|
+
query?: never;
|
|
1984
|
+
header?: never;
|
|
1985
|
+
path: {
|
|
1986
|
+
orgSlug: components["parameters"]["OrgSlug"];
|
|
1987
|
+
projectName: components["parameters"]["ProjectName"];
|
|
1988
|
+
/** @description The object key. It may contain `/`; the segments are part of the path. */
|
|
1989
|
+
key: string;
|
|
1990
|
+
};
|
|
1991
|
+
cookie?: never;
|
|
1992
|
+
};
|
|
1993
|
+
/**
|
|
1994
|
+
* A short-lived signed URL for one object (`runlot storage download`)
|
|
1995
|
+
* @description A **GET** URL valid for five minutes, which the browser or the CLI then fetches
|
|
1996
|
+
* directly from the object front. The bytes never pass through this API.
|
|
1997
|
+
*
|
|
1998
|
+
* The object is looked up before it is signed, so a key that holds nothing is a 404
|
|
1999
|
+
* here rather than a URL that 404s minutes later somewhere you cannot correlate it.
|
|
2000
|
+
*
|
|
2001
|
+
* Only GET is signed. Uploading and deleting are not on this surface — write through
|
|
2002
|
+
* `env.storage` from the worker.
|
|
2003
|
+
*
|
|
2004
|
+
* Requires viewer or higher.
|
|
2005
|
+
*/
|
|
2006
|
+
get: operations["signStorageObject"];
|
|
2007
|
+
put?: never;
|
|
2008
|
+
post?: never;
|
|
2009
|
+
delete?: never;
|
|
2010
|
+
options?: never;
|
|
2011
|
+
head?: never;
|
|
2012
|
+
patch?: never;
|
|
2013
|
+
trace?: never;
|
|
2014
|
+
};
|
|
1720
2015
|
"/v1/ai/models": {
|
|
1721
2016
|
parameters: {
|
|
1722
2017
|
query?: never;
|
|
@@ -1773,12 +2068,12 @@ export interface paths {
|
|
|
1773
2068
|
get: operations["getAI"];
|
|
1774
2069
|
put?: never;
|
|
1775
2070
|
/**
|
|
1776
|
-
* Turns
|
|
2071
|
+
* Turns AI back on after it was turned off
|
|
1777
2072
|
* @description **This is idempotent.** There is no request body — neither the limits nor the model list is a
|
|
1778
2073
|
* value you set.
|
|
1779
2074
|
*
|
|
1780
|
-
*
|
|
1781
|
-
*
|
|
2075
|
+
* Every project has AI from the start; this is the way back after `DELETE`, and it clears the
|
|
2076
|
+
* turn-off so later deploys keep it. `env.ai` is attached from the next deployment.
|
|
1782
2077
|
*
|
|
1783
2078
|
* Requires member or higher. Audited as `ai.grant`.
|
|
1784
2079
|
*/
|
|
@@ -1936,7 +2231,7 @@ export interface paths {
|
|
|
1936
2231
|
get: operations["getEmail"];
|
|
1937
2232
|
put?: never;
|
|
1938
2233
|
/**
|
|
1939
|
-
* Turns
|
|
2234
|
+
* Turns email back on after it was turned off
|
|
1940
2235
|
* @description **This is idempotent.** There is no request body — the address is derived
|
|
1941
2236
|
* (`<project>.<org>.<mail-domain>`), and the plan determines the limit. The address is
|
|
1942
2237
|
* fixed to the project name at the time of the grant.
|
|
@@ -2167,14 +2462,13 @@ export interface paths {
|
|
|
2167
2462
|
get: operations["getAuth"];
|
|
2168
2463
|
put?: never;
|
|
2169
2464
|
/**
|
|
2170
|
-
* Turns
|
|
2465
|
+
* Turns login back on after it was turned off
|
|
2171
2466
|
* @description **This is idempotent** — calling it twice leaves the settings and login providers
|
|
2172
2467
|
* unchanged. Auth is either on or off; there is no "on but disabled" state.
|
|
2173
2468
|
*
|
|
2174
2469
|
* **A database is required.** Without one this returns 409 `database_required`, because
|
|
2175
|
-
* the end-user tables live inside the project's database.
|
|
2176
|
-
*
|
|
2177
|
-
* see this error.
|
|
2470
|
+
* the end-user tables live inside the project's database. Every project has one unless it
|
|
2471
|
+
* was deleted, so you will see this only after a database delete.
|
|
2178
2472
|
*
|
|
2179
2473
|
* Once enabled, the built-in login endpoints start serving shortly afterwards. As with
|
|
2180
2474
|
* `env.db` and `env.storage`, no redeploy is needed. Table initialization is idempotent,
|
|
@@ -2268,6 +2562,70 @@ export interface paths {
|
|
|
2268
2562
|
patch?: never;
|
|
2269
2563
|
trace?: never;
|
|
2270
2564
|
};
|
|
2565
|
+
"/v1/orgs/{orgSlug}/projects/{projectName}/auth/users": {
|
|
2566
|
+
parameters: {
|
|
2567
|
+
query?: never;
|
|
2568
|
+
header?: never;
|
|
2569
|
+
path: {
|
|
2570
|
+
orgSlug: components["parameters"]["OrgSlug"];
|
|
2571
|
+
projectName: components["parameters"]["ProjectName"];
|
|
2572
|
+
};
|
|
2573
|
+
cookie?: never;
|
|
2574
|
+
};
|
|
2575
|
+
/**
|
|
2576
|
+
* The app's end users (`runlot auth users`)
|
|
2577
|
+
* @description The people who signed up to **your app** — not the members of your organization.
|
|
2578
|
+
* They live in the project's own database, under the `runlot_auth` schema, and this
|
|
2579
|
+
* route reads them over the same connection `…/database/connect` hands you for psql.
|
|
2580
|
+
* Everything here is also visible through `env.db` and `psql`; this is a convenience,
|
|
2581
|
+
* not a second source.
|
|
2582
|
+
*
|
|
2583
|
+
* **It is read-only.** Blocking a user, deleting one, or resetting a password is not
|
|
2584
|
+
* on this surface — write through `env.db`.
|
|
2585
|
+
*
|
|
2586
|
+
* An app whose login has never been used has no schema yet (it is created on the
|
|
2587
|
+
* first call), and that answers an **empty list** rather than an error.
|
|
2588
|
+
*
|
|
2589
|
+
* Paging is by `cursor`, newest first. Feed it back unchanged; its absence is the
|
|
2590
|
+
* end.
|
|
2591
|
+
*
|
|
2592
|
+
* Requires member or higher, and `db:read` on a token — the subscriber list is the
|
|
2593
|
+
* project's data, the same class as the SQL console.
|
|
2594
|
+
*/
|
|
2595
|
+
get: operations["listAppUsers"];
|
|
2596
|
+
put?: never;
|
|
2597
|
+
post?: never;
|
|
2598
|
+
delete?: never;
|
|
2599
|
+
options?: never;
|
|
2600
|
+
head?: never;
|
|
2601
|
+
patch?: never;
|
|
2602
|
+
trace?: never;
|
|
2603
|
+
};
|
|
2604
|
+
"/v1/orgs/{orgSlug}/projects/{projectName}/auth/users/{userId}": {
|
|
2605
|
+
parameters: {
|
|
2606
|
+
query?: never;
|
|
2607
|
+
header?: never;
|
|
2608
|
+
path: {
|
|
2609
|
+
orgSlug: components["parameters"]["OrgSlug"];
|
|
2610
|
+
projectName: components["parameters"]["ProjectName"];
|
|
2611
|
+
userId: string;
|
|
2612
|
+
};
|
|
2613
|
+
cookie?: never;
|
|
2614
|
+
};
|
|
2615
|
+
/**
|
|
2616
|
+
* One end user
|
|
2617
|
+
* @description The same record as the list, for one id. Requires member or higher, and `db:read`
|
|
2618
|
+
* on a token.
|
|
2619
|
+
*/
|
|
2620
|
+
get: operations["getAppUser"];
|
|
2621
|
+
put?: never;
|
|
2622
|
+
post?: never;
|
|
2623
|
+
delete?: never;
|
|
2624
|
+
options?: never;
|
|
2625
|
+
head?: never;
|
|
2626
|
+
patch?: never;
|
|
2627
|
+
trace?: never;
|
|
2628
|
+
};
|
|
2271
2629
|
"/v1/orgs/{orgSlug}/projects/{projectName}/access": {
|
|
2272
2630
|
parameters: {
|
|
2273
2631
|
query?: never;
|
|
@@ -3841,29 +4199,80 @@ export interface paths {
|
|
|
3841
4199
|
patch?: never;
|
|
3842
4200
|
trace?: never;
|
|
3843
4201
|
};
|
|
3844
|
-
}
|
|
3845
|
-
|
|
3846
|
-
|
|
3847
|
-
|
|
3848
|
-
|
|
3849
|
-
|
|
3850
|
-
|
|
3851
|
-
|
|
3852
|
-
|
|
3853
|
-
|
|
3854
|
-
|
|
3855
|
-
|
|
3856
|
-
|
|
3857
|
-
|
|
3858
|
-
|
|
3859
|
-
|
|
3860
|
-
|
|
3861
|
-
|
|
3862
|
-
|
|
3863
|
-
|
|
3864
|
-
|
|
3865
|
-
|
|
3866
|
-
|
|
4202
|
+
"/v1/orgs/{orgSlug}/projects/{projectName}/share": {
|
|
4203
|
+
parameters: {
|
|
4204
|
+
query?: never;
|
|
4205
|
+
header?: never;
|
|
4206
|
+
path: {
|
|
4207
|
+
orgSlug: components["parameters"]["OrgSlug"];
|
|
4208
|
+
projectName: components["parameters"]["ProjectName"];
|
|
4209
|
+
};
|
|
4210
|
+
cookie?: never;
|
|
4211
|
+
};
|
|
4212
|
+
/**
|
|
4213
|
+
* The project's share link
|
|
4214
|
+
* @description Requires viewer or higher. **404 when the project has never been shared** — a link is
|
|
4215
|
+
* minted by `putShareLink`, never as a side effect of reading.
|
|
4216
|
+
*/
|
|
4217
|
+
get: operations["getShareLink"];
|
|
4218
|
+
/**
|
|
4219
|
+
* Point the share link at a preview, minting it if there is none
|
|
4220
|
+
* @description Requires member or higher: handing out a public address for the app is publishing, not
|
|
4221
|
+
* reading.
|
|
4222
|
+
*
|
|
4223
|
+
* **Idempotent.** The label is minted once and kept, so somebody who already has the
|
|
4224
|
+
* link keeps working — calling this again with the same preview changes nothing. What it
|
|
4225
|
+
* does change is *which* preview the link resolves to, so a share from another branch
|
|
4226
|
+
* moves the same address rather than issuing a second one.
|
|
4227
|
+
*
|
|
4228
|
+
* `rotate: true` mints a new label and detaches the old name in the same request ("링크
|
|
4229
|
+
* 재발급"), so there is never a moment with two live links. Anyone holding the old link
|
|
4230
|
+
* stops being able to open it, which is the point.
|
|
4231
|
+
*
|
|
4232
|
+
* The named preview has to exist. Studio deploys it first
|
|
4233
|
+
* (`createDeployment?preview=studio&db=branch`) and shares it second.
|
|
4234
|
+
*/
|
|
4235
|
+
put: operations["putShareLink"];
|
|
4236
|
+
post?: never;
|
|
4237
|
+
/**
|
|
4238
|
+
* Stop the share link answering
|
|
4239
|
+
* @description Requires member or higher. The name stops resolving and the label is forgotten; a
|
|
4240
|
+
* later share mints a different one.
|
|
4241
|
+
*
|
|
4242
|
+
* **The preview is not deleted.** Sharing and running are separate decisions, and a link
|
|
4243
|
+
* that also destroyed a database branch would be a surprising amount of destruction.
|
|
4244
|
+
*
|
|
4245
|
+
* A project that is not shared answers 204 — the caller is turning something off.
|
|
4246
|
+
*/
|
|
4247
|
+
delete: operations["deleteShareLink"];
|
|
4248
|
+
options?: never;
|
|
4249
|
+
head?: never;
|
|
4250
|
+
patch?: never;
|
|
4251
|
+
trace?: never;
|
|
4252
|
+
};
|
|
4253
|
+
}
|
|
4254
|
+
export type webhooks = Record<string, never>;
|
|
4255
|
+
export interface components {
|
|
4256
|
+
schemas: {
|
|
4257
|
+
RepoRefs: {
|
|
4258
|
+
/**
|
|
4259
|
+
* @description The repository's current default branch. If this ever disagrees with
|
|
4260
|
+
* `Repo.defaultBranch`, this value is the correct one.
|
|
4261
|
+
*/
|
|
4262
|
+
defaultBranch: string;
|
|
4263
|
+
refs: {
|
|
4264
|
+
name: string;
|
|
4265
|
+
/**
|
|
4266
|
+
* @description The **commit** oid this ref points to. Annotated tags are peeled, so this is
|
|
4267
|
+
* always a commit and never a tag object.
|
|
4268
|
+
*/
|
|
4269
|
+
target: string;
|
|
4270
|
+
/** @enum {string} */
|
|
4271
|
+
kind: "branch" | "tag";
|
|
4272
|
+
}[];
|
|
4273
|
+
};
|
|
4274
|
+
RepoTreeEntry: {
|
|
4275
|
+
name: string;
|
|
3867
4276
|
/** @description Path relative to the repository root */
|
|
3868
4277
|
path: string;
|
|
3869
4278
|
/** @enum {string} */
|
|
@@ -3927,6 +4336,54 @@ export interface components {
|
|
|
3927
4336
|
* @enum {string}
|
|
3928
4337
|
*/
|
|
3929
4338
|
TokenScope: "repo:read" | "repo:write" | "repo:none";
|
|
4339
|
+
/** @description RFC 6749 §5.1. */
|
|
4340
|
+
OAuthTokenResponse: {
|
|
4341
|
+
/** @description An Ed25519 JWT (RFC 9068). Fifteen minutes. */
|
|
4342
|
+
access_token: string;
|
|
4343
|
+
/** @example Bearer */
|
|
4344
|
+
token_type: string;
|
|
4345
|
+
/**
|
|
4346
|
+
* @description Seconds. It is present so a client refreshes ahead of time instead of discovering
|
|
4347
|
+
* expiry as a 401 in the middle of something.
|
|
4348
|
+
* @example 900
|
|
4349
|
+
*/
|
|
4350
|
+
expires_in: number;
|
|
4351
|
+
/** @description Rotated: using one invalidates it and returns the next. */
|
|
4352
|
+
refresh_token: string;
|
|
4353
|
+
/** @example project:read deploy repo:read repo:write db:read */
|
|
4354
|
+
scope: string;
|
|
4355
|
+
};
|
|
4356
|
+
/**
|
|
4357
|
+
* @description RFC 6749 §5.2. **Not this document's error envelope**: `/oauth/token` and
|
|
4358
|
+
* `/oauth/revoke` are read by generic OAuth clients that cannot parse ours.
|
|
4359
|
+
*/
|
|
4360
|
+
OAuthError: {
|
|
4361
|
+
/** @example invalid_grant */
|
|
4362
|
+
error: string;
|
|
4363
|
+
error_description?: string;
|
|
4364
|
+
};
|
|
4365
|
+
/** @description One connected app, as `/account/apps` lists it (docs/studio.md §8.4). */
|
|
4366
|
+
OAuthGrant: {
|
|
4367
|
+
/** @description The grant's session id. It is the `sid` claim in every access token it minted, and what revocation is keyed by. */
|
|
4368
|
+
sid: string;
|
|
4369
|
+
/** @example studio-desktop */
|
|
4370
|
+
clientId: string;
|
|
4371
|
+
/** @example runlot Studio */
|
|
4372
|
+
clientName: string;
|
|
4373
|
+
/**
|
|
4374
|
+
* @description What the device called itself when it connected. Null for a client that did not say.
|
|
4375
|
+
* @example Ryan의 MacBook Pro
|
|
4376
|
+
*/
|
|
4377
|
+
deviceName: string | null;
|
|
4378
|
+
scopes: components["schemas"]["ApiScope"][];
|
|
4379
|
+
/** Format: date-time */
|
|
4380
|
+
createdAt: string;
|
|
4381
|
+
/**
|
|
4382
|
+
* Format: date-time
|
|
4383
|
+
* @description Null when the grant has never been used — a sign-in that was never followed by a call.
|
|
4384
|
+
*/
|
|
4385
|
+
lastUsedAt: string | null;
|
|
4386
|
+
};
|
|
3930
4387
|
/**
|
|
3931
4388
|
* @description One permission a personal access token carries. Scopes are checked on **every** route:
|
|
3932
4389
|
* the token acts as its owner, subject to that person's organization role, and the scope
|
|
@@ -4282,7 +4739,7 @@ export interface components {
|
|
|
4282
4739
|
* human-readable wording is produced separately by the dashboard and by email.
|
|
4283
4740
|
* @enum {string}
|
|
4284
4741
|
*/
|
|
4285
|
-
kind: "project_limit" | "db_near_cap" | "storage_near_quota" | "storage_quota_hit" | "backup_failed" | "cron_failed" | "queue_failed" | "queue_ops_cap" | "build_failed" | "restore_done" | "dns_publish_stalled" | "billing_past_due" | "overage_charge_failed" | "disabled_project_deletion" | "backup_stalled" | "backup_no_restore_point" | "backup_chain_broken" | "backup_always_full" | "budget_exhausted" | "ai_credit_low" | "ai_credit_exhausted" | "ai_autotopup_failed" | "ai_autotopup_disabled";
|
|
4742
|
+
kind: "project_limit" | "db_near_cap" | "storage_near_quota" | "storage_quota_hit" | "backup_failed" | "cron_failed" | "queue_failed" | "queue_ops_cap" | "build_failed" | "restore_done" | "dns_publish_stalled" | "billing_past_due" | "overage_charge_failed" | "disabled_project_deletion" | "backup_stalled" | "backup_no_restore_point" | "backup_chain_broken" | "backup_always_full" | "budget_exhausted" | "ai_credit_low" | "ai_credit_exhausted" | "ai_autotopup_failed" | "ai_autotopup_disabled" | "new_device";
|
|
4286
4743
|
/** @description If this is a project-related notification, the name of that project. Absent for org-level notifications (`project_limit`) */
|
|
4287
4744
|
projectName?: string;
|
|
4288
4745
|
/**
|
|
@@ -4294,8 +4751,9 @@ export interface components {
|
|
|
4294
4751
|
* @description Extra values, which differ by kind. `project_limit` is `{limit, count}`,
|
|
4295
4752
|
* a usage alert is `{bytes, capBytes}`, an operation alert is
|
|
4296
4753
|
* `{opId, opKind, reason?}`, `cron_failed` is
|
|
4297
|
-
* `{cron, reason, scheduledAt}`, `queue_failed` is `{queue, reason, runs}
|
|
4298
|
-
* `queue_ops_cap` is `{used, limit, plan}
|
|
4754
|
+
* `{cron, reason, scheduledAt}`, `queue_failed` is `{queue, reason, runs}`,
|
|
4755
|
+
* `queue_ops_cap` is `{used, limit, plan}` and `new_device` is
|
|
4756
|
+
* `{app, clientId, device}`.
|
|
4299
4757
|
*/
|
|
4300
4758
|
detail: {
|
|
4301
4759
|
[key: string]: unknown;
|
|
@@ -4394,7 +4852,7 @@ export interface components {
|
|
|
4394
4852
|
/** @description A deployment in the overview. Same shape as `Deployment`, including `actor`. */
|
|
4395
4853
|
OverviewDeployment: components["schemas"]["Deployment"];
|
|
4396
4854
|
OverviewDatabase: {
|
|
4397
|
-
/** @description Whether
|
|
4855
|
+
/** @description Whether the project has a database. Every project has one unless it was deleted. */
|
|
4398
4856
|
granted: boolean;
|
|
4399
4857
|
/**
|
|
4400
4858
|
* Format: date-time
|
|
@@ -4414,7 +4872,7 @@ export interface components {
|
|
|
4414
4872
|
*/
|
|
4415
4873
|
generations: number;
|
|
4416
4874
|
};
|
|
4417
|
-
/** @description Which
|
|
4875
|
+
/** @description Which of the project's resources are on. Every one is on unless somebody turned it off. */
|
|
4418
4876
|
OverviewFeatures: {
|
|
4419
4877
|
database: boolean;
|
|
4420
4878
|
storage: boolean;
|
|
@@ -4458,6 +4916,83 @@ export interface components {
|
|
|
4458
4916
|
*/
|
|
4459
4917
|
gitDirty?: boolean;
|
|
4460
4918
|
};
|
|
4919
|
+
/**
|
|
4920
|
+
* @description The one address Studio hands to a person who is not a developer
|
|
4921
|
+
* (`docs/studio.md §6.9`).
|
|
4922
|
+
*
|
|
4923
|
+
* A preview's own hostname is `<preview>--<project>.<org>.<app-domain>`. The `--` is what
|
|
4924
|
+
* keeps a preview name from colliding with a project name and it is right for a CLI user,
|
|
4925
|
+
* but it is not a link to send to somebody — and it carries the project's name, which the
|
|
4926
|
+
* author of a half-finished app may not want published. So a shared preview gets a second
|
|
4927
|
+
* hostname, and this is it.
|
|
4928
|
+
*
|
|
4929
|
+
* The label is 12 characters of lowercase base32 (`[a-z2-7]`, 60 bits). **It contains no
|
|
4930
|
+
* hyphen** — that is why the project name is not in it, since a slug may contain one — and
|
|
4931
|
+
* it is the only thing between the link and the app, so it is minted from a CSPRNG.
|
|
4932
|
+
*
|
|
4933
|
+
* It lives under `share.<app-domain>`, not under an org, so it cannot collide with a
|
|
4934
|
+
* project or preview name. `share` is a reserved org slug for that reason.
|
|
4935
|
+
*/
|
|
4936
|
+
ShareLink: {
|
|
4937
|
+
/** @description The 12-character label. Minted once and kept across shares. */
|
|
4938
|
+
label: string;
|
|
4939
|
+
/** @description `<label>.share.<app-domain>`. */
|
|
4940
|
+
hostname: string;
|
|
4941
|
+
/**
|
|
4942
|
+
* Format: uri
|
|
4943
|
+
* @description The address to hand out. Built by the server — the scheme and port are a deployment matter.
|
|
4944
|
+
*/
|
|
4945
|
+
url: string;
|
|
4946
|
+
/**
|
|
4947
|
+
* @description The preview the link currently resolves to (`studio`, or `studio-<branch>`).
|
|
4948
|
+
* Present so that "the link works but shows the wrong branch" is diagnosable.
|
|
4949
|
+
*/
|
|
4950
|
+
preview?: components["schemas"]["Slug"];
|
|
4951
|
+
/** Format: date-time */
|
|
4952
|
+
createdAt: string;
|
|
4953
|
+
/**
|
|
4954
|
+
* Format: date-time
|
|
4955
|
+
* @description When the label was last re-minted. Absent if it never was.
|
|
4956
|
+
*/
|
|
4957
|
+
rotatedAt?: string;
|
|
4958
|
+
};
|
|
4959
|
+
/**
|
|
4960
|
+
* @description Whether the control plane applied this deployment's `migrations/`, and how far it got.
|
|
4961
|
+
*
|
|
4962
|
+
* Present only on deployments the control plane migrates — today that is a preview
|
|
4963
|
+
* deployed with `db=branch`. Absent means the schema is the client's to apply, which is
|
|
4964
|
+
* what `runlot deploy` does.
|
|
4965
|
+
*
|
|
4966
|
+
* `applied` with `total: 0` is the answer for a bundle that carries no migrations at
|
|
4967
|
+
* all; it is a state rather than an absence so that a caller waiting on this can tell
|
|
4968
|
+
* "not started yet" from "there is nothing to run".
|
|
4969
|
+
*/
|
|
4970
|
+
DeploymentMigrations: {
|
|
4971
|
+
/**
|
|
4972
|
+
* @description `pending` — not started, or waiting for the preview's database branch to finish
|
|
4973
|
+
* being poured. A database that could not be reached also returns here, so that the
|
|
4974
|
+
* next sweep retries: an unreachable node is not a failed migration.
|
|
4975
|
+
*
|
|
4976
|
+
* `failed` — one file threw, and it is named in `failedName`. Nothing after it ran.
|
|
4977
|
+
* @enum {string}
|
|
4978
|
+
*/
|
|
4979
|
+
state: "pending" | "running" | "applied" | "failed";
|
|
4980
|
+
/** @description How many migration files the bundle carries. */
|
|
4981
|
+
total: number;
|
|
4982
|
+
/** @description How many of them went through. */
|
|
4983
|
+
applied: number;
|
|
4984
|
+
/** @description The file that threw, as `0003_posts`. Only on `failed`. */
|
|
4985
|
+
failedName?: string;
|
|
4986
|
+
/** @description The database's own message, truncated. Only on `failed`. */
|
|
4987
|
+
detail?: string;
|
|
4988
|
+
/** Format: date-time */
|
|
4989
|
+
startedAt: string;
|
|
4990
|
+
/**
|
|
4991
|
+
* Format: date-time
|
|
4992
|
+
* @description Absent while `pending` or `running`.
|
|
4993
|
+
*/
|
|
4994
|
+
finishedAt?: string;
|
|
4995
|
+
};
|
|
4461
4996
|
/**
|
|
4462
4997
|
* @description One preview of a project. A preview behaves like a project of its own — it has its
|
|
4463
4998
|
* own hostname, deployments, access policy and usage — and this schema carries what is
|
|
@@ -5923,9 +6458,98 @@ export interface components {
|
|
|
5923
6458
|
/** @description the most automatic top-ups that can run in one day */
|
|
5924
6459
|
autoTopupPerDay: number;
|
|
5925
6460
|
};
|
|
6461
|
+
StorageObject: {
|
|
6462
|
+
/**
|
|
6463
|
+
* @description The key as the worker writes it, without the internal project prefix.
|
|
6464
|
+
* @example avatars/a.png
|
|
6465
|
+
*/
|
|
6466
|
+
key: string;
|
|
6467
|
+
/** Format: int64 */
|
|
6468
|
+
size: number;
|
|
6469
|
+
/**
|
|
6470
|
+
* @description the stored content type
|
|
6471
|
+
* @example image/png
|
|
6472
|
+
*/
|
|
6473
|
+
type: string;
|
|
6474
|
+
/** Format: date-time */
|
|
6475
|
+
modified: string;
|
|
6476
|
+
/** @description Whether this key sits under one of the project's published prefixes. */
|
|
6477
|
+
public: boolean;
|
|
6478
|
+
/**
|
|
6479
|
+
* @description The unsigned public address, present only when `public` is true and this
|
|
6480
|
+
* installation has a public object front. It is never a signed URL.
|
|
6481
|
+
* @example https://objects.runlot.io/acme/app/avatars/a.png
|
|
6482
|
+
*/
|
|
6483
|
+
url?: string;
|
|
6484
|
+
};
|
|
6485
|
+
StorageObjectPage: {
|
|
6486
|
+
entries: components["schemas"]["StorageObject"][];
|
|
6487
|
+
/**
|
|
6488
|
+
* @description The directories one level under the requested prefix, each ending in `/`. Pass one back as `prefix`.
|
|
6489
|
+
* @example [
|
|
6490
|
+
* "avatars/",
|
|
6491
|
+
* "uploads/"
|
|
6492
|
+
* ]
|
|
6493
|
+
*/
|
|
6494
|
+
prefixes: string[];
|
|
6495
|
+
/** @description Pass it back to get the next page. Absent means the end. */
|
|
6496
|
+
cursor?: string;
|
|
6497
|
+
/** @description The project's published prefixes, carried on every page so a client can explain the `public` marks without a second call. */
|
|
6498
|
+
publicPrefixes: string[];
|
|
6499
|
+
/** @description `https://<objects host>/<org>/<project>`. Absent when this installation has no public object front. */
|
|
6500
|
+
publicBase?: string;
|
|
6501
|
+
};
|
|
6502
|
+
StorageObjectSigned: {
|
|
6503
|
+
key: string;
|
|
6504
|
+
/** @description A signed GET. Fetch it directly; the bytes do not pass through this API. */
|
|
6505
|
+
url: string;
|
|
6506
|
+
/**
|
|
6507
|
+
* Format: date-time
|
|
6508
|
+
* @description When the signature stops working. It travels with the URL so a client does not learn the lifetime from documentation and then cache past it.
|
|
6509
|
+
*/
|
|
6510
|
+
expiresAt: string;
|
|
6511
|
+
/** Format: int64 */
|
|
6512
|
+
size: number;
|
|
6513
|
+
type: string;
|
|
6514
|
+
/** Format: date-time */
|
|
6515
|
+
modified: string;
|
|
6516
|
+
public: boolean;
|
|
6517
|
+
};
|
|
6518
|
+
/** @description One end user of the app (`runlot_auth.users`, docs/auth.md §6). */
|
|
6519
|
+
AppUser: {
|
|
6520
|
+
/** Format: uuid */
|
|
6521
|
+
id: string;
|
|
6522
|
+
/** @description Lowercased. Empty for an account that has only a social identity. */
|
|
6523
|
+
email: string;
|
|
6524
|
+
name?: string;
|
|
6525
|
+
/** @description `password`, `github`, `google`, `kakao` … sorted, from the linked identities. */
|
|
6526
|
+
providers: string[];
|
|
6527
|
+
/** Format: date-time */
|
|
6528
|
+
createdAt: string;
|
|
6529
|
+
/**
|
|
6530
|
+
* Format: date-time
|
|
6531
|
+
* @description Absent for somebody who has never signed in.
|
|
6532
|
+
*/
|
|
6533
|
+
lastSignIn?: string;
|
|
6534
|
+
/** @description `banned_at` is set. Changing it is not on this surface. */
|
|
6535
|
+
blocked: boolean;
|
|
6536
|
+
/** @description **Live** sessions only. Expired rows stay until the sweeper runs and counting them would show a signed-out person as signed in. */
|
|
6537
|
+
sessions: number;
|
|
6538
|
+
};
|
|
6539
|
+
AppUserPage: {
|
|
6540
|
+
users: components["schemas"]["AppUser"][];
|
|
6541
|
+
/** @description Pass it back to get the next page. Absent means the end. */
|
|
6542
|
+
cursor?: string;
|
|
6543
|
+
};
|
|
5926
6544
|
AILedgerRow: {
|
|
5927
6545
|
/** @enum {string} */
|
|
5928
6546
|
kind: "call" | "topup" | "adjust";
|
|
6547
|
+
/**
|
|
6548
|
+
* @description Which caller spent it. It is present on every row including a top-up, where it
|
|
6549
|
+
* is `app` and means nothing.
|
|
6550
|
+
* @enum {string}
|
|
6551
|
+
*/
|
|
6552
|
+
lane: "app" | "dev" | "studio";
|
|
5929
6553
|
model?: string;
|
|
5930
6554
|
project?: string;
|
|
5931
6555
|
/** Format: int64 */
|
|
@@ -7177,6 +7801,327 @@ export interface operations {
|
|
|
7177
7801
|
};
|
|
7178
7802
|
};
|
|
7179
7803
|
};
|
|
7804
|
+
oauthMetadata: {
|
|
7805
|
+
parameters: {
|
|
7806
|
+
query?: never;
|
|
7807
|
+
header?: never;
|
|
7808
|
+
path?: never;
|
|
7809
|
+
cookie?: never;
|
|
7810
|
+
};
|
|
7811
|
+
requestBody?: never;
|
|
7812
|
+
responses: {
|
|
7813
|
+
/** @description The metadata document */
|
|
7814
|
+
200: {
|
|
7815
|
+
headers: {
|
|
7816
|
+
[name: string]: unknown;
|
|
7817
|
+
};
|
|
7818
|
+
content: {
|
|
7819
|
+
"application/json": {
|
|
7820
|
+
/** @example https://api.runlot.io */
|
|
7821
|
+
issuer: string;
|
|
7822
|
+
/** @example https://api.runlot.io/oauth/authorize */
|
|
7823
|
+
authorization_endpoint: string;
|
|
7824
|
+
/** @example https://api.runlot.io/oauth/token */
|
|
7825
|
+
token_endpoint: string;
|
|
7826
|
+
/** @example https://api.runlot.io/oauth/revoke */
|
|
7827
|
+
revocation_endpoint?: string;
|
|
7828
|
+
/** @example https://api.runlot.io/.well-known/jwks.json */
|
|
7829
|
+
jwks_uri: string;
|
|
7830
|
+
/**
|
|
7831
|
+
* @example [
|
|
7832
|
+
* "code"
|
|
7833
|
+
* ]
|
|
7834
|
+
*/
|
|
7835
|
+
response_types_supported?: string[];
|
|
7836
|
+
/**
|
|
7837
|
+
* @example [
|
|
7838
|
+
* "authorization_code",
|
|
7839
|
+
* "refresh_token"
|
|
7840
|
+
* ]
|
|
7841
|
+
*/
|
|
7842
|
+
grant_types_supported?: string[];
|
|
7843
|
+
/**
|
|
7844
|
+
* @description `S256` only. `plain` is not accepted and so is not advertised.
|
|
7845
|
+
* @example [
|
|
7846
|
+
* "S256"
|
|
7847
|
+
* ]
|
|
7848
|
+
*/
|
|
7849
|
+
code_challenge_methods_supported?: string[];
|
|
7850
|
+
/**
|
|
7851
|
+
* @description `none`: the clients are public and PKCE takes the secret's place.
|
|
7852
|
+
* @example [
|
|
7853
|
+
* "none"
|
|
7854
|
+
* ]
|
|
7855
|
+
*/
|
|
7856
|
+
token_endpoint_auth_methods_supported?: string[];
|
|
7857
|
+
scopes_supported?: components["schemas"]["ApiScope"][];
|
|
7858
|
+
/**
|
|
7859
|
+
* @example [
|
|
7860
|
+
* "EdDSA"
|
|
7861
|
+
* ]
|
|
7862
|
+
*/
|
|
7863
|
+
access_token_signing_alg_values_supported?: string[];
|
|
7864
|
+
/** @description The `aud` every access token carries, and the one a resource server must require. */
|
|
7865
|
+
runlot_access_token_audience?: string;
|
|
7866
|
+
} & {
|
|
7867
|
+
[key: string]: unknown;
|
|
7868
|
+
};
|
|
7869
|
+
};
|
|
7870
|
+
};
|
|
7871
|
+
/** @description Connected-app sign-in is not configured on this deployment */
|
|
7872
|
+
503: {
|
|
7873
|
+
headers: {
|
|
7874
|
+
[name: string]: unknown;
|
|
7875
|
+
};
|
|
7876
|
+
content: {
|
|
7877
|
+
"application/json": components["schemas"]["Error"];
|
|
7878
|
+
};
|
|
7879
|
+
};
|
|
7880
|
+
};
|
|
7881
|
+
};
|
|
7882
|
+
oauthJwks: {
|
|
7883
|
+
parameters: {
|
|
7884
|
+
query?: never;
|
|
7885
|
+
header?: never;
|
|
7886
|
+
path?: never;
|
|
7887
|
+
cookie?: never;
|
|
7888
|
+
};
|
|
7889
|
+
requestBody?: never;
|
|
7890
|
+
responses: {
|
|
7891
|
+
/** @description The key set */
|
|
7892
|
+
200: {
|
|
7893
|
+
headers: {
|
|
7894
|
+
[name: string]: unknown;
|
|
7895
|
+
};
|
|
7896
|
+
content: {
|
|
7897
|
+
"application/json": {
|
|
7898
|
+
keys: ({
|
|
7899
|
+
kid?: string;
|
|
7900
|
+
/** @example OKP */
|
|
7901
|
+
kty?: string;
|
|
7902
|
+
/** @example Ed25519 */
|
|
7903
|
+
crv?: string;
|
|
7904
|
+
/** @example EdDSA */
|
|
7905
|
+
alg?: string;
|
|
7906
|
+
/** @example sig */
|
|
7907
|
+
use?: string;
|
|
7908
|
+
/** @description base64url of the public key */
|
|
7909
|
+
x?: string;
|
|
7910
|
+
} & {
|
|
7911
|
+
[key: string]: unknown;
|
|
7912
|
+
})[];
|
|
7913
|
+
};
|
|
7914
|
+
};
|
|
7915
|
+
};
|
|
7916
|
+
};
|
|
7917
|
+
};
|
|
7918
|
+
oauthAuthorize: {
|
|
7919
|
+
parameters: {
|
|
7920
|
+
query?: never;
|
|
7921
|
+
header?: never;
|
|
7922
|
+
path?: never;
|
|
7923
|
+
cookie?: never;
|
|
7924
|
+
};
|
|
7925
|
+
requestBody: {
|
|
7926
|
+
content: {
|
|
7927
|
+
"application/json": {
|
|
7928
|
+
/** @example studio-desktop */
|
|
7929
|
+
client_id: string;
|
|
7930
|
+
/** @description Must be registered for the client. It is **not** echoed in a refusal — that would make the endpoint a probe for accepted redirects. */
|
|
7931
|
+
redirect_uri: string;
|
|
7932
|
+
/** @enum {string} */
|
|
7933
|
+
response_type?: "code";
|
|
7934
|
+
/**
|
|
7935
|
+
* @description Space-separated. Empty means the client's whole set. A scope the client does not carry is an error, never a silent drop.
|
|
7936
|
+
* @example project:read deploy repo:read repo:write db:read
|
|
7937
|
+
*/
|
|
7938
|
+
scope?: string;
|
|
7939
|
+
state?: string;
|
|
7940
|
+
code_challenge: string;
|
|
7941
|
+
/** @enum {string} */
|
|
7942
|
+
code_challenge_method: "S256";
|
|
7943
|
+
/**
|
|
7944
|
+
* @description Ours, not OAuth's: what Connected apps shows beside the client (docs/studio.md §8.1).
|
|
7945
|
+
* @example Ryan의 MacBook Pro
|
|
7946
|
+
*/
|
|
7947
|
+
device_name?: string;
|
|
7948
|
+
};
|
|
7949
|
+
};
|
|
7950
|
+
};
|
|
7951
|
+
responses: {
|
|
7952
|
+
/** @description Approved. The browser is sent to `redirect`. */
|
|
7953
|
+
200: {
|
|
7954
|
+
headers: {
|
|
7955
|
+
[name: string]: unknown;
|
|
7956
|
+
};
|
|
7957
|
+
content: {
|
|
7958
|
+
"application/json": {
|
|
7959
|
+
/** @description `redirect_uri` with `code` and `state`. */
|
|
7960
|
+
redirect: string;
|
|
7961
|
+
};
|
|
7962
|
+
};
|
|
7963
|
+
};
|
|
7964
|
+
400: components["responses"]["BadRequest"];
|
|
7965
|
+
401: components["responses"]["Unauthorized"];
|
|
7966
|
+
};
|
|
7967
|
+
};
|
|
7968
|
+
oauthToken: {
|
|
7969
|
+
parameters: {
|
|
7970
|
+
query?: never;
|
|
7971
|
+
header?: never;
|
|
7972
|
+
path?: never;
|
|
7973
|
+
cookie?: never;
|
|
7974
|
+
};
|
|
7975
|
+
requestBody: {
|
|
7976
|
+
content: {
|
|
7977
|
+
"application/x-www-form-urlencoded": {
|
|
7978
|
+
/** @enum {string} */
|
|
7979
|
+
grant_type: "authorization_code" | "refresh_token";
|
|
7980
|
+
client_id: string;
|
|
7981
|
+
/** @description `authorization_code` only. */
|
|
7982
|
+
code?: string;
|
|
7983
|
+
/** @description `authorization_code` only. PKCE, S256. */
|
|
7984
|
+
code_verifier?: string;
|
|
7985
|
+
/** @description `authorization_code` only. Must match the one the code was issued for. */
|
|
7986
|
+
redirect_uri?: string;
|
|
7987
|
+
/** @description `refresh_token` only. */
|
|
7988
|
+
refresh_token?: string;
|
|
7989
|
+
};
|
|
7990
|
+
};
|
|
7991
|
+
};
|
|
7992
|
+
responses: {
|
|
7993
|
+
/** @description A new access token, and the next refresh token */
|
|
7994
|
+
200: {
|
|
7995
|
+
headers: {
|
|
7996
|
+
"Cache-Control"?: string;
|
|
7997
|
+
[name: string]: unknown;
|
|
7998
|
+
};
|
|
7999
|
+
content: {
|
|
8000
|
+
"application/json": components["schemas"]["OAuthTokenResponse"];
|
|
8001
|
+
};
|
|
8002
|
+
};
|
|
8003
|
+
/** @description RFC 6749 §5.2 */
|
|
8004
|
+
400: {
|
|
8005
|
+
headers: {
|
|
8006
|
+
[name: string]: unknown;
|
|
8007
|
+
};
|
|
8008
|
+
content: {
|
|
8009
|
+
"application/json": components["schemas"]["OAuthError"];
|
|
8010
|
+
};
|
|
8011
|
+
};
|
|
8012
|
+
/** @description Too many attempts from this client or this address */
|
|
8013
|
+
429: {
|
|
8014
|
+
headers: {
|
|
8015
|
+
[name: string]: unknown;
|
|
8016
|
+
};
|
|
8017
|
+
content: {
|
|
8018
|
+
"application/json": components["schemas"]["OAuthError"];
|
|
8019
|
+
};
|
|
8020
|
+
};
|
|
8021
|
+
/** @description Connected-app sign-in is not configured on this deployment */
|
|
8022
|
+
503: {
|
|
8023
|
+
headers: {
|
|
8024
|
+
[name: string]: unknown;
|
|
8025
|
+
};
|
|
8026
|
+
content: {
|
|
8027
|
+
"application/json": components["schemas"]["OAuthError"];
|
|
8028
|
+
};
|
|
8029
|
+
};
|
|
8030
|
+
};
|
|
8031
|
+
};
|
|
8032
|
+
oauthRevoke: {
|
|
8033
|
+
parameters: {
|
|
8034
|
+
query?: never;
|
|
8035
|
+
header?: never;
|
|
8036
|
+
path?: never;
|
|
8037
|
+
cookie?: never;
|
|
8038
|
+
};
|
|
8039
|
+
requestBody: {
|
|
8040
|
+
content: {
|
|
8041
|
+
"application/x-www-form-urlencoded": {
|
|
8042
|
+
/** @description A refresh token or an access token. */
|
|
8043
|
+
token: string;
|
|
8044
|
+
/** @enum {string} */
|
|
8045
|
+
token_type_hint?: "refresh_token" | "access_token";
|
|
8046
|
+
client_id?: string;
|
|
8047
|
+
};
|
|
8048
|
+
};
|
|
8049
|
+
};
|
|
8050
|
+
responses: {
|
|
8051
|
+
/** @description Revoked, or the token was unknown — the two are deliberately the same answer */
|
|
8052
|
+
200: {
|
|
8053
|
+
headers: {
|
|
8054
|
+
"Cache-Control"?: string;
|
|
8055
|
+
[name: string]: unknown;
|
|
8056
|
+
};
|
|
8057
|
+
content?: never;
|
|
8058
|
+
};
|
|
8059
|
+
/** @description RFC 6749 §5.2 */
|
|
8060
|
+
400: {
|
|
8061
|
+
headers: {
|
|
8062
|
+
[name: string]: unknown;
|
|
8063
|
+
};
|
|
8064
|
+
content: {
|
|
8065
|
+
"application/json": components["schemas"]["OAuthError"];
|
|
8066
|
+
};
|
|
8067
|
+
};
|
|
8068
|
+
/** @description Too many attempts from this client or this address */
|
|
8069
|
+
429: {
|
|
8070
|
+
headers: {
|
|
8071
|
+
[name: string]: unknown;
|
|
8072
|
+
};
|
|
8073
|
+
content: {
|
|
8074
|
+
"application/json": components["schemas"]["OAuthError"];
|
|
8075
|
+
};
|
|
8076
|
+
};
|
|
8077
|
+
};
|
|
8078
|
+
};
|
|
8079
|
+
listOAuthGrants: {
|
|
8080
|
+
parameters: {
|
|
8081
|
+
query?: never;
|
|
8082
|
+
header?: never;
|
|
8083
|
+
path?: never;
|
|
8084
|
+
cookie?: never;
|
|
8085
|
+
};
|
|
8086
|
+
requestBody?: never;
|
|
8087
|
+
responses: {
|
|
8088
|
+
/** @description The grants */
|
|
8089
|
+
200: {
|
|
8090
|
+
headers: {
|
|
8091
|
+
[name: string]: unknown;
|
|
8092
|
+
};
|
|
8093
|
+
content: {
|
|
8094
|
+
"application/json": {
|
|
8095
|
+
grants: components["schemas"]["OAuthGrant"][];
|
|
8096
|
+
};
|
|
8097
|
+
};
|
|
8098
|
+
};
|
|
8099
|
+
401: components["responses"]["Unauthorized"];
|
|
8100
|
+
};
|
|
8101
|
+
};
|
|
8102
|
+
revokeOAuthGrant: {
|
|
8103
|
+
parameters: {
|
|
8104
|
+
query?: never;
|
|
8105
|
+
header?: never;
|
|
8106
|
+
path: {
|
|
8107
|
+
/** @description The grant's session id, as `GET /v1/oauth/grants` returned it. */
|
|
8108
|
+
sid: string;
|
|
8109
|
+
};
|
|
8110
|
+
cookie?: never;
|
|
8111
|
+
};
|
|
8112
|
+
requestBody?: never;
|
|
8113
|
+
responses: {
|
|
8114
|
+
/** @description Removed */
|
|
8115
|
+
204: {
|
|
8116
|
+
headers: {
|
|
8117
|
+
[name: string]: unknown;
|
|
8118
|
+
};
|
|
8119
|
+
content?: never;
|
|
8120
|
+
};
|
|
8121
|
+
401: components["responses"]["Unauthorized"];
|
|
8122
|
+
404: components["responses"]["NotFound"];
|
|
8123
|
+
};
|
|
8124
|
+
};
|
|
7180
8125
|
getMe: {
|
|
7181
8126
|
parameters: {
|
|
7182
8127
|
query?: never;
|
|
@@ -7848,6 +8793,34 @@ export interface operations {
|
|
|
7848
8793
|
};
|
|
7849
8794
|
};
|
|
7850
8795
|
};
|
|
8796
|
+
getDeployment: {
|
|
8797
|
+
parameters: {
|
|
8798
|
+
query?: never;
|
|
8799
|
+
header?: never;
|
|
8800
|
+
path: {
|
|
8801
|
+
orgSlug: components["parameters"]["OrgSlug"];
|
|
8802
|
+
projectName: components["parameters"]["ProjectName"];
|
|
8803
|
+
deploymentId: string;
|
|
8804
|
+
};
|
|
8805
|
+
cookie?: never;
|
|
8806
|
+
};
|
|
8807
|
+
requestBody?: never;
|
|
8808
|
+
responses: {
|
|
8809
|
+
/** @description The deployment */
|
|
8810
|
+
200: {
|
|
8811
|
+
headers: {
|
|
8812
|
+
[name: string]: unknown;
|
|
8813
|
+
};
|
|
8814
|
+
content: {
|
|
8815
|
+
"application/json": components["schemas"]["Deployment"] & {
|
|
8816
|
+
migrations?: components["schemas"]["DeploymentMigrations"];
|
|
8817
|
+
};
|
|
8818
|
+
};
|
|
8819
|
+
};
|
|
8820
|
+
403: components["responses"]["Forbidden"];
|
|
8821
|
+
404: components["responses"]["NotFound"];
|
|
8822
|
+
};
|
|
8823
|
+
};
|
|
7851
8824
|
getProjectCron: {
|
|
7852
8825
|
parameters: {
|
|
7853
8826
|
query?: {
|
|
@@ -8488,7 +9461,19 @@ export interface operations {
|
|
|
8488
9461
|
"application/json": components["schemas"]["Error"];
|
|
8489
9462
|
};
|
|
8490
9463
|
};
|
|
8491
|
-
|
|
9464
|
+
/**
|
|
9465
|
+
* @description `insufficient_scope` — the token carries neither `db:read` nor a wider scope; or
|
|
9466
|
+
* `console_write_needs_session` — `readOnly: false` from something other than a
|
|
9467
|
+
* dashboard session.
|
|
9468
|
+
*/
|
|
9469
|
+
403: {
|
|
9470
|
+
headers: {
|
|
9471
|
+
[name: string]: unknown;
|
|
9472
|
+
};
|
|
9473
|
+
content: {
|
|
9474
|
+
"application/json": components["schemas"]["Error"];
|
|
9475
|
+
};
|
|
9476
|
+
};
|
|
8492
9477
|
404: components["responses"]["NotFound"];
|
|
8493
9478
|
/** @description could not reach this project's database (`console_unreachable`) */
|
|
8494
9479
|
502: {
|
|
@@ -9129,10 +10114,100 @@ export interface operations {
|
|
|
9129
10114
|
headers: {
|
|
9130
10115
|
[name: string]: unknown;
|
|
9131
10116
|
};
|
|
9132
|
-
content?: never;
|
|
10117
|
+
content?: never;
|
|
10118
|
+
};
|
|
10119
|
+
403: components["responses"]["Forbidden"];
|
|
10120
|
+
404: components["responses"]["NotFound"];
|
|
10121
|
+
/** @description `no_core` — the service is temporarily unavailable */
|
|
10122
|
+
503: {
|
|
10123
|
+
headers: {
|
|
10124
|
+
[name: string]: unknown;
|
|
10125
|
+
};
|
|
10126
|
+
content: {
|
|
10127
|
+
"application/json": components["schemas"]["Error"];
|
|
10128
|
+
};
|
|
10129
|
+
};
|
|
10130
|
+
};
|
|
10131
|
+
};
|
|
10132
|
+
listStoragePublic: {
|
|
10133
|
+
parameters: {
|
|
10134
|
+
query?: never;
|
|
10135
|
+
header?: never;
|
|
10136
|
+
path: {
|
|
10137
|
+
orgSlug: components["parameters"]["OrgSlug"];
|
|
10138
|
+
projectName: components["parameters"]["ProjectName"];
|
|
10139
|
+
};
|
|
10140
|
+
cookie?: never;
|
|
10141
|
+
};
|
|
10142
|
+
requestBody?: never;
|
|
10143
|
+
responses: {
|
|
10144
|
+
/** @description The list */
|
|
10145
|
+
200: {
|
|
10146
|
+
headers: {
|
|
10147
|
+
[name: string]: unknown;
|
|
10148
|
+
};
|
|
10149
|
+
content: {
|
|
10150
|
+
"application/json": components["schemas"]["StoragePublicList"];
|
|
10151
|
+
};
|
|
10152
|
+
};
|
|
10153
|
+
403: components["responses"]["Forbidden"];
|
|
10154
|
+
404: components["responses"]["NotFound"];
|
|
10155
|
+
/** @description `no_core` — the service is temporarily unavailable */
|
|
10156
|
+
503: {
|
|
10157
|
+
headers: {
|
|
10158
|
+
[name: string]: unknown;
|
|
10159
|
+
};
|
|
10160
|
+
content: {
|
|
10161
|
+
"application/json": components["schemas"]["Error"];
|
|
10162
|
+
};
|
|
10163
|
+
};
|
|
10164
|
+
};
|
|
10165
|
+
};
|
|
10166
|
+
addStoragePublic: {
|
|
10167
|
+
parameters: {
|
|
10168
|
+
query?: never;
|
|
10169
|
+
header?: never;
|
|
10170
|
+
path: {
|
|
10171
|
+
orgSlug: components["parameters"]["OrgSlug"];
|
|
10172
|
+
projectName: components["parameters"]["ProjectName"];
|
|
10173
|
+
};
|
|
10174
|
+
cookie?: never;
|
|
10175
|
+
};
|
|
10176
|
+
requestBody: {
|
|
10177
|
+
content: {
|
|
10178
|
+
"application/json": components["schemas"]["StoragePublicRequest"];
|
|
10179
|
+
};
|
|
10180
|
+
};
|
|
10181
|
+
responses: {
|
|
10182
|
+
/** @description The list after the change */
|
|
10183
|
+
200: {
|
|
10184
|
+
headers: {
|
|
10185
|
+
[name: string]: unknown;
|
|
10186
|
+
};
|
|
10187
|
+
content: {
|
|
10188
|
+
"application/json": components["schemas"]["StoragePublicList"];
|
|
10189
|
+
};
|
|
10190
|
+
};
|
|
10191
|
+
/** @description The prefix is empty, not normalizable, or would leave the project's slice */
|
|
10192
|
+
400: {
|
|
10193
|
+
headers: {
|
|
10194
|
+
[name: string]: unknown;
|
|
10195
|
+
};
|
|
10196
|
+
content: {
|
|
10197
|
+
"application/json": components["schemas"]["Error"];
|
|
10198
|
+
};
|
|
10199
|
+
};
|
|
10200
|
+
403: components["responses"]["Forbidden"];
|
|
10201
|
+
404: components["responses"]["NotFound"];
|
|
10202
|
+
/** @description `storage_not_granted`, or `too_many_public_prefixes` */
|
|
10203
|
+
409: {
|
|
10204
|
+
headers: {
|
|
10205
|
+
[name: string]: unknown;
|
|
10206
|
+
};
|
|
10207
|
+
content: {
|
|
10208
|
+
"application/json": components["schemas"]["Error"];
|
|
10209
|
+
};
|
|
9133
10210
|
};
|
|
9134
|
-
403: components["responses"]["Forbidden"];
|
|
9135
|
-
404: components["responses"]["NotFound"];
|
|
9136
10211
|
/** @description `no_core` — the service is temporarily unavailable */
|
|
9137
10212
|
503: {
|
|
9138
10213
|
headers: {
|
|
@@ -9144,7 +10219,7 @@ export interface operations {
|
|
|
9144
10219
|
};
|
|
9145
10220
|
};
|
|
9146
10221
|
};
|
|
9147
|
-
|
|
10222
|
+
removeStoragePublic: {
|
|
9148
10223
|
parameters: {
|
|
9149
10224
|
query?: never;
|
|
9150
10225
|
header?: never;
|
|
@@ -9154,9 +10229,13 @@ export interface operations {
|
|
|
9154
10229
|
};
|
|
9155
10230
|
cookie?: never;
|
|
9156
10231
|
};
|
|
9157
|
-
requestBody
|
|
10232
|
+
requestBody: {
|
|
10233
|
+
content: {
|
|
10234
|
+
"application/json": components["schemas"]["StoragePublicRequest"];
|
|
10235
|
+
};
|
|
10236
|
+
};
|
|
9158
10237
|
responses: {
|
|
9159
|
-
/** @description The list */
|
|
10238
|
+
/** @description The list after the change */
|
|
9160
10239
|
200: {
|
|
9161
10240
|
headers: {
|
|
9162
10241
|
[name: string]: unknown;
|
|
@@ -9165,6 +10244,15 @@ export interface operations {
|
|
|
9165
10244
|
"application/json": components["schemas"]["StoragePublicList"];
|
|
9166
10245
|
};
|
|
9167
10246
|
};
|
|
10247
|
+
/** @description The prefix is empty or not normalizable */
|
|
10248
|
+
400: {
|
|
10249
|
+
headers: {
|
|
10250
|
+
[name: string]: unknown;
|
|
10251
|
+
};
|
|
10252
|
+
content: {
|
|
10253
|
+
"application/json": components["schemas"]["Error"];
|
|
10254
|
+
};
|
|
10255
|
+
};
|
|
9168
10256
|
403: components["responses"]["Forbidden"];
|
|
9169
10257
|
404: components["responses"]["NotFound"];
|
|
9170
10258
|
/** @description `no_core` — the service is temporarily unavailable */
|
|
@@ -9178,9 +10266,16 @@ export interface operations {
|
|
|
9178
10266
|
};
|
|
9179
10267
|
};
|
|
9180
10268
|
};
|
|
9181
|
-
|
|
10269
|
+
listStorageObjects: {
|
|
9182
10270
|
parameters: {
|
|
9183
|
-
query?:
|
|
10271
|
+
query?: {
|
|
10272
|
+
/** @description Key prefix to list under. It is normalized the same way a published prefix is: `assets` becomes `assets/`, and empty means the project root. */
|
|
10273
|
+
prefix?: string;
|
|
10274
|
+
/** @description the `cursor` of the previous page */
|
|
10275
|
+
cursor?: string;
|
|
10276
|
+
/** @description entries plus prefixes on one page */
|
|
10277
|
+
limit?: number;
|
|
10278
|
+
};
|
|
9184
10279
|
header?: never;
|
|
9185
10280
|
path: {
|
|
9186
10281
|
orgSlug: components["parameters"]["OrgSlug"];
|
|
@@ -9188,22 +10283,18 @@ export interface operations {
|
|
|
9188
10283
|
};
|
|
9189
10284
|
cookie?: never;
|
|
9190
10285
|
};
|
|
9191
|
-
requestBody
|
|
9192
|
-
content: {
|
|
9193
|
-
"application/json": components["schemas"]["StoragePublicRequest"];
|
|
9194
|
-
};
|
|
9195
|
-
};
|
|
10286
|
+
requestBody?: never;
|
|
9196
10287
|
responses: {
|
|
9197
|
-
/** @description
|
|
10288
|
+
/** @description One page */
|
|
9198
10289
|
200: {
|
|
9199
10290
|
headers: {
|
|
9200
10291
|
[name: string]: unknown;
|
|
9201
10292
|
};
|
|
9202
10293
|
content: {
|
|
9203
|
-
"application/json": components["schemas"]["
|
|
10294
|
+
"application/json": components["schemas"]["StorageObjectPage"];
|
|
9204
10295
|
};
|
|
9205
10296
|
};
|
|
9206
|
-
/** @description
|
|
10297
|
+
/** @description `prefix` is not normalizable, or `limit` is out of range */
|
|
9207
10298
|
400: {
|
|
9208
10299
|
headers: {
|
|
9209
10300
|
[name: string]: unknown;
|
|
@@ -9214,7 +10305,7 @@ export interface operations {
|
|
|
9214
10305
|
};
|
|
9215
10306
|
403: components["responses"]["Forbidden"];
|
|
9216
10307
|
404: components["responses"]["NotFound"];
|
|
9217
|
-
/** @description `storage_not_granted
|
|
10308
|
+
/** @description `storage_not_granted` — this project has no file storage */
|
|
9218
10309
|
409: {
|
|
9219
10310
|
headers: {
|
|
9220
10311
|
[name: string]: unknown;
|
|
@@ -9223,7 +10314,16 @@ export interface operations {
|
|
|
9223
10314
|
"application/json": components["schemas"]["Error"];
|
|
9224
10315
|
};
|
|
9225
10316
|
};
|
|
9226
|
-
/** @description `
|
|
10317
|
+
/** @description `objects_unreachable` — the object store did not answer */
|
|
10318
|
+
502: {
|
|
10319
|
+
headers: {
|
|
10320
|
+
[name: string]: unknown;
|
|
10321
|
+
};
|
|
10322
|
+
content: {
|
|
10323
|
+
"application/json": components["schemas"]["Error"];
|
|
10324
|
+
};
|
|
10325
|
+
};
|
|
10326
|
+
/** @description `objects_unavailable` — this installation has no object store; or `no_core` */
|
|
9227
10327
|
503: {
|
|
9228
10328
|
headers: {
|
|
9229
10329
|
[name: string]: unknown;
|
|
@@ -9234,32 +10334,30 @@ export interface operations {
|
|
|
9234
10334
|
};
|
|
9235
10335
|
};
|
|
9236
10336
|
};
|
|
9237
|
-
|
|
10337
|
+
signStorageObject: {
|
|
9238
10338
|
parameters: {
|
|
9239
10339
|
query?: never;
|
|
9240
10340
|
header?: never;
|
|
9241
10341
|
path: {
|
|
9242
10342
|
orgSlug: components["parameters"]["OrgSlug"];
|
|
9243
10343
|
projectName: components["parameters"]["ProjectName"];
|
|
10344
|
+
/** @description The object key. It may contain `/`; the segments are part of the path. */
|
|
10345
|
+
key: string;
|
|
9244
10346
|
};
|
|
9245
10347
|
cookie?: never;
|
|
9246
10348
|
};
|
|
9247
|
-
requestBody
|
|
9248
|
-
content: {
|
|
9249
|
-
"application/json": components["schemas"]["StoragePublicRequest"];
|
|
9250
|
-
};
|
|
9251
|
-
};
|
|
10349
|
+
requestBody?: never;
|
|
9252
10350
|
responses: {
|
|
9253
|
-
/** @description The
|
|
10351
|
+
/** @description The signed URL and the object's metadata */
|
|
9254
10352
|
200: {
|
|
9255
10353
|
headers: {
|
|
9256
10354
|
[name: string]: unknown;
|
|
9257
10355
|
};
|
|
9258
10356
|
content: {
|
|
9259
|
-
"application/json": components["schemas"]["
|
|
10357
|
+
"application/json": components["schemas"]["StorageObjectSigned"];
|
|
9260
10358
|
};
|
|
9261
10359
|
};
|
|
9262
|
-
/** @description
|
|
10360
|
+
/** @description the key is empty, escapes the project prefix, or is over 1024 bytes */
|
|
9263
10361
|
400: {
|
|
9264
10362
|
headers: {
|
|
9265
10363
|
[name: string]: unknown;
|
|
@@ -9270,7 +10368,16 @@ export interface operations {
|
|
|
9270
10368
|
};
|
|
9271
10369
|
403: components["responses"]["Forbidden"];
|
|
9272
10370
|
404: components["responses"]["NotFound"];
|
|
9273
|
-
/** @description `
|
|
10371
|
+
/** @description `storage_not_granted` — this project has no file storage */
|
|
10372
|
+
409: {
|
|
10373
|
+
headers: {
|
|
10374
|
+
[name: string]: unknown;
|
|
10375
|
+
};
|
|
10376
|
+
content: {
|
|
10377
|
+
"application/json": components["schemas"]["Error"];
|
|
10378
|
+
};
|
|
10379
|
+
};
|
|
10380
|
+
/** @description `objects_unavailable` — this installation has no object store; or `no_core` */
|
|
9274
10381
|
503: {
|
|
9275
10382
|
headers: {
|
|
9276
10383
|
[name: string]: unknown;
|
|
@@ -9443,6 +10550,25 @@ export interface operations {
|
|
|
9443
10550
|
limit?: number;
|
|
9444
10551
|
/** @description rows before this ledger_id */
|
|
9445
10552
|
before?: number;
|
|
10553
|
+
/**
|
|
10554
|
+
* @description Only rows spent by this lane. `app` is the deployed worker's `env.ai`, `dev` is
|
|
10555
|
+
* the same app running on a developer's machine or tab, and `studio` is Studio's
|
|
10556
|
+
* own agent turns. Absent means every lane; an unknown value is a 400 rather than
|
|
10557
|
+
* an empty page.
|
|
10558
|
+
*/
|
|
10559
|
+
lane?: "app" | "dev" | "studio";
|
|
10560
|
+
/**
|
|
10561
|
+
* @description Only rows of this kind. `kind=topup&limit=1` is the last top-up, which is
|
|
10562
|
+
* otherwise an unbounded walk backwards through a busy day's calls. An unknown
|
|
10563
|
+
* value is a 400.
|
|
10564
|
+
*/
|
|
10565
|
+
kind?: "call" | "topup" | "adjust";
|
|
10566
|
+
/**
|
|
10567
|
+
* @description Only rows at or after this instant (RFC 3339). It is an instant and not a
|
|
10568
|
+
* date on purpose: the day boundary belongs to the caller, whose midnight is
|
|
10569
|
+
* their own zone's. A value that is not RFC 3339 is a 400.
|
|
10570
|
+
*/
|
|
10571
|
+
since?: string;
|
|
9446
10572
|
};
|
|
9447
10573
|
header?: never;
|
|
9448
10574
|
path: {
|
|
@@ -10000,8 +11126,8 @@ export interface operations {
|
|
|
10000
11126
|
403: components["responses"]["Forbidden"];
|
|
10001
11127
|
404: components["responses"]["NotFound"];
|
|
10002
11128
|
/**
|
|
10003
|
-
* @description `database_required` — this project
|
|
10004
|
-
*
|
|
11129
|
+
* @description `database_required` — this project's database was deleted.
|
|
11130
|
+
* Create a new one with `POST …/database` (`runlot pg on`).
|
|
10005
11131
|
*/
|
|
10006
11132
|
409: {
|
|
10007
11133
|
headers: {
|
|
@@ -10196,6 +11322,110 @@ export interface operations {
|
|
|
10196
11322
|
};
|
|
10197
11323
|
};
|
|
10198
11324
|
};
|
|
11325
|
+
listAppUsers: {
|
|
11326
|
+
parameters: {
|
|
11327
|
+
query?: {
|
|
11328
|
+
/** @description matches the email or the name, case-insensitively */
|
|
11329
|
+
search?: string;
|
|
11330
|
+
/** @description the `cursor` of the previous page */
|
|
11331
|
+
cursor?: string;
|
|
11332
|
+
limit?: number;
|
|
11333
|
+
};
|
|
11334
|
+
header?: never;
|
|
11335
|
+
path: {
|
|
11336
|
+
orgSlug: components["parameters"]["OrgSlug"];
|
|
11337
|
+
projectName: components["parameters"]["ProjectName"];
|
|
11338
|
+
};
|
|
11339
|
+
cookie?: never;
|
|
11340
|
+
};
|
|
11341
|
+
requestBody?: never;
|
|
11342
|
+
responses: {
|
|
11343
|
+
/** @description One page */
|
|
11344
|
+
200: {
|
|
11345
|
+
headers: {
|
|
11346
|
+
[name: string]: unknown;
|
|
11347
|
+
};
|
|
11348
|
+
content: {
|
|
11349
|
+
"application/json": components["schemas"]["AppUserPage"];
|
|
11350
|
+
};
|
|
11351
|
+
};
|
|
11352
|
+
/** @description `cursor` is not one this endpoint issued, or `limit` is out of range */
|
|
11353
|
+
400: {
|
|
11354
|
+
headers: {
|
|
11355
|
+
[name: string]: unknown;
|
|
11356
|
+
};
|
|
11357
|
+
content: {
|
|
11358
|
+
"application/json": components["schemas"]["Error"];
|
|
11359
|
+
};
|
|
11360
|
+
};
|
|
11361
|
+
403: components["responses"]["Forbidden"];
|
|
11362
|
+
/** @description no such project, or the project has no database (so it can have no users) */
|
|
11363
|
+
404: {
|
|
11364
|
+
headers: {
|
|
11365
|
+
[name: string]: unknown;
|
|
11366
|
+
};
|
|
11367
|
+
content: {
|
|
11368
|
+
"application/json": components["schemas"]["Error"];
|
|
11369
|
+
};
|
|
11370
|
+
};
|
|
11371
|
+
/** @description could not reach this project's database (`console_unreachable`) */
|
|
11372
|
+
502: {
|
|
11373
|
+
headers: {
|
|
11374
|
+
[name: string]: unknown;
|
|
11375
|
+
};
|
|
11376
|
+
content?: never;
|
|
11377
|
+
};
|
|
11378
|
+
/** @description the database did not answer within the round-trip deadline (`console_timeout`) */
|
|
11379
|
+
504: {
|
|
11380
|
+
headers: {
|
|
11381
|
+
[name: string]: unknown;
|
|
11382
|
+
};
|
|
11383
|
+
content?: never;
|
|
11384
|
+
};
|
|
11385
|
+
};
|
|
11386
|
+
};
|
|
11387
|
+
getAppUser: {
|
|
11388
|
+
parameters: {
|
|
11389
|
+
query?: never;
|
|
11390
|
+
header?: never;
|
|
11391
|
+
path: {
|
|
11392
|
+
orgSlug: components["parameters"]["OrgSlug"];
|
|
11393
|
+
projectName: components["parameters"]["ProjectName"];
|
|
11394
|
+
userId: string;
|
|
11395
|
+
};
|
|
11396
|
+
cookie?: never;
|
|
11397
|
+
};
|
|
11398
|
+
requestBody?: never;
|
|
11399
|
+
responses: {
|
|
11400
|
+
/** @description The user */
|
|
11401
|
+
200: {
|
|
11402
|
+
headers: {
|
|
11403
|
+
[name: string]: unknown;
|
|
11404
|
+
};
|
|
11405
|
+
content: {
|
|
11406
|
+
"application/json": components["schemas"]["AppUser"];
|
|
11407
|
+
};
|
|
11408
|
+
};
|
|
11409
|
+
/** @description `userId` is not a uuid */
|
|
11410
|
+
400: {
|
|
11411
|
+
headers: {
|
|
11412
|
+
[name: string]: unknown;
|
|
11413
|
+
};
|
|
11414
|
+
content: {
|
|
11415
|
+
"application/json": components["schemas"]["Error"];
|
|
11416
|
+
};
|
|
11417
|
+
};
|
|
11418
|
+
403: components["responses"]["Forbidden"];
|
|
11419
|
+
404: components["responses"]["NotFound"];
|
|
11420
|
+
/** @description could not reach this project's database (`console_unreachable`) */
|
|
11421
|
+
502: {
|
|
11422
|
+
headers: {
|
|
11423
|
+
[name: string]: unknown;
|
|
11424
|
+
};
|
|
11425
|
+
content?: never;
|
|
11426
|
+
};
|
|
11427
|
+
};
|
|
11428
|
+
};
|
|
10199
11429
|
getAccess: {
|
|
10200
11430
|
parameters: {
|
|
10201
11431
|
query?: never;
|
|
@@ -12772,5 +14002,103 @@ export interface operations {
|
|
|
12772
14002
|
};
|
|
12773
14003
|
};
|
|
12774
14004
|
};
|
|
14005
|
+
getShareLink: {
|
|
14006
|
+
parameters: {
|
|
14007
|
+
query?: never;
|
|
14008
|
+
header?: never;
|
|
14009
|
+
path: {
|
|
14010
|
+
orgSlug: components["parameters"]["OrgSlug"];
|
|
14011
|
+
projectName: components["parameters"]["ProjectName"];
|
|
14012
|
+
};
|
|
14013
|
+
cookie?: never;
|
|
14014
|
+
};
|
|
14015
|
+
requestBody?: never;
|
|
14016
|
+
responses: {
|
|
14017
|
+
/** @description The share link */
|
|
14018
|
+
200: {
|
|
14019
|
+
headers: {
|
|
14020
|
+
[name: string]: unknown;
|
|
14021
|
+
};
|
|
14022
|
+
content: {
|
|
14023
|
+
"application/json": components["schemas"]["ShareLink"];
|
|
14024
|
+
};
|
|
14025
|
+
};
|
|
14026
|
+
403: components["responses"]["Forbidden"];
|
|
14027
|
+
404: components["responses"]["NotFound"];
|
|
14028
|
+
};
|
|
14029
|
+
};
|
|
14030
|
+
putShareLink: {
|
|
14031
|
+
parameters: {
|
|
14032
|
+
query?: never;
|
|
14033
|
+
header?: never;
|
|
14034
|
+
path: {
|
|
14035
|
+
orgSlug: components["parameters"]["OrgSlug"];
|
|
14036
|
+
projectName: components["parameters"]["ProjectName"];
|
|
14037
|
+
};
|
|
14038
|
+
cookie?: never;
|
|
14039
|
+
};
|
|
14040
|
+
requestBody?: {
|
|
14041
|
+
content: {
|
|
14042
|
+
"application/json": {
|
|
14043
|
+
/**
|
|
14044
|
+
* @description Which preview the link resolves to. Default `studio` — the single slug
|
|
14045
|
+
* Studio shares `main` from, which is what makes every share of main count
|
|
14046
|
+
* as one preview against the plan.
|
|
14047
|
+
*/
|
|
14048
|
+
preview?: components["schemas"]["Slug"];
|
|
14049
|
+
/**
|
|
14050
|
+
* @description Mint a new label and retire the old one.
|
|
14051
|
+
* @default false
|
|
14052
|
+
*/
|
|
14053
|
+
rotate?: boolean;
|
|
14054
|
+
};
|
|
14055
|
+
};
|
|
14056
|
+
};
|
|
14057
|
+
responses: {
|
|
14058
|
+
/** @description The share link */
|
|
14059
|
+
200: {
|
|
14060
|
+
headers: {
|
|
14061
|
+
[name: string]: unknown;
|
|
14062
|
+
};
|
|
14063
|
+
content: {
|
|
14064
|
+
"application/json": components["schemas"]["ShareLink"];
|
|
14065
|
+
};
|
|
14066
|
+
};
|
|
14067
|
+
400: components["responses"]["BadRequest"];
|
|
14068
|
+
403: components["responses"]["Forbidden"];
|
|
14069
|
+
/** @description The project, or the named preview, does not exist */
|
|
14070
|
+
404: {
|
|
14071
|
+
headers: {
|
|
14072
|
+
[name: string]: unknown;
|
|
14073
|
+
};
|
|
14074
|
+
content: {
|
|
14075
|
+
"application/json": components["schemas"]["Error"];
|
|
14076
|
+
};
|
|
14077
|
+
};
|
|
14078
|
+
};
|
|
14079
|
+
};
|
|
14080
|
+
deleteShareLink: {
|
|
14081
|
+
parameters: {
|
|
14082
|
+
query?: never;
|
|
14083
|
+
header?: never;
|
|
14084
|
+
path: {
|
|
14085
|
+
orgSlug: components["parameters"]["OrgSlug"];
|
|
14086
|
+
projectName: components["parameters"]["ProjectName"];
|
|
14087
|
+
};
|
|
14088
|
+
cookie?: never;
|
|
14089
|
+
};
|
|
14090
|
+
requestBody?: never;
|
|
14091
|
+
responses: {
|
|
14092
|
+
/** @description No longer shared */
|
|
14093
|
+
204: {
|
|
14094
|
+
headers: {
|
|
14095
|
+
[name: string]: unknown;
|
|
14096
|
+
};
|
|
14097
|
+
content?: never;
|
|
14098
|
+
};
|
|
14099
|
+
403: components["responses"]["Forbidden"];
|
|
14100
|
+
404: components["responses"]["NotFound"];
|
|
14101
|
+
};
|
|
14102
|
+
};
|
|
12775
14103
|
}
|
|
12776
14104
|
//# sourceMappingURL=schema.d.ts.map
|