@runlot/api 0.1.0-rc.206 → 0.1.0-rc.209

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/schema.d.ts CHANGED
@@ -839,6 +839,51 @@ export interface paths {
839
839
  patch?: never;
840
840
  trace?: never;
841
841
  };
842
+ "/v1/me/heard-from": {
843
+ parameters: {
844
+ query?: never;
845
+ header?: never;
846
+ path?: never;
847
+ cookie?: never;
848
+ };
849
+ get?: never;
850
+ /**
851
+ * Answer, or dismiss, "How did you hear about Runlot?"
852
+ * @description Asked once per account. An empty `answer` dismisses the question. Only the first call
853
+ * is stored; later calls change nothing and still answer 204. The answer is kept in the
854
+ * account record for the operator and is not sent to product analytics.
855
+ */
856
+ put: operations["answerHeardFrom"];
857
+ post?: never;
858
+ delete?: never;
859
+ options?: never;
860
+ head?: never;
861
+ patch?: never;
862
+ trace?: never;
863
+ };
864
+ "/v1/me/marketing-consent": {
865
+ parameters: {
866
+ query?: never;
867
+ header?: never;
868
+ path?: never;
869
+ cookie?: never;
870
+ };
871
+ get?: never;
872
+ /**
873
+ * Give or withdraw consent to advertising email
874
+ * @description Consent is opt-in: the dashboard sends `granted: true` only from a checkbox the person
875
+ * ticked. A change is recorded with its source and time, and a result notice is mailed
876
+ * to the account's address, as Korean law requires (Network Act, Article 50(7)). A call
877
+ * that changes nothing records nothing and sends nothing.
878
+ */
879
+ put: operations["setMarketingConsent"];
880
+ post?: never;
881
+ delete?: never;
882
+ options?: never;
883
+ head?: never;
884
+ patch?: never;
885
+ trace?: never;
886
+ };
842
887
  "/v1/me/totp": {
843
888
  parameters: {
844
889
  query?: never;
@@ -1028,7 +1073,7 @@ export interface paths {
1028
1073
  * Delete a project (`runlot project delete`)
1029
1074
  * @description Requires admin or higher. **This cannot be undone, and there is no recovery
1030
1075
  * generation to restore from afterwards.** Export anything you need first with
1031
- * `runlot pg export`.
1076
+ * `runlot db export`.
1032
1077
  *
1033
1078
  * The `confirm` field must carry the exact project name.
1034
1079
  *
@@ -1045,6 +1090,11 @@ export interface paths {
1045
1090
  * The 202 carries an operation id you can read with
1046
1091
  * `GET /v1/orgs/{orgSlug}/operations/{opId}`, which reports the first step. Clients
1047
1092
  * should not block on it.
1093
+ *
1094
+ * **Deleting a project never deletes a database.** A project with a database of its
1095
+ * own leaves it in the organization under the project's name (`databaseKept`), with
1096
+ * its data, backups and the projects that bind it; delete it separately with
1097
+ * `runlot db delete`. The project's own bindings to other databases go with it.
1048
1098
  */
1049
1099
  delete: operations["deleteProject"];
1050
1100
  options?: never;
@@ -2548,51 +2598,42 @@ export interface paths {
2548
2598
  patch?: never;
2549
2599
  trace?: never;
2550
2600
  };
2551
- "/v1/orgs/{orgSlug}/projects/{projectName}/database": {
2601
+ "/v1/orgs/{orgSlug}/databases/{databaseName}": {
2552
2602
  parameters: {
2553
2603
  query?: never;
2554
2604
  header?: never;
2555
2605
  path: {
2556
2606
  orgSlug: components["parameters"]["OrgSlug"];
2557
- projectName: components["parameters"]["ProjectName"];
2607
+ /** @description A database's name in the organization */
2608
+ databaseName: components["parameters"]["DatabaseName"];
2558
2609
  };
2559
2610
  cookie?: never;
2560
2611
  };
2561
2612
  /**
2562
- * Whether the database is available
2563
- * @description The response is just `{db: bool}`. Size and generation are not reported here.
2613
+ * One database in the organization
2614
+ * @description The database's size, state and the projects that bind it — the same row as the
2615
+ * list. A project whose name matches a database but which has none answers 404.
2564
2616
  *
2565
2617
  * **No credentials are returned.** Viewer and above may call this; connection details
2566
- * live at `/database/connect`.
2618
+ * live at `…/connect`.
2567
2619
  */
2568
2620
  get: operations["getDatabase"];
2569
2621
  put?: never;
2570
- /**
2571
- * Creates the project's database
2572
- * @description A database is created when your app uses one; this creates it by name, whether the
2573
- * project never had one or its database was deleted. A new database starts empty. It
2574
- * also clears the turn-off, so later deploys keep it. It returns the connection
2575
- * details. Shortly afterwards
2576
- * the running worker picks up a connected `env.db`. No redeploy is needed.
2577
- *
2578
- * **It is idempotent and never rotates the password.** A second call returns the same
2579
- * connection details, so a connection string saved from the first response keeps
2580
- * working.
2581
- */
2582
- post: operations["createDatabase"];
2622
+ post?: never;
2583
2623
  delete?: never;
2584
2624
  options?: never;
2585
2625
  head?: never;
2586
2626
  patch?: never;
2587
2627
  trace?: never;
2588
2628
  };
2589
- "/v1/orgs/{orgSlug}/projects/{projectName}/database/connect": {
2629
+ "/v1/orgs/{orgSlug}/databases/{databaseName}/connect": {
2590
2630
  parameters: {
2591
2631
  query?: never;
2592
2632
  header?: never;
2593
2633
  path: {
2594
2634
  orgSlug: components["parameters"]["OrgSlug"];
2595
- projectName: components["parameters"]["ProjectName"];
2635
+ /** @description A database's name in the organization */
2636
+ databaseName: components["parameters"]["DatabaseName"];
2596
2637
  };
2597
2638
  cookie?: never;
2598
2639
  };
@@ -2611,20 +2652,21 @@ export interface paths {
2611
2652
  patch?: never;
2612
2653
  trace?: never;
2613
2654
  };
2614
- "/v1/orgs/{orgSlug}/projects/{projectName}/database/endpoint": {
2655
+ "/v1/orgs/{orgSlug}/databases/{databaseName}/endpoint": {
2615
2656
  parameters: {
2616
2657
  query?: never;
2617
2658
  header?: never;
2618
2659
  path: {
2619
2660
  orgSlug: components["parameters"]["OrgSlug"];
2620
- projectName: components["parameters"]["ProjectName"];
2661
+ /** @description A database's name in the organization */
2662
+ databaseName: components["parameters"]["DatabaseName"];
2621
2663
  };
2622
2664
  cookie?: never;
2623
2665
  };
2624
2666
  /**
2625
- * Connection info without credentials (`runlot port-forward`)
2667
+ * Connection info without credentials (`runlot db forward`)
2626
2668
  * @description Only host, port, database and `sslmode` — no secret, so viewer and above may call it.
2627
- * `runlot port-forward` authenticates with your login session rather than a password,
2669
+ * `runlot db forward` authenticates with your login session rather than a password,
2628
2670
  * so this endpoint is all it needs.
2629
2671
  */
2630
2672
  get: operations["getDatabaseEndpoint"];
@@ -2636,13 +2678,14 @@ export interface paths {
2636
2678
  patch?: never;
2637
2679
  trace?: never;
2638
2680
  };
2639
- "/v1/orgs/{orgSlug}/projects/{projectName}/database/tokens": {
2681
+ "/v1/orgs/{orgSlug}/databases/{databaseName}/tokens": {
2640
2682
  parameters: {
2641
2683
  query?: never;
2642
2684
  header?: never;
2643
2685
  path: {
2644
2686
  orgSlug: components["parameters"]["OrgSlug"];
2645
- projectName: components["parameters"]["ProjectName"];
2687
+ /** @description A database's name in the organization */
2688
+ databaseName: components["parameters"]["DatabaseName"];
2646
2689
  };
2647
2690
  cookie?: never;
2648
2691
  };
@@ -2653,7 +2696,7 @@ export interface paths {
2653
2696
  get: operations["listDatabaseTokens"];
2654
2697
  put?: never;
2655
2698
  /**
2656
- * Issue a credential for short-lived automation (`runlot pg token`)
2699
+ * Issue a credential for short-lived automation (`runlot db token`)
2657
2700
  * @description Issues a user/password pair for use in a connection string. **The password appears
2658
2701
  * only in this response** — only its SCRAM verifier is stored, so a lost password must
2659
2702
  * be reissued. The session still opens under the project's own database role; the token
@@ -2666,13 +2709,14 @@ export interface paths {
2666
2709
  patch?: never;
2667
2710
  trace?: never;
2668
2711
  };
2669
- "/v1/orgs/{orgSlug}/projects/{projectName}/database/tokens/{tokenUser}": {
2712
+ "/v1/orgs/{orgSlug}/databases/{databaseName}/tokens/{tokenUser}": {
2670
2713
  parameters: {
2671
2714
  query?: never;
2672
2715
  header?: never;
2673
2716
  path: {
2674
2717
  orgSlug: components["parameters"]["OrgSlug"];
2675
- projectName: components["parameters"]["ProjectName"];
2718
+ /** @description A database's name in the organization */
2719
+ databaseName: components["parameters"]["DatabaseName"];
2676
2720
  tokenUser: string;
2677
2721
  };
2678
2722
  cookie?: never;
@@ -2690,13 +2734,14 @@ export interface paths {
2690
2734
  patch?: never;
2691
2735
  trace?: never;
2692
2736
  };
2693
- "/v1/orgs/{orgSlug}/projects/{projectName}/database/execute": {
2737
+ "/v1/orgs/{orgSlug}/databases/{databaseName}/execute": {
2694
2738
  parameters: {
2695
2739
  query?: never;
2696
2740
  header?: never;
2697
2741
  path: {
2698
2742
  orgSlug: components["parameters"]["OrgSlug"];
2699
- projectName: components["parameters"]["ProjectName"];
2743
+ /** @description A database's name in the organization */
2744
+ databaseName: components["parameters"]["DatabaseName"];
2700
2745
  };
2701
2746
  cookie?: never;
2702
2747
  };
@@ -2705,11 +2750,11 @@ export interface paths {
2705
2750
  /**
2706
2751
  * Run one statement (the dashboard's SQL console)
2707
2752
  * @description Runs a single SQL statement against the project's database and returns the rows. This
2708
- * backs the dashboard's SQL console; from a terminal, use `runlot pg execute`, which
2753
+ * backs the dashboard's SQL console; from a terminal, use `runlot db execute`, which
2709
2754
  * connects directly instead.
2710
2755
  *
2711
2756
  * The statement is executed over an ordinary PostgreSQL connection using the same
2712
- * host, port, `sslmode` and credential that `…/database/connect` hands a member for
2757
+ * host, port, `sslmode` and credential that `…/databases/{databaseName}/connect` hands a member for
2713
2758
  * psql, so every rule that applies to a normal connection applies here too, including
2714
2759
  * the 10 s statement ceiling.
2715
2760
  *
@@ -2726,7 +2771,7 @@ export interface paths {
2726
2771
  * **Write mode belongs to a dashboard session.** A personal access token reaches this
2727
2772
  * route with `db:read` and runs read-only statements; asking for `readOnly: false`
2728
2773
  * with a token is 403 `console_write_needs_session`. No scope opens it — a credential
2729
- * that has to write goes through `…/database/connect` or `…/database/tokens` and
2774
+ * that has to write goes through `…/databases/{databaseName}/connect` or `…/databases/{databaseName}/tokens` and
2730
2775
  * connects, where the power it carries is named on the token.
2731
2776
  *
2732
2777
  * Requires member or higher. A write leaves a `db.execute` audit event; a read leaves
@@ -2739,26 +2784,27 @@ export interface paths {
2739
2784
  patch?: never;
2740
2785
  trace?: never;
2741
2786
  };
2742
- "/v1/orgs/{orgSlug}/projects/{projectName}/database/export": {
2787
+ "/v1/orgs/{orgSlug}/databases/{databaseName}/export": {
2743
2788
  parameters: {
2744
2789
  query?: never;
2745
2790
  header?: never;
2746
2791
  path: {
2747
2792
  orgSlug: components["parameters"]["OrgSlug"];
2748
- projectName: components["parameters"]["ProjectName"];
2793
+ /** @description A database's name in the organization */
2794
+ databaseName: components["parameters"]["DatabaseName"];
2749
2795
  };
2750
2796
  cookie?: never;
2751
2797
  };
2752
2798
  get?: never;
2753
2799
  put?: never;
2754
2800
  /**
2755
- * Creates a diagnostic image (`runlot pg export`)
2801
+ * Creates a diagnostic image (`runlot db export`)
2756
2802
  * @description **This is not a backup.** It creates an immutable diagnostic image of the database as
2757
2803
  * it is right now. It does not move any backup pointer, does not affect retention, and
2758
2804
  * cannot be selected by a restore.
2759
2805
  *
2760
2806
  * Scheduled backups are separate and run on their own hourly schedule. List them at
2761
- * `…/database/generations` and pick one at `…/database/restore`. Diagnostic images stay
2807
+ * `…/databases/{databaseName}/generations` and pick one at `…/databases/{databaseName}/restore`. Diagnostic images stay
2762
2808
  * outside that history entirely: restore cannot choose one and pruning ignores them.
2763
2809
  *
2764
2810
  * **This is not idempotent.** Each call creates one more image.
@@ -2775,18 +2821,19 @@ export interface paths {
2775
2821
  patch?: never;
2776
2822
  trace?: never;
2777
2823
  };
2778
- "/v1/orgs/{orgSlug}/projects/{projectName}/database/generations": {
2824
+ "/v1/orgs/{orgSlug}/databases/{databaseName}/generations": {
2779
2825
  parameters: {
2780
2826
  query?: never;
2781
2827
  header?: never;
2782
2828
  path: {
2783
2829
  orgSlug: components["parameters"]["OrgSlug"];
2784
- projectName: components["parameters"]["ProjectName"];
2830
+ /** @description A database's name in the organization */
2831
+ databaseName: components["parameters"]["DatabaseName"];
2785
2832
  };
2786
2833
  cookie?: never;
2787
2834
  };
2788
2835
  /**
2789
- * List of backup generations (`runlot pg generations`)
2836
+ * List of backup generations (`runlot db backups`)
2790
2837
  * @description Lists the backup generations a restore can choose from, newest first, each with its
2791
2838
  * storage key, size and `sha256` digest so the restore can verify what it receives.
2792
2839
  *
@@ -2797,7 +2844,7 @@ export interface paths {
2797
2844
  * Requires member or higher.
2798
2845
  *
2799
2846
  * **The database does not have to be enabled.** A final safety generation is kept even
2800
- * after `runlot pg delete`, so it still appears here after deletion.
2847
+ * after `runlot db delete`, so it still appears here after deletion.
2801
2848
  *
2802
2849
  * **`objects` is the Durable Object half of the same history**, returned alongside the
2803
2850
  * database generations because a project's restorable state is the union of the two.
@@ -2824,20 +2871,21 @@ export interface paths {
2824
2871
  patch?: never;
2825
2872
  trace?: never;
2826
2873
  };
2827
- "/v1/orgs/{orgSlug}/projects/{projectName}/database/restore": {
2874
+ "/v1/orgs/{orgSlug}/databases/{databaseName}/restore": {
2828
2875
  parameters: {
2829
2876
  query?: never;
2830
2877
  header?: never;
2831
2878
  path: {
2832
2879
  orgSlug: components["parameters"]["OrgSlug"];
2833
- projectName: components["parameters"]["ProjectName"];
2880
+ /** @description A database's name in the organization */
2881
+ databaseName: components["parameters"]["DatabaseName"];
2834
2882
  };
2835
2883
  cookie?: never;
2836
2884
  };
2837
2885
  get?: never;
2838
2886
  put?: never;
2839
2887
  /**
2840
- * Restore to a generation (`runlot pg restore`)
2888
+ * Restore to a generation (`runlot db restore`)
2841
2889
  * @description A restore stops the project's database, replaces its contents with the chosen
2842
2890
  * generation, and starts it again. The data as it stands immediately before the restore
2843
2891
  * is archived first, so there is a way back.
@@ -2851,7 +2899,7 @@ export interface paths {
2851
2899
  * whole restore, database included, rather than restoring only part of the project.
2852
2900
  *
2853
2901
  * **Check `objects.restorable` before calling this, for the generation you are about to
2854
- * pass.** Call `…/database/generations?at=<the chosen generation's lastAt>` first: the
2902
+ * pass.** Call `…/databases/{databaseName}/generations?at=<the chosen generation's lastAt>` first: the
2855
2903
  * object half is selected on its own instant, independent of the `(epoch, seq)` you
2856
2904
  * send here, so a `restorable=true` read at another instant answers a different
2857
2905
  * question. Even a correctly timed `restorable=true` is eligibility, not a guarantee —
@@ -2861,7 +2909,7 @@ export interface paths {
2861
2909
  * list, so a generation created in the meantime cannot send you somewhere else.
2862
2910
  *
2863
2911
  * Returns 202 with an operation id, not the result. Poll
2864
- * `…/database/operations/{opId}` for progress.
2912
+ * `…/databases/{databaseName}/operations/{opId}` for progress.
2865
2913
  */
2866
2914
  post: operations["restoreDatabase"];
2867
2915
  delete?: never;
@@ -2870,29 +2918,37 @@ export interface paths {
2870
2918
  patch?: never;
2871
2919
  trace?: never;
2872
2920
  };
2873
- "/v1/orgs/{orgSlug}/projects/{projectName}/database/delete": {
2921
+ "/v1/orgs/{orgSlug}/databases/{databaseName}/delete": {
2874
2922
  parameters: {
2875
2923
  query?: never;
2876
2924
  header?: never;
2877
2925
  path: {
2878
2926
  orgSlug: components["parameters"]["OrgSlug"];
2879
- projectName: components["parameters"]["ProjectName"];
2927
+ /** @description A database's name in the organization */
2928
+ databaseName: components["parameters"]["DatabaseName"];
2880
2929
  };
2881
2930
  cookie?: never;
2882
2931
  };
2883
2932
  get?: never;
2884
2933
  put?: never;
2885
2934
  /**
2886
- * Delete a database (`runlot pg delete`)
2887
- * @description Deletes the project's database. A final safety generation is kept, so the data can
2888
- * still be listed and restored afterwards. Once the deletion completes, the worker runs
2889
- * without `env.db`. Requires admin or higher.
2935
+ * Delete a database (`runlot db delete`)
2936
+ * @description Deletes a database in the organization. Requires admin or higher.
2937
+ *
2938
+ * **A bound database is not deleted.** The call answers 409 `database_bound` with
2939
+ * `details.bindings` (`project`, `binding`); the project whose name the database
2940
+ * shares counts as a binding (`db`). Remove the `databases` entry from each project's
2941
+ * `runlot.json` and deploy, or send `unbindAll: true`, which removes every binding
2942
+ * (each recorded in the audit log). Bound projects then fail calls on that binding
2943
+ * with `DatabaseNotAttached`, and their next deploy is refused with
2944
+ * `database_not_found` until their `runlot.json` drops the entry.
2890
2945
  *
2891
- * **This also turns end-user auth off.** The subscriber records live inside the
2892
- * project's database, so they go with it, and `env.auth` is disabled in the same step.
2893
- * The stored OAuth provider secrets are removed with it and are not recoverable.
2946
+ * While the project of the same name exists, a final safety generation is kept and
2947
+ * that project runs without `env.db` afterwards; this also turns end-user auth off,
2948
+ * because the subscriber records live in the database. A database with no project of
2949
+ * its name is erased with no generation left — export it first (`runlot db export`).
2894
2950
  *
2895
- * **`confirm` must match the project name exactly.** If it does not, the call returns
2951
+ * **`confirm` must match the database name exactly.** If it does not, the call returns
2896
2952
  * 400 `confirm_mismatch` and nothing starts.
2897
2953
  *
2898
2954
  * This is a `POST` rather than a `DELETE` because it is a long-running operation that
@@ -2906,13 +2962,14 @@ export interface paths {
2906
2962
  patch?: never;
2907
2963
  trace?: never;
2908
2964
  };
2909
- "/v1/orgs/{orgSlug}/projects/{projectName}/database/operations/{opId}": {
2965
+ "/v1/orgs/{orgSlug}/databases/{databaseName}/operations/{opId}": {
2910
2966
  parameters: {
2911
2967
  query?: never;
2912
2968
  header?: never;
2913
2969
  path: {
2914
2970
  orgSlug: components["parameters"]["OrgSlug"];
2915
- projectName: components["parameters"]["ProjectName"];
2971
+ /** @description A database's name in the organization */
2972
+ databaseName: components["parameters"]["DatabaseName"];
2916
2973
  /**
2917
2974
  * @description The operation id. **Not a credential** — an operation that does not belong to the
2918
2975
  * project in the path returns 404.
@@ -2940,13 +2997,14 @@ export interface paths {
2940
2997
  patch?: never;
2941
2998
  trace?: never;
2942
2999
  };
2943
- "/v1/orgs/{orgSlug}/projects/{projectName}/database/operations/{opId}/abort": {
3000
+ "/v1/orgs/{orgSlug}/databases/{databaseName}/operations/{opId}/abort": {
2944
3001
  parameters: {
2945
3002
  query?: never;
2946
3003
  header?: never;
2947
3004
  path: {
2948
3005
  orgSlug: components["parameters"]["OrgSlug"];
2949
- projectName: components["parameters"]["ProjectName"];
3006
+ /** @description A database's name in the organization */
3007
+ databaseName: components["parameters"]["DatabaseName"];
2950
3008
  /**
2951
3009
  * @description The operation id. **Not a credential** — an operation that does not belong to the
2952
3010
  * project in the path returns 404.
@@ -2958,7 +3016,7 @@ export interface paths {
2958
3016
  get?: never;
2959
3017
  put?: never;
2960
3018
  /**
2961
- * Aborts an in-progress operation (`runlot pg abort`)
3019
+ * Aborts an in-progress operation (`runlot db abort`)
2962
3020
  * @description Only possible **before** the operation reaches a point of no return: evict,
2963
3021
  * restore_generation and delete can be aborted up to the committing phase; restore
2964
3022
  * cannot. Aborting returns the project to active and leaves `terminalCode=aborted`.
@@ -3570,8 +3628,9 @@ export interface paths {
3570
3628
  /**
3571
3629
  * Desktops of the org's members that can lend to this project right now
3572
3630
  * @description Each desktop lending to apps, with the models it lends and whether its Runlot Studio is
3573
- * too old to carry `reasoning` or `responseFormat` (`outdated`). `reachable` is false when
3574
- * the lending service could not be asked. Requires `observability:read`.
3631
+ * too old to carry `reasoning` or `responseFormat` (`outdated`), followed by the members'
3632
+ * desktops that are online with lending switched off (`lending: false`). `reachable` is
3633
+ * false when the lending service could not be asked. Requires `observability:read`.
3575
3634
  */
3576
3635
  get: operations["getAILenders"];
3577
3636
  put?: never;
@@ -3713,7 +3772,10 @@ export interface paths {
3713
3772
  * @description The call a local `runlot dev` makes when your worker calls `env.ai.run`. It is forwarded to the
3714
3773
  * same lane Studio's local runtime uses: catalog models only, the free plan's caps on every plan
3715
3774
  * (4,096 output tokens, 30 calls a minute, two at a time), the org's balance checked before and
3716
- * debited after, recorded in the ledger as `lane = dev`. No streaming — one JSON answer.
3775
+ * debited after, recorded in the ledger as `lane = dev`. One JSON answer, or with `stream: true`
3776
+ * server-sent events: `data: {"delta"}` pieces, then `event: done` (model, stopReason, usage,
3777
+ * usageComplete) or `event: error` (code, message, usage). A stream takes no tools and no
3778
+ * `responseFormat` (`400 stream_unsupported`, `400 format_unsupported`).
3717
3779
  *
3718
3780
  * This is not an API for calling models from outside a worker: it needs a member's login and a
3719
3781
  * project with AI turned on, and it answers `env.ai.run`'s own shape. Requires member or higher.
@@ -4016,7 +4078,7 @@ export interface paths {
4016
4078
  *
4017
4079
  * **The end-user table is not part of this API.** User records live in the `runlot_auth`
4018
4080
  * schema of the project's database; read them through the worker's `env.auth.users.*` or
4019
- * with `runlot pg shell`.
4081
+ * with `runlot db shell`.
4020
4082
  *
4021
4083
  * `providers` carries only the client id. Client secrets are stored encrypted and never
4022
4084
  * appear in any response.
@@ -4032,10 +4094,10 @@ export interface paths {
4032
4094
  *
4033
4095
  * **Login creates the database it needs.** The end-user tables live inside the
4034
4096
  * project's database, so a project without one gets it first, as if you had run
4035
- * `runlot pg on`. Two cases are refused instead, each with a 409 that says why: the
4097
+ * `runlot db create <project>`. Two cases are refused instead, each with a 409 that says why: the
4036
4098
  * project's database was deleted (`database_required`), or the live deployment's
4037
4099
  * `runlot.json` says `"database": false` (`database_disabled`). Create the database with
4038
- * `POST …/database` (`runlot pg on`) and call this again.
4100
+ * `POST /v1/orgs/{orgSlug}/databases` (`runlot db create <project>`) and call this again.
4039
4101
  *
4040
4102
  * Once enabled, the built-in login endpoints start serving shortly afterwards. As with
4041
4103
  * `env.db` and `env.storage`, no redeploy is needed. Table initialization is idempotent,
@@ -4050,7 +4112,7 @@ export interface paths {
4050
4112
  * Disables auth (`runlot auth delete`)
4051
4113
  * @description **End-user data is not deleted.** The `runlot_auth` tables stay in the project's
4052
4114
  * database as they are — deleting them is a database operation you run yourself with
4053
- * `runlot pg`. Turning auth back on lets the same people log in as before.
4115
+ * `runlot db`. Turning auth back on lets the same people log in as before.
4054
4116
  *
4055
4117
  * Shortly afterwards the built-in login endpoints stop serving, and `/__runlot/auth/*`
4056
4118
  * passes straight through to your worker — if that path has no route, it is a 404.
@@ -4258,7 +4320,7 @@ export interface paths {
4258
4320
  * The app's end users (`runlot auth users`)
4259
4321
  * @description The people who signed up to **your app** — not the members of your organization.
4260
4322
  * They live in the project's own database, under the `runlot_auth` schema, and this
4261
- * route reads them over the same connection `…/database/connect` hands you for psql.
4323
+ * route reads them over the same connection `…/databases/{databaseName}/connect` hands you for psql.
4262
4324
  * Everything here is also visible through `env.db` and `psql`; this is a convenience,
4263
4325
  * not a second source.
4264
4326
  *
@@ -4579,6 +4641,119 @@ export interface paths {
4579
4641
  patch?: never;
4580
4642
  trace?: never;
4581
4643
  };
4644
+ "/v1/orgs/{orgSlug}/billing/spending-limit": {
4645
+ parameters: {
4646
+ query?: never;
4647
+ header?: never;
4648
+ path: {
4649
+ orgSlug: components["parameters"]["OrgSlug"];
4650
+ };
4651
+ cookie?: never;
4652
+ };
4653
+ /**
4654
+ * The org's spending limit, this month's overage and the lock
4655
+ * @description The spending limit is the most a Pro organization is billed in a month for usage above
4656
+ * the included amounts. It is always on (default $20) and has no "unlimited" value: when
4657
+ * this month's overage reaches it, every HTTP request to the organization's projects is
4658
+ * refused with `429 budget_exhausted` until the first of next month, and uploads past the
4659
+ * storage quota get `507`. Raising the limit releases the lock within one map poll.
4660
+ *
4661
+ * `overageMicroCents` is this month's accrued overage; `breakdown` names the axes that
4662
+ * made it (requests, CPU, storage held, memory above the plan, and collection). Held
4663
+ * storage and memory never take the month past the limit; requests and CPU in the
4664
+ * 2–3 minute enforcement lag can. `applies` is false on Free (Free is never billed past
4665
+ * its included amounts) and on a granted Pro (not billed). `projects` lists every project
4666
+ * with its own spending limit (null where it has none) and its share of this month's
4667
+ * overage (see `getProjectLimits`). Requires viewer or higher.
4668
+ */
4669
+ get: operations["getSpendingLimit"];
4670
+ /**
4671
+ * Set the org's spending limit
4672
+ * @description Sets the limit in cents, from 0 (stop at the first cent past the included amounts) up to
4673
+ * `maxCents` ($1,000); above that, contact us. The lock is judged again at once: a limit
4674
+ * above this month's overage releases it, and a limit below it locks the organization now —
4675
+ * the answer's `throttled` shows the lock the change left. Pro only:
4676
+ * `409 spending_limit_not_applicable` on Free and on a granted Pro, with
4677
+ * `details.reason` `free` or `granted`. A value out of range is
4678
+ * `400 spending_limit_out_of_range`. Requires admin. Audited as `org.spending_limit`.
4679
+ */
4680
+ put: operations["setSpendingLimit"];
4681
+ post?: never;
4682
+ delete?: never;
4683
+ options?: never;
4684
+ head?: never;
4685
+ patch?: never;
4686
+ trace?: never;
4687
+ };
4688
+ "/v1/orgs/{orgSlug}/projects/{projectName}/limits": {
4689
+ parameters: {
4690
+ query?: never;
4691
+ header?: never;
4692
+ path: {
4693
+ orgSlug: components["parameters"]["OrgSlug"];
4694
+ projectName: components["parameters"]["ProjectName"];
4695
+ };
4696
+ cookie?: never;
4697
+ };
4698
+ /**
4699
+ * A project's app memory, per-request CPU and spending limits
4700
+ * @description `appMemory` is the most one copy of the app may use. For a project with a database this
4701
+ * is the app process's own limit (the database keeps the plan's memory); the project's
4702
+ * memory cap, `projectBytes`, is raised to twice it, because a deploy runs two copies side
4703
+ * by side. For a project without a database it is the project's whole cap. An app over its
4704
+ * limit is restarted and reported as an `app_out_of_memory` issue.
4705
+ *
4706
+ * A limit is a ceiling, not reserved memory. On Pro, memory the project actually holds
4707
+ * above `includedProjectBytes` (the plan's project cap) is billed per hour of use within
4708
+ * the organization's spending limit, when `billed` is true. `p99Bytes` is the project's
4709
+ * 14-day p99 hourly peak, database and app together.
4710
+ *
4711
+ * `requestCpu` is the CPU one request may spend before it fails with `exceededCpu`.
4712
+ *
4713
+ * `spend` is the project's own spending limit, under the organization's. Optional: with
4714
+ * none (`cents` null) only the organization's limit applies. The project's share of the
4715
+ * organization's overage this month (`shareMicroCents`) is, per axis, that axis's overage
4716
+ * times the project's fraction of the organization's use of it — requests, CPU and file
4717
+ * storage held — plus the memory the project held above the plan. Error and observability
4718
+ * collection is not part of it. Because the included amounts are the organization's, a
4719
+ * project's share can grow while it is idle when another project takes the organization
4720
+ * further past them. When the share reaches the limit, only this project's HTTP requests
4721
+ * are refused, with `429 project_budget_exhausted`, until the first of next month
4722
+ * (`throttledUntil`); the organization's other projects keep serving, and the
4723
+ * organization's own limit still applies on top. Requires viewer or higher.
4724
+ */
4725
+ get: operations["getProjectLimits"];
4726
+ /**
4727
+ * Set a project's app memory, per-request CPU or spending limit
4728
+ * @description A field left out is unchanged; `null` puts it back on the plan's value. Free may lower
4729
+ * either limit and raising one needs Pro (`403 plan_required`). Pro may raise app memory to
4730
+ * `maxBytes` (at most 2 GiB) and the CPU limit to 300 s. The change reaches the running app
4731
+ * by a zero-downtime replacement.
4732
+ *
4733
+ * `spendCents` sets the project's own spending limit, from 0 (stop at the first cent of the
4734
+ * project's share) up to the organization's limit (`spend.orgCents`); `null` removes it.
4735
+ * The lock is judged again at once: a limit above the project's share releases it within
4736
+ * one map poll, and a limit at or below it refuses the project's requests now — the
4737
+ * answer's `spend.throttled` shows the lock the change left. Pro only:
4738
+ * `409 spending_limit_not_applicable` on Free and on a granted Pro (`details.reason`). Out
4739
+ * of range is `400 limit_out_of_range` with `details.maxCents`. Audited as
4740
+ * `project.spending_limit`.
4741
+ *
4742
+ * Refusals: `409 memory_limit_below_use` lowers app memory below the 14-day p99
4743
+ * (`details.p99Bytes`) — send `confirm: true` to set it anyway; `409
4744
+ * memory_limit_exceeds_node` raises past what the project's server can offer
4745
+ * (`details.maxBytes`); `409 memory_limit_set_by_operator` raises past a value Runlot set;
4746
+ * `400 limit_out_of_range` is outside the bounds (`details.field`). Requires admin. Memory
4747
+ * and CPU changes are audited as `project.limits`.
4748
+ */
4749
+ put: operations["setProjectLimits"];
4750
+ post?: never;
4751
+ delete?: never;
4752
+ options?: never;
4753
+ head?: never;
4754
+ patch?: never;
4755
+ trace?: never;
4756
+ };
4582
4757
  "/v1/orgs/{orgSlug}/members": {
4583
4758
  parameters: {
4584
4759
  query?: never;
@@ -7168,6 +7343,126 @@ export interface paths {
7168
7343
  patch?: never;
7169
7344
  trace?: never;
7170
7345
  };
7346
+ "/v1/orgs/{orgSlug}/projects/{projectName}/health": {
7347
+ parameters: {
7348
+ query?: never;
7349
+ header?: never;
7350
+ path: {
7351
+ orgSlug: string;
7352
+ projectName: string;
7353
+ };
7354
+ cookie?: never;
7355
+ };
7356
+ /**
7357
+ * Read a project's capacity risks
7358
+ * @description The project's capacity risks: how close its memory, CPU, database, AI calls and the
7359
+ * organization's budget are to the hard limits they will hit, each with its evidence
7360
+ * and the next step. Call before a launch, after a deploy, and when the app is slow or
7361
+ * restarting. `checks` lists every signal: `unknown` means it was not measured (the
7362
+ * reason says why), which is not the same as `ok`. Every plan. Viewer.
7363
+ */
7364
+ get: operations["getProjectHealth"];
7365
+ put?: never;
7366
+ post?: never;
7367
+ delete?: never;
7368
+ options?: never;
7369
+ head?: never;
7370
+ patch?: never;
7371
+ trace?: never;
7372
+ };
7373
+ "/v1/orgs/{orgSlug}/databases": {
7374
+ parameters: {
7375
+ query?: never;
7376
+ header?: never;
7377
+ path: {
7378
+ orgSlug: components["parameters"]["OrgSlug"];
7379
+ };
7380
+ cookie?: never;
7381
+ };
7382
+ /**
7383
+ * Every database in the organization, with the projects that bind it
7384
+ * @description One row per database: its size against the plan's cap, whether it is running, and
7385
+ * every project that binds it with the binding name and mode — including the project
7386
+ * whose name it shares, as `db`. A database no project binds is `unbound`: it keeps
7387
+ * its data and its bill until it is deleted. Viewer and above.
7388
+ */
7389
+ get: operations["listOrgDatabases"];
7390
+ put?: never;
7391
+ /**
7392
+ * Create a database in the organization (`runlot db create`)
7393
+ * @description Creates a database named `name` and places it, so it runs before any project binds
7394
+ * it. Projects bind it by name in `runlot.json`
7395
+ * (`"databases": [{"binding": "shared", "database": "<name>"}]`) and deploy. Member
7396
+ * and above.
7397
+ *
7398
+ * If `name` is a project without a database, this creates that project's own
7399
+ * database (its `env.db`), on every plan. A database that stands alone is Pro.
7400
+ *
7401
+ * Names share one namespace with projects: a name held by a project with a database
7402
+ * or by another database answers 409 `name_taken`. The plan's database count applies
7403
+ * (`database_limit`). It is idempotent for a project's own database: a second call
7404
+ * returns the same connection details.
7405
+ */
7406
+ post: operations["createOrgDatabase"];
7407
+ delete?: never;
7408
+ options?: never;
7409
+ head?: never;
7410
+ patch?: never;
7411
+ trace?: never;
7412
+ };
7413
+ "/v1/orgs/{orgSlug}/databases/{databaseName}/bindings/{projectName}": {
7414
+ parameters: {
7415
+ query?: never;
7416
+ header?: never;
7417
+ path: {
7418
+ orgSlug: components["parameters"]["OrgSlug"];
7419
+ /** @description A database's name in the organization */
7420
+ databaseName: components["parameters"]["DatabaseName"];
7421
+ projectName: components["parameters"]["ProjectName"];
7422
+ };
7423
+ cookie?: never;
7424
+ };
7425
+ get?: never;
7426
+ put?: never;
7427
+ post?: never;
7428
+ /**
7429
+ * Remove a project's binding to this database
7430
+ * @description For a project nobody will redeploy: its running app loses `env.<binding>` shortly
7431
+ * and calls on it fail with `DatabaseNotAttached`. A binding is otherwise written and
7432
+ * removed by the project's own deploy from its `runlot.json`, so a later deploy that
7433
+ * still names this database binds it again. The project whose name the database
7434
+ * shares cannot be unbound (delete the database instead). Admin and above.
7435
+ */
7436
+ delete: operations["unbindDatabase"];
7437
+ options?: never;
7438
+ head?: never;
7439
+ patch?: never;
7440
+ trace?: never;
7441
+ };
7442
+ "/v1/orgs/{orgSlug}/health": {
7443
+ parameters: {
7444
+ query?: never;
7445
+ header?: never;
7446
+ path: {
7447
+ orgSlug: string;
7448
+ };
7449
+ cookie?: never;
7450
+ };
7451
+ /**
7452
+ * Read every project's capacity status
7453
+ * @description One line per project of the organization: its worst open capacity risk and how many
7454
+ * are open, and the organization's budget check. Use it to find the project that needs
7455
+ * `getProjectHealth`. Viewer.
7456
+ */
7457
+ get: operations["getOrgHealth"];
7458
+ put?: never;
7459
+ post?: never;
7460
+ delete?: never;
7461
+ options?: never;
7462
+ head?: never;
7463
+ patch?: never;
7464
+ trace?: never;
7465
+ };
7171
7466
  "/v1/orgs/{orgSlug}/projects/{projectName}/synthetics": {
7172
7467
  parameters: {
7173
7468
  query?: never;
@@ -9062,7 +9357,7 @@ export interface components {
9062
9357
  MonitorQuery: {
9063
9358
  /** @enum {string} */
9064
9359
  source?: "apm" | "database" | "infra" | "custom";
9065
- /** @description apm: requests, errors, error_rate (percent), status_4xx, status_5xx, latency_avg, latency_p50, latency_p75, latency_p90, latency_p95, latency_p99, latency_p999. database: calls, errors, latency_avg, latency_p50, latency_p95, latency_p99, wait_share (percent of route wall time). infra: memory_pct, memory_bytes, psi_cpu_some, psi_mem_some, psi_mem_full, psi_io_some, oom_kills, oom_exits, high_events, cpu_throttled_us. */
9360
+ /** @description apm: requests, errors, error_rate (percent), status_4xx, status_5xx, latency_avg, latency_p50, latency_p75, latency_p90, latency_p95, latency_p99, latency_p999. database: calls, errors, latency_avg, latency_p50, latency_p95, latency_p99, wait_share (percent of route wall time). infra: memory_pct, memory_bytes, cpu_cores (cores used over the sampled minutes; an app uses at most one), psi_cpu_some, psi_mem_some, psi_mem_full, psi_io_some, oom_kills, oom_exits, high_events, cpu_throttled_us. */
9066
9361
  metric?: string;
9067
9362
  name?: string;
9068
9363
  /** @enum {string} */
@@ -9900,7 +10195,7 @@ export interface components {
9900
10195
  * human-readable wording is produced separately by the dashboard and by email.
9901
10196
  * @enum {string}
9902
10197
  */
9903
- 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" | "domain_renewal_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" | "license_expiring" | "license_grace" | "license_restricted" | "new_device" | "error_issue_new" | "app_out_of_memory" | "monitor_alert" | "watchdog_digest";
10198
+ 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" | "domain_renewal_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" | "license_expiring" | "license_grace" | "license_restricted" | "new_device" | "error_issue_new" | "app_out_of_memory" | "monitor_alert" | "watchdog_digest" | "capacity_risk" | "budget_near";
9904
10199
  /** @description If this is a project-related notification, the name of that project. Absent for org-level notifications (`project_limit`) */
9905
10200
  projectName?: string;
9906
10201
  /**
@@ -9917,6 +10212,11 @@ export interface components {
9917
10212
  * `{app, clientId, device}`, `error_issue_new` is `{issueId, shortId, title, origin}` and
9918
10213
  * `app_out_of_memory` is `{issueId, limitMiB, peakMiB, release}`.
9919
10214
  * `monitor_alert` is `{monitorId, monitorName, monitorKind, monitorState, monitorGroup, monitorValue, monitorThreshold, monitorMessage, monitorLink}`.
10215
+ * `capacity_risk` is `{insightId, signal, severity, route, summary, magnitude}` and
10216
+ * `budget_near` is `{kind, used, limit, period, until}` (kind is `requests`, `cpu` or `spend`,
10217
+ * or `project_spend` for a project's own spending limit, with the project set and `used`
10218
+ * and `limit` in cents). `budget_exhausted` is `{throttled, until, plan}`; a project's own
10219
+ * limit carries `throttled: ["project_spend"]`, the project and the limit in `cents`.
9920
10220
  */
9921
10221
  detail: {
9922
10222
  [key: string]: unknown;
@@ -9932,6 +10232,15 @@ export interface components {
9932
10232
  Project: {
9933
10233
  /** Format: uuid */
9934
10234
  projectId: string;
10235
+ /**
10236
+ * @description Only on the answer to creating a project: the organization already had a database
10237
+ * with this name (its project was deleted earlier), and the new project uses it as
10238
+ * `env.db`. `runlot deploy` prints it on its first line.
10239
+ */
10240
+ existingDatabase?: {
10241
+ /** Format: int64 */
10242
+ sizeBytes: number | null;
10243
+ };
9935
10244
  orgSlug: components["schemas"]["Slug"];
9936
10245
  name: components["schemas"]["Slug"];
9937
10246
  hostnames: string[];
@@ -10020,7 +10329,7 @@ export interface components {
10020
10329
  /** @description A deployment in the overview. Same shape as `Deployment`, including `actor`. */
10021
10330
  OverviewDeployment: components["schemas"]["Deployment"];
10022
10331
  OverviewDatabase: {
10023
- /** @description Whether the project has a database. One is created when the app uses it, or by `runlot pg on`. */
10332
+ /** @description Whether the project has a database. One is created when the app uses it, or by `runlot db create <project>`. */
10024
10333
  granted: boolean;
10025
10334
  /**
10026
10335
  * Format: date-time
@@ -10110,6 +10419,8 @@ export interface components {
10110
10419
  * contradicts, or a recognised framework deployed without `runWorkerFirst: false`.
10111
10420
  */
10112
10421
  warnings?: string[];
10422
+ /** @description What the deploy-time static checks found in this deployment's code. Absent when it was not checked. */
10423
+ staticChecks?: components["schemas"]["DeployStaticChecks"];
10113
10424
  };
10114
10425
  /**
10115
10426
  * @description The one address Studio hands to a person who is not a developer
@@ -11633,7 +11944,7 @@ export interface components {
11633
11944
  available: boolean;
11634
11945
  /** @description **Always `false`.** The database and the objects are not restored to one consistent instant, so do not present a single restore time for both. */
11635
11946
  atomic: boolean;
11636
- /** @description `available && complete` — eligibility, not a success guarantee. The restore call (`POST /orgs/{orgSlug}/projects/{projectName}/database/restore`) refuses outright when `missing` or `gaps` is non-empty, so `false` here means the call is not worth attempting. `true` means only that the preflight would pass; the restore can still fail afterwards on a holder's own store (unreachable node, a lost or corrupted archive, a digest mismatch found only when the file is read). It is also computed at this response's `at`, which is one instant for the whole project — a restore targets one generation's own `lastAt`, so re-query with `?at=<that generation's lastAt>` before trusting this field for that restore. */
11947
+ /** @description `available && complete` — eligibility, not a success guarantee. The restore call (`POST /orgs/{orgSlug}/databases/{databaseName}/restore`) refuses outright when `missing` or `gaps` is non-empty, so `false` here means the call is not worth attempting. `true` means only that the preflight would pass; the restore can still fail afterwards on a holder's own store (unreachable node, a lost or corrupted archive, a digest mismatch found only when the file is read). It is also computed at this response's `at`, which is one instant for the whole project — a restore targets one generation's own `lastAt`, so re-query with `?at=<that generation's lastAt>` before trusting this field for that restore. */
11637
11948
  restorable: boolean;
11638
11949
  /** Format: date-time */
11639
11950
  at?: string;
@@ -11801,17 +12112,64 @@ export interface components {
11801
12112
  * @example app
11802
12113
  */
11803
12114
  confirm: string;
12115
+ /**
12116
+ * @description Remove every binding of this database first. Without it, a bound database
12117
+ * refuses the deletion with 409 `database_bound`.
12118
+ */
12119
+ unbindAll?: boolean;
12120
+ };
12121
+ OrgDatabase: {
12122
+ /** @description The database's name in the organization */
12123
+ name: string;
12124
+ /** Format: date-time */
12125
+ createdAt: string;
12126
+ /**
12127
+ * Format: int64
12128
+ * @description The last measured size, when one has been reported
12129
+ */
12130
+ sizeBytes: number | null;
12131
+ /**
12132
+ * Format: int64
12133
+ * @description The plan's size cap for one database
12134
+ */
12135
+ capBytes: number;
12136
+ /**
12137
+ * @description `running`: placed on a node (an idle database stops after a few minutes and
12138
+ * starts again on the next connection). `cold`: stored offsite, woken by the next
12139
+ * connection. `none`: not placed yet (its project was never deployed).
12140
+ * @enum {string}
12141
+ */
12142
+ state: "running" | "cold" | "none";
12143
+ /** @description No project of the same name exists: the database stands alone */
12144
+ standalone: boolean;
12145
+ /** @description No project binds it, including one of the same name */
12146
+ unbound: boolean;
12147
+ /**
12148
+ * @description Projects that reach this database. The project of the same name, if any, is listed
12149
+ * with `binding: db`.
12150
+ */
12151
+ bindings: components["schemas"]["DatabaseBinding"][];
12152
+ };
12153
+ DatabaseBinding: {
12154
+ project: string;
12155
+ /** @example service_db */
12156
+ binding: string;
12157
+ /** @enum {string} */
12158
+ mode: "write" | "read";
12159
+ };
12160
+ OrgDatabases: {
12161
+ databases: components["schemas"]["OrgDatabase"][];
11804
12162
  };
11805
12163
  /**
11806
12164
  * @description This response means the multi-step operation was queued (202). **It does not mean it
11807
- * finished** — check progress at `…/database/operations/{opId}`.
12165
+ * finished** — check progress at `…/databases/{databaseName}/operations/{opId}`.
11808
12166
  */
11809
12167
  OperationStarted: {
11810
12168
  /** Format: uuid */
11811
12169
  projectId: string;
11812
12170
  opId: string;
11813
12171
  /** @enum {string} */
11814
- kind: "restore_generation" | "delete_database" | "delete_project" | "purge_project" | "evict" | "restore";
12172
+ kind: "restore_generation" | "delete_database" | "delete_project" | "purge_project" | "retire_app" | "evict" | "restore";
11815
12173
  /** Format: int64 */
11816
12174
  epoch: number;
11817
12175
  node?: string;
@@ -11822,6 +12180,12 @@ export interface components {
11822
12180
  * value rather than computing it from a retention window.
11823
12181
  */
11824
12182
  purgeAfter?: string;
12183
+ /**
12184
+ * @description Project deletion only: the name of the project's database, which stays in the
12185
+ * organization (listed under databases; delete it with `runlot db delete`). Absent
12186
+ * when the project had no database.
12187
+ */
12188
+ databaseKept?: string;
11825
12189
  };
11826
12190
  Operation: {
11827
12191
  opId: string;
@@ -12016,11 +12380,42 @@ export interface components {
12016
12380
  * of `@runlot/auth`; a `migrations/NNNN_*.sql` file; or `env.db` / `env.DB` in the
12017
12381
  * project's own sources. A value set in your `runlot.json` wins over that guess.
12018
12382
  * - **`false`** — never create one. Neither the deployment nor a call creates it, and
12019
- * `env.db` rejects with `DatabaseNotEnabled`. `runlot pg on` still creates one,
12383
+ * `env.db` rejects with `DatabaseNotEnabled`. `runlot db create <project>` still creates one,
12020
12384
  * because it asks by name. Declaring `queues` with `false` is refused with a 400:
12021
12385
  * queue messages are kept in the database.
12022
12386
  */
12023
12387
  database?: boolean;
12388
+ /**
12389
+ * @description Databases in the organization this code reaches, each as `env.<binding>`. The
12390
+ * deployment binds them: it adds, changes and removes this project's bindings to
12391
+ * match this list, and a database that does not exist is refused with 409
12392
+ * `database_not_found` (create it with `runlot db create`). At most two besides
12393
+ * `db`; binding a database into a second project is Pro.
12394
+ *
12395
+ * `{"binding": "db", "database": "<this project's name>"}` is the explicit form of
12396
+ * the default `env.db`; `db` cannot name another database yet. A bound database is
12397
+ * not this project's own `env.db`, and naming one does not create a database for
12398
+ * this project.
12399
+ */
12400
+ databases?: {
12401
+ /** @example service_db */
12402
+ binding: string;
12403
+ /** @description The database's name, in the same organization */
12404
+ database: string;
12405
+ /**
12406
+ * @description `write` runs statements as the database owner. `read` runs every statement
12407
+ * as a read-only role.
12408
+ * @default write
12409
+ * @enum {string}
12410
+ */
12411
+ mode: "write" | "read";
12412
+ /**
12413
+ * @description Path to the database's `migrations/`, used only by `runlot dev` to prepare
12414
+ * the local stand-in database. A deployment never applies it
12415
+ * (`runlot db migrate <name>` does).
12416
+ */
12417
+ migrations?: string;
12418
+ }[];
12024
12419
  /**
12025
12420
  * @description Declares email sending and receiving. When `true`, the worker receives
12026
12421
  * `env.email`, and `export default { email() }` becomes the receiving handler.
@@ -12783,8 +13178,9 @@ export interface components {
12783
13178
  byosCreditFallback?: boolean;
12784
13179
  /**
12785
13180
  * @description How many members of the project's organization have a Studio desktop lending to
12786
- * apps right now. Present only on the answer to a PATCH that leaves `byos` on, and
12787
- * only when Studio could be asked. With `byos` on, `byosCreditFallback` off and 0
13181
+ * apps right now. Present on the answer to a PATCH that leaves `byos` on, on a GET
13182
+ * while `byos` is on and `byosCreditFallback` off, and only when Studio could be
13183
+ * asked. With `byos` on, `byosCreditFallback` off and 0
12788
13184
  * here, every lendable call is refused.
12789
13185
  */
12790
13186
  byosLenders?: number;
@@ -12970,6 +13366,8 @@ export interface components {
12970
13366
  tags: string[];
12971
13367
  hasBody: boolean;
12972
13368
  deploymentVersion: number;
13369
+ /** @description The cache counts the provider did not report: their 0 above means unknown, not none. Absent when both were reported, or on a call recorded before the field existed. */
13370
+ cacheUnreported?: ("cachedInputTokens" | "cacheWriteInputTokens")[];
12973
13371
  };
12974
13372
  AICallDetail: components["schemas"]["AICallRow"] & {
12975
13373
  input?: string;
@@ -13029,6 +13427,16 @@ export interface components {
13029
13427
  p50Ms: number;
13030
13428
  p95Ms: number;
13031
13429
  ttftP50Ms: number;
13430
+ /**
13431
+ * Format: int64
13432
+ * @description tokensIn over the chat calls whose provider reported a read count. The hit rate is tokensCachedReadKnown / tokensInReadKnown; 0 here (no such call, or only hours rolled up before the field) means no hit rate, not 0 %.
13433
+ */
13434
+ tokensInReadKnown?: number;
13435
+ /**
13436
+ * Format: int64
13437
+ * @description tokensCached over the same calls as tokensInReadKnown.
13438
+ */
13439
+ tokensCachedReadKnown?: number;
13032
13440
  };
13033
13441
  series?: {
13034
13442
  /** Format: date-time */
@@ -13069,6 +13477,16 @@ export interface components {
13069
13477
  byosServed: number;
13070
13478
  p50Ms: number;
13071
13479
  p95Ms: number;
13480
+ /**
13481
+ * Format: int64
13482
+ * @description As in totals.
13483
+ */
13484
+ tokensInReadKnown?: number;
13485
+ /**
13486
+ * Format: int64
13487
+ * @description As in totals.
13488
+ */
13489
+ tokensCachedReadKnown?: number;
13072
13490
  }[];
13073
13491
  byosReasons?: {
13074
13492
  code: string;
@@ -13116,6 +13534,10 @@ export interface components {
13116
13534
  email: string;
13117
13535
  };
13118
13536
  device: string;
13537
+ /** @description False for a desktop that is online but has lending to apps switched off in Studio. Such a desktop is never offered a call, and its `models` is empty. */
13538
+ lending: boolean;
13539
+ /** @description The desktop app's own version. Absent from a desktop that does not announce it. */
13540
+ studioVersion?: string;
13119
13541
  models: string[];
13120
13542
  options: string[];
13121
13543
  outdated: boolean;
@@ -13123,6 +13545,10 @@ export interface components {
13123
13545
  vendor: string;
13124
13546
  connected: boolean;
13125
13547
  version?: string;
13548
+ /** @description How the vendor is signed in on the desktop: `claudeai`, `console`, `bedrock`, `vertex`, `foundry`, `chatgpt`, `device` or `apikey` */
13549
+ via?: string;
13550
+ /** @description The vendor's plan code for the signed-in account (`plus`, `pro`, `max` …), when the desktop knows it. The vendor account's email is never sent. */
13551
+ planType?: string;
13126
13552
  }[];
13127
13553
  inflight: number;
13128
13554
  /** @description How many lent calls at once this desktop's owner allows (1–8; 2 when the desktop does not say) */
@@ -13324,43 +13750,230 @@ export interface components {
13324
13750
  pro: components["schemas"]["PlanLimits"];
13325
13751
  };
13326
13752
  };
13327
- /** @description The limits that apply to one plan */
13328
- PlanLimits: {
13329
- projects: number;
13330
- /** Format: int64 */
13331
- storageBytes: number;
13753
+ /** @description The org's spending limit and this month's overage against it. */
13754
+ SpendingLimit: {
13755
+ orgId: string;
13756
+ /** @enum {string} */
13757
+ plan: "free" | "pro";
13758
+ /** @description The plan's billing status (active, past_due, canceled, granted), empty on Free */
13759
+ status: string;
13760
+ /** @description False on Free and on a granted Pro: the limit does nothing there */
13761
+ applies: boolean;
13762
+ /** @enum {string} */
13763
+ notApplicableReason?: "free" | "granted";
13764
+ /** @description The limit, in cents per month above the included amounts */
13765
+ cents: number;
13766
+ /** @description The default limit ($20) */
13767
+ defaultCents: number;
13768
+ /** @description The most it can be set to here ($1,000) */
13769
+ maxCents: number;
13332
13770
  /**
13333
- * Format: int64
13334
- * @description The project Postgres size cap for this plan (Free 500 MiB, Pro 8 GiB). The
13335
- * dashboard's usage meter and chart read this value, and you are notified when a
13336
- * project passes 90% of it.
13771
+ * Format: date
13772
+ * @description First day of the month the overage belongs to
13337
13773
  */
13338
- dbCapBytes: number;
13339
- /** @description how many database generations are retained */
13340
- backupKeep: number;
13341
- crons: number;
13342
- mailPerHour: number;
13343
- };
13344
- /**
13345
- * @description The state of the project's dedicated object storage.
13346
- *
13347
- * **Objects are not part of database generations** — `runlot pg restore` does not roll back
13348
- * files. Read-after-write is guaranteed, but `list` may lag.
13349
- */
13350
- StorageStatus: {
13774
+ month: string;
13351
13775
  /**
13352
- * @description Whether object storage is turned on for this project. When it is off, there is no
13353
- * bucket at all, and `prefix` and `quotaBytes` are empty.
13776
+ * Format: int64
13777
+ * @description This month's accrued overage (1 cent = 1,000,000)
13354
13778
  */
13355
- granted: boolean;
13779
+ overageMicroCents: number;
13356
13780
  /**
13357
- * @description The prefix every object of this project is stored under. It is added for you, so
13358
- * your own keys stay relative to it and no key you send can reach another project's
13359
- * storage. Empty when storage is not configured.
13360
- * @example p/6f1a0b4c-0000-0000-0000-000000000001/
13781
+ * @description This month's overage by axis, in microcents. The platform axes are the nominal price
13782
+ * of what was used; `collection` is what error and observability collection was billed
13783
+ * within the limit. Their sum can exceed `overageMicroCents` when held storage and memory
13784
+ * were stopped at the limit.
13361
13785
  */
13362
- prefix: string;
13363
- /**
13786
+ breakdown: {
13787
+ /** Format: int64 */
13788
+ requests: number;
13789
+ /** Format: int64 */
13790
+ cpu: number;
13791
+ /** Format: int64 */
13792
+ storage: number;
13793
+ /** Format: int64 */
13794
+ memory: number;
13795
+ /** Format: int64 */
13796
+ collection: number;
13797
+ };
13798
+ /** @description The locks in force; `spend` is the spending limit */
13799
+ throttled: ("requests" | "cpu" | "spend")[];
13800
+ /**
13801
+ * Format: date-time
13802
+ * @description When the locks end
13803
+ */
13804
+ throttledUntil: string | null;
13805
+ /** @description The limit before the change (PUT only) */
13806
+ previousCents?: number;
13807
+ /** @description The organization's projects, by name, with their own spending limits and shares */
13808
+ projects?: components["schemas"]["ProjectSpendLine"][];
13809
+ };
13810
+ /** @description One project's own spending limit and its share of this month's overage. */
13811
+ ProjectSpendLine: {
13812
+ name: string;
13813
+ /** @description The project's own limit in cents; null is none (only the organization's applies) */
13814
+ cents: number | null;
13815
+ /**
13816
+ * Format: int64
13817
+ * @description The project's share of the organization's overage this month (1 cent = 1,000,000)
13818
+ */
13819
+ shareMicroCents: number;
13820
+ breakdown: components["schemas"]["ProjectSpendBreakdown"];
13821
+ /** @description The project's own limit is spent: its requests get 429 project_budget_exhausted */
13822
+ throttled: boolean;
13823
+ /**
13824
+ * Format: date-time
13825
+ * @description When the project's lock ends
13826
+ */
13827
+ throttledUntil: string | null;
13828
+ };
13829
+ /** @description A project's share by axis, in microcents. Collection is not part of a project's share. */
13830
+ ProjectSpendBreakdown: {
13831
+ /** Format: int64 */
13832
+ requests: number;
13833
+ /** Format: int64 */
13834
+ cpu: number;
13835
+ /** Format: int64 */
13836
+ storage: number;
13837
+ /** Format: int64 */
13838
+ memory: number;
13839
+ };
13840
+ SpendingLimitUpdate: {
13841
+ /** @description The new limit in cents */
13842
+ cents: number;
13843
+ };
13844
+ /** @description A project's app memory, per-request CPU and spending limits. */
13845
+ ProjectLimits: {
13846
+ projectId: string;
13847
+ /** @enum {string} */
13848
+ plan: "free" | "pro";
13849
+ hasDatabase: boolean;
13850
+ appMemory: {
13851
+ /**
13852
+ * Format: int64
13853
+ * @description The most one copy of the app may use
13854
+ */
13855
+ bytes: number;
13856
+ /**
13857
+ * Format: int64
13858
+ * @description The value with no project setting
13859
+ */
13860
+ planBytes: number;
13861
+ /** Format: int64 */
13862
+ minBytes: number;
13863
+ /**
13864
+ * Format: int64
13865
+ * @description The most it can be set to now (plan and server together)
13866
+ */
13867
+ maxBytes: number;
13868
+ /**
13869
+ * Format: int64
13870
+ * @description The project's memory cap, database and app together
13871
+ */
13872
+ projectBytes: number;
13873
+ /**
13874
+ * Format: int64
13875
+ * @description Memory a project-hour holds without being billed
13876
+ */
13877
+ includedProjectBytes: number;
13878
+ /** @description Memory above includedProjectBytes is billed for this project */
13879
+ billed: boolean;
13880
+ /**
13881
+ * @description Who set the value; null is the plan's
13882
+ * @enum {string|null}
13883
+ */
13884
+ setBy: "customer" | "operator" | null;
13885
+ /**
13886
+ * Format: int64
13887
+ * @description 14-day p99 hourly peak, database and app together
13888
+ */
13889
+ p99Bytes: number | null;
13890
+ };
13891
+ requestCpu: {
13892
+ /** @description CPU one request may spend, in milliseconds */
13893
+ ms: number;
13894
+ planMs: number;
13895
+ minMs: number;
13896
+ maxMs: number;
13897
+ /** @enum {string|null} */
13898
+ setBy: "customer" | null;
13899
+ };
13900
+ /** @description The project's own spending limit, under the organization's, and its share this month */
13901
+ spend: {
13902
+ /** @description False on Free and on a granted Pro: a limit does nothing there */
13903
+ applies: boolean;
13904
+ /** @enum {string} */
13905
+ notApplicableReason?: "free" | "granted";
13906
+ /** @description The project's own limit in cents a month; null is none */
13907
+ cents: number | null;
13908
+ /** @description The organization's spending limit, the most this one can be set to */
13909
+ orgCents: number;
13910
+ /**
13911
+ * Format: date
13912
+ * @description First day of the month the share belongs to
13913
+ */
13914
+ month: string;
13915
+ /**
13916
+ * Format: int64
13917
+ * @description The project's share of the organization's overage this month (1 cent = 1,000,000)
13918
+ */
13919
+ shareMicroCents: number;
13920
+ breakdown: components["schemas"]["ProjectSpendBreakdown"];
13921
+ /** @description The limit is spent: this project's requests get 429 project_budget_exhausted */
13922
+ throttled: boolean;
13923
+ /**
13924
+ * Format: date-time
13925
+ * @description When the project's lock ends
13926
+ */
13927
+ throttledUntil: string | null;
13928
+ };
13929
+ };
13930
+ /** @description A field left out is unchanged; null puts it back on the plan's value (for spendCents: no limit of the project's own). */
13931
+ ProjectLimitsUpdate: {
13932
+ /** Format: int64 */
13933
+ appMemoryBytes?: number | null;
13934
+ requestCpuMs?: number | null;
13935
+ /** @description The project's own spending limit in cents a month, at most the organization's */
13936
+ spendCents?: number | null;
13937
+ /** @description Set app memory below the 14-day p99 anyway */
13938
+ confirm?: boolean;
13939
+ };
13940
+ /** @description The limits that apply to one plan */
13941
+ PlanLimits: {
13942
+ projects: number;
13943
+ /** Format: int64 */
13944
+ storageBytes: number;
13945
+ /**
13946
+ * Format: int64
13947
+ * @description The project Postgres size cap for this plan (Free 500 MiB, Pro 8 GiB). The
13948
+ * dashboard's usage meter and chart read this value, and you are notified when a
13949
+ * project passes 90% of it.
13950
+ */
13951
+ dbCapBytes: number;
13952
+ /** @description how many database generations are retained */
13953
+ backupKeep: number;
13954
+ crons: number;
13955
+ mailPerHour: number;
13956
+ };
13957
+ /**
13958
+ * @description The state of the project's dedicated object storage.
13959
+ *
13960
+ * **Objects are not part of database generations** — `runlot db restore` does not roll back
13961
+ * files. Read-after-write is guaranteed, but `list` may lag.
13962
+ */
13963
+ StorageStatus: {
13964
+ /**
13965
+ * @description Whether object storage is turned on for this project. When it is off, there is no
13966
+ * bucket at all, and `prefix` and `quotaBytes` are empty.
13967
+ */
13968
+ granted: boolean;
13969
+ /**
13970
+ * @description The prefix every object of this project is stored under. It is added for you, so
13971
+ * your own keys stay relative to it and no key you send can reach another project's
13972
+ * storage. Empty when storage is not configured.
13973
+ * @example p/6f1a0b4c-0000-0000-0000-000000000001/
13974
+ */
13975
+ prefix: string;
13976
+ /**
13364
13977
  * Format: int64
13365
13978
  * @description The quota (10 GiB on Free, 100 GiB on Pro). Once you exceed it, only `put` and
13366
13979
  * `presign(PUT)` are rejected — `get`, `list`, and `delete` keep working, so you can
@@ -14224,6 +14837,150 @@ export interface components {
14224
14837
  /** @description false on Free: deploy regressions only. */
14225
14838
  full: boolean;
14226
14839
  };
14840
+ /**
14841
+ * @description The worst open risk: alert, then warn; ok when none is open.
14842
+ * @enum {string}
14843
+ */
14844
+ HealthStatus: "ok" | "warn" | "alert";
14845
+ HealthCheck: {
14846
+ /** @description app_memory, app_restarts, db_memory, app_cpu, request_cpu, app_stall, busy_latency, db_admission, rpc_not_disposed, ai_refusals, org_budget, project_budget, db_size, file_storage, log_cap or cron_overlap. */
14847
+ signal: string;
14848
+ /** @enum {string} */
14849
+ state: "ok" | "warn" | "alert" | "unknown";
14850
+ /** @description Why an `unknown` check was not measured. */
14851
+ reason?: string;
14852
+ };
14853
+ HealthEvidence: {
14854
+ /** @description What was measured, for example `peak`, `cores` or `share`. */
14855
+ name: string;
14856
+ value: number;
14857
+ /** @description bytes, fraction, cores, ms, count, per_second or cents. */
14858
+ unit: string;
14859
+ /** @description The hard limit the value is compared with, in the same unit. */
14860
+ limit?: number;
14861
+ /** @description The span the value covers, for example `24h` or `3d`. */
14862
+ window: string;
14863
+ };
14864
+ HealthRisk: {
14865
+ /** Format: uuid */
14866
+ id: string;
14867
+ signal: string;
14868
+ /** @enum {string} */
14869
+ severity: "warn" | "alert";
14870
+ /** @description The route, cron expression or log template the risk is about; absent when it is the whole project. */
14871
+ route?: string;
14872
+ /** Format: date-time */
14873
+ since: string;
14874
+ /** Format: date-time */
14875
+ updatedAt: string;
14876
+ /** @description One sentence: what, how close. */
14877
+ summary: string;
14878
+ evidence: components["schemas"]["HealthEvidence"][];
14879
+ /** @description Concrete steps, the most useful first. */
14880
+ next: string[];
14881
+ links: {
14882
+ label: string;
14883
+ /** @description A dashboard path under the project, for example `/observability/infrastructure?range=24h`. */
14884
+ path: string;
14885
+ }[];
14886
+ };
14887
+ CapacityEstimate: {
14888
+ /** @description The span the estimate reads: `3d`, the per-minute samples of the last three days. */
14889
+ window: string;
14890
+ /** @description Requests in the window that reached the app. Below 1,000 there is no estimate. */
14891
+ requests: number;
14892
+ /** @description Requests in the same minutes that Runlot answered before the app ran (outcome `unavailable`: the rate limit, the budget, the access gate, a failed wake). They cost the app no CPU, so the mean leaves them out. */
14893
+ refusedRequests?: number;
14894
+ busiestMinute?: {
14895
+ /** Format: date-time */
14896
+ at: string;
14897
+ /** @description Requests that reached the app, per second, in the busiest minute. */
14898
+ requestsPerSecond: number;
14899
+ appCores: number;
14900
+ ownerCores?: number;
14901
+ };
14902
+ appCpuMsPerRequest?: {
14903
+ mean: number;
14904
+ };
14905
+ /** @description 0.7 of one core divided by the mean app CPU per request. */
14906
+ ceilingRequestsPerSecond?: number;
14907
+ /** @description The ceiling divided by the busiest minute's rate. */
14908
+ headroom?: number;
14909
+ /** @description The app's peak memory as a fraction of its limit over the window. */
14910
+ memoryPeakFraction?: number;
14911
+ /** @description What the estimate cannot see. */
14912
+ notCovered: string[];
14913
+ };
14914
+ ProjectHealth: {
14915
+ /**
14916
+ * Format: date-time
14917
+ * @description When the checks last ran. Absent when they have never run for this project.
14918
+ */
14919
+ checkedAt?: string;
14920
+ status: components["schemas"]["HealthStatus"];
14921
+ /** @description Open risks, alert first, then warn. */
14922
+ risks: components["schemas"]["HealthRisk"][];
14923
+ checks: components["schemas"]["HealthCheck"][];
14924
+ capacity?: components["schemas"]["CapacityEstimate"];
14925
+ /** @description The live deployment's deploy-time static checks. They do not change `status`: the checks read code, `status` reads production. Absent when nothing is deployed. */
14926
+ staticChecks?: {
14927
+ /** @description The live deployment's version. */
14928
+ version: number;
14929
+ /** Format: date-time */
14930
+ deployedAt: string;
14931
+ /** @description Absent when that deployment was not checked. */
14932
+ report?: components["schemas"]["DeployStaticChecks"];
14933
+ };
14934
+ };
14935
+ OrgHealth: {
14936
+ /** Format: date-time */
14937
+ checkedAt?: string;
14938
+ status: components["schemas"]["HealthStatus"];
14939
+ budget: components["schemas"]["HealthCheck"];
14940
+ projects: {
14941
+ name: string;
14942
+ status: components["schemas"]["HealthStatus"];
14943
+ alerts: number;
14944
+ warns: number;
14945
+ /** Format: date-time */
14946
+ checkedAt?: string;
14947
+ }[];
14948
+ };
14949
+ DeployStaticCheckFinding: {
14950
+ /** @description The rule's id: `rpc-result-not-disposed`, `module-cache-unbounded`, `module-state-per-request`, `interval-in-request`, `time-loop-never-ends`, `sync-cpu-in-request`, `bundle-size`, `source-map-size`. New ids may appear. */
14951
+ rule: string;
14952
+ /**
14953
+ * @description No finding refuses a deploy.
14954
+ * @enum {string}
14955
+ */
14956
+ severity: "warn" | "info";
14957
+ /** @description Project-relative path of the user's own source file. Absent for a finding about the whole bundle. */
14958
+ file?: string;
14959
+ line?: number;
14960
+ column?: number;
14961
+ /** @description This occurrence, one sentence. */
14962
+ message: string;
14963
+ /** @description The Runlot limit it runs into. */
14964
+ why: string;
14965
+ fix: string;
14966
+ };
14967
+ /**
14968
+ * @description What `runlot deploy` found in the project's own code (never node_modules) before the
14969
+ * upload: known patterns that hurt an app on Runlot under traffic. Warnings only.
14970
+ * Silence one line with `// runlot-ignore <rule>` on it or the line above.
14971
+ */
14972
+ DeployStaticChecks: {
14973
+ findings: components["schemas"]["DeployStaticCheckFinding"][];
14974
+ /** @description Findings past the 50 listed. */
14975
+ omitted: number;
14976
+ filesScanned: number;
14977
+ /** @description Files that did not parse or were too large to read. */
14978
+ filesSkipped: number;
14979
+ /** @description Why some or all of the code was not read, when it was not. */
14980
+ note?: string;
14981
+ /** @description The CLI that ran the checks. */
14982
+ analyzer?: string;
14983
+ };
14227
14984
  UptimeAssertion: {
14228
14985
  /** @enum {string} */
14229
14986
  source: "status" | "header" | "body" | "jsonPath" | "latency";
@@ -15181,6 +15938,8 @@ export interface components {
15181
15938
  ReleaseIssueCursor: string;
15182
15939
  OrgSlug: components["schemas"]["Slug"];
15183
15940
  ProjectName: components["schemas"]["Slug"];
15941
+ /** @description A database's name in the organization */
15942
+ DatabaseName: components["schemas"]["Slug"];
15184
15943
  /** @description A queue name as the manifest wrote it (`^[a-z0-9-]{1,63}$`). */
15185
15944
  QueueName: string;
15186
15945
  /**
@@ -16483,9 +17242,83 @@ export interface operations {
16483
17242
  * enrollment banner when an organization sets `requireTotp`.
16484
17243
  */
16485
17244
  totpEnabled: boolean;
17245
+ /**
17246
+ * @description Whether the dashboard should still ask "How did you hear about Runlot?".
17247
+ * False once the question was answered or dismissed (`PUT /v1/me/heard-from`).
17248
+ */
17249
+ heardFromPending: boolean;
17250
+ /**
17251
+ * Format: date-time
17252
+ * @description When this account consented to advertising email; null when it has not
17253
+ * (`PUT /v1/me/marketing-consent`).
17254
+ */
17255
+ marketingEmailConsentAt?: string | null;
17256
+ };
17257
+ };
17258
+ };
17259
+ 401: components["responses"]["Unauthorized"];
17260
+ };
17261
+ };
17262
+ answerHeardFrom: {
17263
+ parameters: {
17264
+ query?: never;
17265
+ header?: never;
17266
+ path?: never;
17267
+ cookie?: never;
17268
+ };
17269
+ requestBody: {
17270
+ content: {
17271
+ "application/json": {
17272
+ /** @description Free text in the person's own words; empty to dismiss */
17273
+ answer: string;
17274
+ };
17275
+ };
17276
+ };
17277
+ responses: {
17278
+ /** @description Recorded, or already recorded before */
17279
+ 204: {
17280
+ headers: {
17281
+ [name: string]: unknown;
17282
+ };
17283
+ content?: never;
17284
+ };
17285
+ 400: components["responses"]["BadRequest"];
17286
+ 401: components["responses"]["Unauthorized"];
17287
+ };
17288
+ };
17289
+ setMarketingConsent: {
17290
+ parameters: {
17291
+ query?: never;
17292
+ header?: never;
17293
+ path?: never;
17294
+ cookie?: never;
17295
+ };
17296
+ requestBody: {
17297
+ content: {
17298
+ "application/json": {
17299
+ granted: boolean;
17300
+ /**
17301
+ * @description The screen the choice was made on
17302
+ * @enum {string}
17303
+ */
17304
+ source: "login" | "sign_up" | "account";
17305
+ };
17306
+ };
17307
+ };
17308
+ responses: {
17309
+ /** @description The consent that now stands */
17310
+ 200: {
17311
+ headers: {
17312
+ [name: string]: unknown;
17313
+ };
17314
+ content: {
17315
+ "application/json": {
17316
+ /** Format: date-time */
17317
+ marketingEmailConsentAt: string | null;
16486
17318
  };
16487
17319
  };
16488
17320
  };
17321
+ 400: components["responses"]["BadRequest"];
16489
17322
  401: components["responses"]["Unauthorized"];
16490
17323
  };
16491
17324
  };
@@ -16842,7 +17675,10 @@ export interface operations {
16842
17675
  403: components["responses"]["Forbidden"];
16843
17676
  /**
16844
17677
  * @description The name is already taken (`project_name_taken`, `hostname_taken`), or the plan's
16845
- * project limit has been reached (`project_limit`).
17678
+ * project limit has been reached (`project_limit`). A database of the same name
17679
+ * whose earlier project's leftovers are still being erased answers
17680
+ * `database_name_pending` (`details.purgeAfter`); otherwise the new project takes
17681
+ * that database over as `env.db` and the answer carries `existingDatabase`.
16846
17682
  *
16847
17683
  * The `details` of `project_limit` is `{limit, count, plan}` — read the numbers from
16848
17684
  * there rather than parsing the message. It is 409 because retrying will not change
@@ -16913,7 +17749,7 @@ export interface operations {
16913
17749
  400: components["responses"]["BadRequest"];
16914
17750
  403: components["responses"]["Forbidden"];
16915
17751
  404: components["responses"]["NotFound"];
16916
- /** @description Another operation is in progress (`op_in_flight`) */
17752
+ /** @description Another operation is in progress (`op_in_flight`). */
16917
17753
  409: {
16918
17754
  headers: {
16919
17755
  [name: string]: unknown;
@@ -17111,6 +17947,11 @@ export interface operations {
17111
17947
  * allows (usually after a downgrade). Every project's deploys are paused until one is
17112
17948
  * disabled or deleted, or the plan is upgraded; nothing is deleted automatically.
17113
17949
  * `project_disabled` — this project is disabled; enable it first.
17950
+ * `database_not_found` — `runlot.json` names a database (`databases`) the
17951
+ * organization does not have; `details` carries `binding` and `database`.
17952
+ * `binding_needs_colocation` — this project already runs where it cannot reach a
17953
+ * database it binds. `database_limit`, `plan_required` (binding a database into a
17954
+ * second project is Pro), `database_name_pending`.
17114
17955
  */
17115
17956
  409: {
17116
17957
  headers: {
@@ -17247,7 +18088,18 @@ export interface operations {
17247
18088
  };
17248
18089
  cookie?: never;
17249
18090
  };
17250
- requestBody?: never;
18091
+ /**
18092
+ * @description Optional. What the deploy-time static checks found in this bundle's code, stored with
18093
+ * the deployment. A report that does not fit the schema is dropped and named in the
18094
+ * deployment's `warnings`; it never refuses the deploy.
18095
+ */
18096
+ requestBody?: {
18097
+ content: {
18098
+ "application/json": {
18099
+ staticChecks?: components["schemas"]["DeployStaticChecks"];
18100
+ };
18101
+ };
18102
+ };
17251
18103
  responses: {
17252
18104
  /** @description The created deployment */
17253
18105
  201: {
@@ -19005,46 +19857,20 @@ export interface operations {
19005
19857
  header?: never;
19006
19858
  path: {
19007
19859
  orgSlug: components["parameters"]["OrgSlug"];
19008
- projectName: components["parameters"]["ProjectName"];
19009
- };
19010
- cookie?: never;
19011
- };
19012
- requestBody?: never;
19013
- responses: {
19014
- /** @description Whether the database is available */
19015
- 200: {
19016
- headers: {
19017
- [name: string]: unknown;
19018
- };
19019
- content: {
19020
- "application/json": {
19021
- db: boolean;
19022
- };
19023
- };
19024
- };
19025
- 403: components["responses"]["Forbidden"];
19026
- 404: components["responses"]["NotFound"];
19027
- };
19028
- };
19029
- createDatabase: {
19030
- parameters: {
19031
- query?: never;
19032
- header?: never;
19033
- path: {
19034
- orgSlug: components["parameters"]["OrgSlug"];
19035
- projectName: components["parameters"]["ProjectName"];
19860
+ /** @description A database's name in the organization */
19861
+ databaseName: components["parameters"]["DatabaseName"];
19036
19862
  };
19037
19863
  cookie?: never;
19038
19864
  };
19039
19865
  requestBody?: never;
19040
19866
  responses: {
19041
- /** @description Credentials and connection info */
19867
+ /** @description The database */
19042
19868
  200: {
19043
19869
  headers: {
19044
19870
  [name: string]: unknown;
19045
19871
  };
19046
19872
  content: {
19047
- "application/json": components["schemas"]["DatabaseConnect"];
19873
+ "application/json": components["schemas"]["OrgDatabase"];
19048
19874
  };
19049
19875
  };
19050
19876
  403: components["responses"]["Forbidden"];
@@ -19057,7 +19883,8 @@ export interface operations {
19057
19883
  header?: never;
19058
19884
  path: {
19059
19885
  orgSlug: components["parameters"]["OrgSlug"];
19060
- projectName: components["parameters"]["ProjectName"];
19886
+ /** @description A database's name in the organization */
19887
+ databaseName: components["parameters"]["DatabaseName"];
19061
19888
  };
19062
19889
  cookie?: never;
19063
19890
  };
@@ -19090,7 +19917,8 @@ export interface operations {
19090
19917
  header?: never;
19091
19918
  path: {
19092
19919
  orgSlug: components["parameters"]["OrgSlug"];
19093
- projectName: components["parameters"]["ProjectName"];
19920
+ /** @description A database's name in the organization */
19921
+ databaseName: components["parameters"]["DatabaseName"];
19094
19922
  };
19095
19923
  cookie?: never;
19096
19924
  };
@@ -19118,7 +19946,8 @@ export interface operations {
19118
19946
  header?: never;
19119
19947
  path: {
19120
19948
  orgSlug: components["parameters"]["OrgSlug"];
19121
- projectName: components["parameters"]["ProjectName"];
19949
+ /** @description A database's name in the organization */
19950
+ databaseName: components["parameters"]["DatabaseName"];
19122
19951
  };
19123
19952
  cookie?: never;
19124
19953
  };
@@ -19145,7 +19974,8 @@ export interface operations {
19145
19974
  header?: never;
19146
19975
  path: {
19147
19976
  orgSlug: components["parameters"]["OrgSlug"];
19148
- projectName: components["parameters"]["ProjectName"];
19977
+ /** @description A database's name in the organization */
19978
+ databaseName: components["parameters"]["DatabaseName"];
19149
19979
  };
19150
19980
  cookie?: never;
19151
19981
  };
@@ -19178,7 +20008,8 @@ export interface operations {
19178
20008
  header?: never;
19179
20009
  path: {
19180
20010
  orgSlug: components["parameters"]["OrgSlug"];
19181
- projectName: components["parameters"]["ProjectName"];
20011
+ /** @description A database's name in the organization */
20012
+ databaseName: components["parameters"]["DatabaseName"];
19182
20013
  tokenUser: string;
19183
20014
  };
19184
20015
  cookie?: never;
@@ -19202,7 +20033,8 @@ export interface operations {
19202
20033
  header?: never;
19203
20034
  path: {
19204
20035
  orgSlug: components["parameters"]["OrgSlug"];
19205
- projectName: components["parameters"]["ProjectName"];
20036
+ /** @description A database's name in the organization */
20037
+ databaseName: components["parameters"]["DatabaseName"];
19206
20038
  };
19207
20039
  cookie?: never;
19208
20040
  };
@@ -19270,7 +20102,8 @@ export interface operations {
19270
20102
  header?: never;
19271
20103
  path: {
19272
20104
  orgSlug: components["parameters"]["OrgSlug"];
19273
- projectName: components["parameters"]["ProjectName"];
20105
+ /** @description A database's name in the organization */
20106
+ databaseName: components["parameters"]["DatabaseName"];
19274
20107
  };
19275
20108
  cookie?: never;
19276
20109
  };
@@ -19339,7 +20172,8 @@ export interface operations {
19339
20172
  header?: never;
19340
20173
  path: {
19341
20174
  orgSlug: components["parameters"]["OrgSlug"];
19342
- projectName: components["parameters"]["ProjectName"];
20175
+ /** @description A database's name in the organization */
20176
+ databaseName: components["parameters"]["DatabaseName"];
19343
20177
  };
19344
20178
  cookie?: never;
19345
20179
  };
@@ -19364,7 +20198,8 @@ export interface operations {
19364
20198
  header?: never;
19365
20199
  path: {
19366
20200
  orgSlug: components["parameters"]["OrgSlug"];
19367
- projectName: components["parameters"]["ProjectName"];
20201
+ /** @description A database's name in the organization */
20202
+ databaseName: components["parameters"]["DatabaseName"];
19368
20203
  };
19369
20204
  cookie?: never;
19370
20205
  };
@@ -19423,7 +20258,8 @@ export interface operations {
19423
20258
  header?: never;
19424
20259
  path: {
19425
20260
  orgSlug: components["parameters"]["OrgSlug"];
19426
- projectName: components["parameters"]["ProjectName"];
20261
+ /** @description A database's name in the organization */
20262
+ databaseName: components["parameters"]["DatabaseName"];
19427
20263
  };
19428
20264
  cookie?: never;
19429
20265
  };
@@ -19442,7 +20278,7 @@ export interface operations {
19442
20278
  "application/json": components["schemas"]["OperationStarted"];
19443
20279
  };
19444
20280
  };
19445
- /** @description The confirmation string does not match the project name (`confirm_mismatch`) */
20281
+ /** @description The confirmation string does not match the database name (`confirm_mismatch`) */
19446
20282
  400: {
19447
20283
  headers: {
19448
20284
  [name: string]: unknown;
@@ -19461,7 +20297,11 @@ export interface operations {
19461
20297
  "application/json": components["schemas"]["Error"];
19462
20298
  };
19463
20299
  };
19464
- /** @description Another operation is already in progress (`operation_in_progress`) */
20300
+ /**
20301
+ * @description Another operation is already in progress (`operation_in_progress`), or the
20302
+ * database is bound into projects (`database_bound`, `details.bindings` lists
20303
+ * them).
20304
+ */
19465
20305
  409: {
19466
20306
  headers: {
19467
20307
  [name: string]: unknown;
@@ -19478,7 +20318,8 @@ export interface operations {
19478
20318
  header?: never;
19479
20319
  path: {
19480
20320
  orgSlug: components["parameters"]["OrgSlug"];
19481
- projectName: components["parameters"]["ProjectName"];
20321
+ /** @description A database's name in the organization */
20322
+ databaseName: components["parameters"]["DatabaseName"];
19482
20323
  /**
19483
20324
  * @description The operation id. **Not a credential** — an operation that does not belong to the
19484
20325
  * project in the path returns 404.
@@ -19516,7 +20357,8 @@ export interface operations {
19516
20357
  header?: never;
19517
20358
  path: {
19518
20359
  orgSlug: components["parameters"]["OrgSlug"];
19519
- projectName: components["parameters"]["ProjectName"];
20360
+ /** @description A database's name in the organization */
20361
+ databaseName: components["parameters"]["DatabaseName"];
19520
20362
  /**
19521
20363
  * @description The operation id. **Not a credential** — an operation that does not belong to the
19522
20364
  * project in the path returns 404.
@@ -20788,6 +21630,8 @@ export interface operations {
20788
21630
  /** @description capped at 4,096 by the lane */
20789
21631
  maxTokens?: number;
20790
21632
  temperature?: number;
21633
+ /** @description answer as server-sent events instead of one JSON body */
21634
+ stream?: boolean;
20791
21635
  /** @description `env.ai.run`'s reasoning option. cp-core checks `effort` against the model's catalog row. */
20792
21636
  reasoning?: {
20793
21637
  /** @description one of the model's `effortLevels` */
@@ -20841,8 +21685,11 @@ export interface operations {
20841
21685
  * @description the part of inputTokens written to the prompt cache
20842
21686
  */
20843
21687
  cacheWriteInputTokens?: number;
21688
+ /** @description the cache counts the provider did not report; each is 0 above for lack of information. Absent when every count was reported */
21689
+ unreported?: ("cachedInputTokens" | "cacheWriteInputTokens")[];
20844
21690
  };
20845
21691
  };
21692
+ "text/event-stream": string;
20846
21693
  };
20847
21694
  };
20848
21695
  400: components["responses"]["BadRequest"];
@@ -21454,7 +22301,7 @@ export interface operations {
21454
22301
  /**
21455
22302
  * @description `database_required` — this project's database was deleted.
21456
22303
  * `database_disabled` — `runlot.json` says `"database": false`.
21457
- * Either way, create the database with `POST …/database` (`runlot pg on`) first.
22304
+ * Either way, create the database with `POST /v1/orgs/{orgSlug}/databases` (`runlot db create <project>`) first.
21458
22305
  */
21459
22306
  409: {
21460
22307
  headers: {
@@ -22445,7 +23292,133 @@ export interface operations {
22445
23292
  };
22446
23293
  };
22447
23294
  };
22448
- listMembers: {
23295
+ getSpendingLimit: {
23296
+ parameters: {
23297
+ query?: never;
23298
+ header?: never;
23299
+ path: {
23300
+ orgSlug: components["parameters"]["OrgSlug"];
23301
+ };
23302
+ cookie?: never;
23303
+ };
23304
+ requestBody?: never;
23305
+ responses: {
23306
+ /** @description The spending limit */
23307
+ 200: {
23308
+ headers: {
23309
+ [name: string]: unknown;
23310
+ };
23311
+ content: {
23312
+ "application/json": components["schemas"]["SpendingLimit"];
23313
+ };
23314
+ };
23315
+ 403: components["responses"]["Forbidden"];
23316
+ 404: components["responses"]["NotFound"];
23317
+ };
23318
+ };
23319
+ setSpendingLimit: {
23320
+ parameters: {
23321
+ query?: never;
23322
+ header?: never;
23323
+ path: {
23324
+ orgSlug: components["parameters"]["OrgSlug"];
23325
+ };
23326
+ cookie?: never;
23327
+ };
23328
+ requestBody: {
23329
+ content: {
23330
+ "application/json": components["schemas"]["SpendingLimitUpdate"];
23331
+ };
23332
+ };
23333
+ responses: {
23334
+ /** @description The spending limit after the change */
23335
+ 200: {
23336
+ headers: {
23337
+ [name: string]: unknown;
23338
+ };
23339
+ content: {
23340
+ "application/json": components["schemas"]["SpendingLimit"];
23341
+ };
23342
+ };
23343
+ 400: components["responses"]["BadRequest"];
23344
+ 403: components["responses"]["Forbidden"];
23345
+ 404: components["responses"]["NotFound"];
23346
+ /** @description `spending_limit_not_applicable` */
23347
+ 409: {
23348
+ headers: {
23349
+ [name: string]: unknown;
23350
+ };
23351
+ content: {
23352
+ "application/json": components["schemas"]["Error"];
23353
+ };
23354
+ };
23355
+ };
23356
+ };
23357
+ getProjectLimits: {
23358
+ parameters: {
23359
+ query?: never;
23360
+ header?: never;
23361
+ path: {
23362
+ orgSlug: components["parameters"]["OrgSlug"];
23363
+ projectName: components["parameters"]["ProjectName"];
23364
+ };
23365
+ cookie?: never;
23366
+ };
23367
+ requestBody?: never;
23368
+ responses: {
23369
+ /** @description The limits */
23370
+ 200: {
23371
+ headers: {
23372
+ [name: string]: unknown;
23373
+ };
23374
+ content: {
23375
+ "application/json": components["schemas"]["ProjectLimits"];
23376
+ };
23377
+ };
23378
+ 403: components["responses"]["Forbidden"];
23379
+ 404: components["responses"]["NotFound"];
23380
+ };
23381
+ };
23382
+ setProjectLimits: {
23383
+ parameters: {
23384
+ query?: never;
23385
+ header?: never;
23386
+ path: {
23387
+ orgSlug: components["parameters"]["OrgSlug"];
23388
+ projectName: components["parameters"]["ProjectName"];
23389
+ };
23390
+ cookie?: never;
23391
+ };
23392
+ requestBody: {
23393
+ content: {
23394
+ "application/json": components["schemas"]["ProjectLimitsUpdate"];
23395
+ };
23396
+ };
23397
+ responses: {
23398
+ /** @description The limits after the change */
23399
+ 200: {
23400
+ headers: {
23401
+ [name: string]: unknown;
23402
+ };
23403
+ content: {
23404
+ "application/json": components["schemas"]["ProjectLimits"];
23405
+ };
23406
+ };
23407
+ 400: components["responses"]["BadRequest"];
23408
+ 403: components["responses"]["Forbidden"];
23409
+ 404: components["responses"]["NotFound"];
23410
+ /** @description `memory_limit_below_use`, `memory_limit_exceeds_node`, `memory_limit_set_by_operator` or `spending_limit_not_applicable` */
23411
+ 409: {
23412
+ headers: {
23413
+ [name: string]: unknown;
23414
+ };
23415
+ content: {
23416
+ "application/json": components["schemas"]["Error"];
23417
+ };
23418
+ };
23419
+ };
23420
+ };
23421
+ listMembers: {
22449
23422
  parameters: {
22450
23423
  query?: never;
22451
23424
  header?: never;
@@ -27781,6 +28754,203 @@ export interface operations {
27781
28754
  };
27782
28755
  };
27783
28756
  };
28757
+ getProjectHealth: {
28758
+ parameters: {
28759
+ query?: never;
28760
+ header?: never;
28761
+ path: {
28762
+ orgSlug: string;
28763
+ projectName: string;
28764
+ };
28765
+ cookie?: never;
28766
+ };
28767
+ requestBody?: never;
28768
+ responses: {
28769
+ /** @description Health */
28770
+ 200: {
28771
+ headers: {
28772
+ [name: string]: unknown;
28773
+ };
28774
+ content: {
28775
+ "application/json": components["schemas"]["ProjectHealth"];
28776
+ };
28777
+ };
28778
+ /** @description Request refused */
28779
+ 401: {
28780
+ headers: {
28781
+ [name: string]: unknown;
28782
+ };
28783
+ content?: never;
28784
+ };
28785
+ /** @description Request refused */
28786
+ 403: {
28787
+ headers: {
28788
+ [name: string]: unknown;
28789
+ };
28790
+ content?: never;
28791
+ };
28792
+ /** @description Request refused */
28793
+ 404: {
28794
+ headers: {
28795
+ [name: string]: unknown;
28796
+ };
28797
+ content?: never;
28798
+ };
28799
+ };
28800
+ };
28801
+ listOrgDatabases: {
28802
+ parameters: {
28803
+ query?: never;
28804
+ header?: never;
28805
+ path: {
28806
+ orgSlug: components["parameters"]["OrgSlug"];
28807
+ };
28808
+ cookie?: never;
28809
+ };
28810
+ requestBody?: never;
28811
+ responses: {
28812
+ /** @description Databases */
28813
+ 200: {
28814
+ headers: {
28815
+ [name: string]: unknown;
28816
+ };
28817
+ content: {
28818
+ "application/json": components["schemas"]["OrgDatabases"];
28819
+ };
28820
+ };
28821
+ 403: components["responses"]["Forbidden"];
28822
+ 404: components["responses"]["NotFound"];
28823
+ };
28824
+ };
28825
+ createOrgDatabase: {
28826
+ parameters: {
28827
+ query?: never;
28828
+ header?: never;
28829
+ path: {
28830
+ orgSlug: components["parameters"]["OrgSlug"];
28831
+ };
28832
+ cookie?: never;
28833
+ };
28834
+ requestBody: {
28835
+ content: {
28836
+ "application/json": {
28837
+ name: components["schemas"]["Slug"];
28838
+ };
28839
+ };
28840
+ };
28841
+ responses: {
28842
+ /** @description The project's own database already existed or was created */
28843
+ 200: {
28844
+ headers: {
28845
+ [name: string]: unknown;
28846
+ };
28847
+ content: {
28848
+ "application/json": components["schemas"]["DatabaseConnect"];
28849
+ };
28850
+ };
28851
+ /** @description A new database */
28852
+ 201: {
28853
+ headers: {
28854
+ [name: string]: unknown;
28855
+ };
28856
+ content: {
28857
+ "application/json": components["schemas"]["DatabaseConnect"];
28858
+ };
28859
+ };
28860
+ 400: components["responses"]["BadRequest"];
28861
+ /** @description Not a member, or a standalone database on a plan without it (`plan_required`) */
28862
+ 403: {
28863
+ headers: {
28864
+ [name: string]: unknown;
28865
+ };
28866
+ content: {
28867
+ "application/json": components["schemas"]["Error"];
28868
+ };
28869
+ };
28870
+ /**
28871
+ * @description `name_taken` (`details.kind` is `project` or `database`), `database_limit`
28872
+ * (`details.limit`, `details.unbound` names databases no project binds),
28873
+ * `database_name_pending` (a deleted project's leftovers are still being erased
28874
+ * under this name; `details.purgeAfter`).
28875
+ */
28876
+ 409: {
28877
+ headers: {
28878
+ [name: string]: unknown;
28879
+ };
28880
+ content: {
28881
+ "application/json": components["schemas"]["Error"];
28882
+ };
28883
+ };
28884
+ };
28885
+ };
28886
+ unbindDatabase: {
28887
+ parameters: {
28888
+ query?: never;
28889
+ header?: never;
28890
+ path: {
28891
+ orgSlug: components["parameters"]["OrgSlug"];
28892
+ /** @description A database's name in the organization */
28893
+ databaseName: components["parameters"]["DatabaseName"];
28894
+ projectName: components["parameters"]["ProjectName"];
28895
+ };
28896
+ cookie?: never;
28897
+ };
28898
+ requestBody?: never;
28899
+ responses: {
28900
+ /** @description Unbound */
28901
+ 204: {
28902
+ headers: {
28903
+ [name: string]: unknown;
28904
+ };
28905
+ content?: never;
28906
+ };
28907
+ 403: components["responses"]["Forbidden"];
28908
+ 404: components["responses"]["NotFound"];
28909
+ };
28910
+ };
28911
+ getOrgHealth: {
28912
+ parameters: {
28913
+ query?: never;
28914
+ header?: never;
28915
+ path: {
28916
+ orgSlug: string;
28917
+ };
28918
+ cookie?: never;
28919
+ };
28920
+ requestBody?: never;
28921
+ responses: {
28922
+ /** @description Health */
28923
+ 200: {
28924
+ headers: {
28925
+ [name: string]: unknown;
28926
+ };
28927
+ content: {
28928
+ "application/json": components["schemas"]["OrgHealth"];
28929
+ };
28930
+ };
28931
+ /** @description Request refused */
28932
+ 401: {
28933
+ headers: {
28934
+ [name: string]: unknown;
28935
+ };
28936
+ content?: never;
28937
+ };
28938
+ /** @description Request refused */
28939
+ 403: {
28940
+ headers: {
28941
+ [name: string]: unknown;
28942
+ };
28943
+ content?: never;
28944
+ };
28945
+ /** @description Request refused */
28946
+ 404: {
28947
+ headers: {
28948
+ [name: string]: unknown;
28949
+ };
28950
+ content?: never;
28951
+ };
28952
+ };
28953
+ };
27784
28954
  listSynthetics: {
27785
28955
  parameters: {
27786
28956
  query?: never;