@onplo/sdk 0.0.1 → 0.0.2

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.
@@ -379,8 +379,8 @@ export interface paths {
379
379
  /**
380
380
  * Make an address the one Onplo writes to
381
381
  * @description EXACTLY ONE ADDRESS IS THE ONE ONPLO WRITES TO, and marking another unmarks it — the server's
382
- * job, never the caller's, as `updateSignInMethod` does for a Primary key. Only a VERIFIED
383
- * address can be marked, because Onplo never writes to one that is not.
382
+ * job, never the caller's, as `updateSignInMethod` does for the Primary sign-in method. Only a
383
+ * VERIFIED address can be marked, because Onplo never writes to one that is not.
384
384
  */
385
385
  patch: operations["updateEmailAddress"];
386
386
  trace?: never;
@@ -1465,6 +1465,10 @@ export interface paths {
1465
1465
  * @description A suggestion for the public roadmap, made in your account's name from your personal
1466
1466
  * environment: the suggestion is the person's, never a company's. An agent may draft one for you
1467
1467
  * to send, and never sends it itself.
1468
+ *
1469
+ * IT IS KEPT, AND NOTHING ELSE HAPPENS YET: Onplo reads it, merges duplicates, and lists it as
1470
+ * an Idea once moderated. Sending the same words twice makes two suggestions; there is no
1471
+ * idempotency key.
1468
1472
  */
1469
1473
  post: operations["suggestFeature"];
1470
1474
  delete?: never;
@@ -1473,6 +1477,43 @@ export interface paths {
1473
1477
  patch?: never;
1474
1478
  trace?: never;
1475
1479
  };
1480
+ "/feature-votes/{future_feature_id}": {
1481
+ parameters: {
1482
+ query?: never;
1483
+ header?: never;
1484
+ path: {
1485
+ /**
1486
+ * @description A future feature's permanent id, `<app>.feature.<concept>`, as its app's roadmap lists it:
1487
+ * `account.feature.family`. Lowercase, dot-separated, never rewritten when the title changes.
1488
+ */
1489
+ future_feature_id: components["parameters"]["FutureFeatureId"];
1490
+ };
1491
+ cookie?: never;
1492
+ };
1493
+ get?: never;
1494
+ /**
1495
+ * Vote for a future feature
1496
+ * @description Your one vote on a feature an app has decided to build later, cast from your personal
1497
+ * environment. "ONE PERSON, ONE VOTE — the vote belongs to the account, never to the
1498
+ * environment": somebody who belongs to twenty companies still has one vote on a feature. An
1499
+ * agent may draft a vote for you to cast, and never casts it itself.
1500
+ *
1501
+ * VOTING AGAIN IS THE SAME VOTE. A second vote on the same feature changes nothing and answers
1502
+ * the vote as it was first cast, so a retry whose answer was lost is never told it already
1503
+ * voted. There is no second vote to refuse, and so no 409.
1504
+ *
1505
+ * THE FEATURE IS NAMED BY ITS PERMANENT ID, `<app>.feature.<concept>`, as its app's roadmap
1506
+ * lists it. An id no app's roadmap lists is refused with a 422 naming `future_feature_id`, and
1507
+ * no vote is kept.
1508
+ */
1509
+ put: operations["castFeatureVote"];
1510
+ post?: never;
1511
+ delete?: never;
1512
+ options?: never;
1513
+ head?: never;
1514
+ patch?: never;
1515
+ trace?: never;
1516
+ };
1476
1517
  "/support-tickets": {
1477
1518
  parameters: {
1478
1519
  query?: never;
@@ -1491,7 +1532,13 @@ export interface paths {
1491
1532
  *
1492
1533
  * A TICKET SPLITS RATHER THAN BELONGS TO ONE APP: the conversation with you is Communication's,
1493
1534
  * and the work item is an ordinary task the Projects app renders. Account is the door; neither
1494
- * app exists yet to hold the rest.
1535
+ * app exists yet to hold the rest. UNTIL THEY DO, Account keeps the report as it was sent — the
1536
+ * app, the page, your words, whether you chose diagnostics, and the environment this credential
1537
+ * acts in — and that is all: no diagnostic bundle is gathered yet, and nobody answers in a
1538
+ * conversation yet. Sending the same report twice makes two.
1539
+ *
1540
+ * A PERSON REPORTS A PROBLEM: the conversation that follows is with you. A machine's or an
1541
+ * agent's credential is answered 404 `subject_not_person`.
1495
1542
  */
1496
1543
  post: operations["reportProblem"];
1497
1544
  delete?: never;
@@ -1648,9 +1695,9 @@ export interface paths {
1648
1695
  head?: never;
1649
1696
  /**
1650
1697
  * Edit a role
1651
- * @description Its name, what it grants, how it is held and where it may be granted. What is not sent stays as
1652
- * it is. Everyone holding it holds the new bundle from the next request. A built-in role is not
1653
- * edited: copy it into a role of the company's own instead.
1698
+ * @description Its name, what it grants, its Role selection on login and where it may be granted. What is not
1699
+ * sent stays as it is. Everyone holding it holds the new bundle from the next request. A built-in
1700
+ * role is not edited: copy it into a role of the company's own instead.
1654
1701
  */
1655
1702
  patch: operations["updateRole"];
1656
1703
  trace?: never;
@@ -4401,6 +4448,11 @@ export interface components {
4401
4448
  title: string;
4402
4449
  created_at: components["schemas"]["Timestamp"];
4403
4450
  };
4451
+ FeatureVote: {
4452
+ /** @description The future feature voted for, by its permanent id, `account.feature.family`. */
4453
+ feature_id: string;
4454
+ cast_at: components["schemas"]["Timestamp"];
4455
+ };
4404
4456
  ProblemReport: {
4405
4457
  /** @description The app it happened in, by its id. */
4406
4458
  app: string;
@@ -5261,6 +5313,11 @@ export interface components {
5261
5313
  DataSearchId: components["schemas"]["Id"];
5262
5314
  /** @description The feature's permanent id in Account's feature list. */
5263
5315
  FeatureId: string;
5316
+ /**
5317
+ * @description A future feature's permanent id, `<app>.feature.<concept>`, as its app's roadmap lists it:
5318
+ * `account.feature.family`. Lowercase, dot-separated, never rewritten when the title changes.
5319
+ */
5320
+ FutureFeatureId: string;
5264
5321
  /** @description One holder's Premium seat of one app. */
5265
5322
  PremiumSeatAssignmentId: components["schemas"]["Id"];
5266
5323
  /** @description An environment's id — here, a company you are a member of. */
@@ -7917,7 +7974,42 @@ export interface operations {
7917
7974
  415: components["responses"]["UnsupportedMediaType"];
7918
7975
  422: components["responses"]["Unprocessable"];
7919
7976
  500: components["responses"]["ServerError"];
7920
- 501: components["responses"]["NotImplemented"];
7977
+ 503: components["responses"]["ServiceUnavailable"];
7978
+ };
7979
+ };
7980
+ castFeatureVote: {
7981
+ parameters: {
7982
+ query?: never;
7983
+ header?: never;
7984
+ path: {
7985
+ /**
7986
+ * @description A future feature's permanent id, `<app>.feature.<concept>`, as its app's roadmap lists it:
7987
+ * `account.feature.family`. Lowercase, dot-separated, never rewritten when the title changes.
7988
+ */
7989
+ future_feature_id: components["parameters"]["FutureFeatureId"];
7990
+ };
7991
+ cookie?: never;
7992
+ };
7993
+ requestBody?: never;
7994
+ responses: {
7995
+ /** @description Your vote, as it was first cast. */
7996
+ 200: {
7997
+ headers: {
7998
+ "Onplo-Request-Id": components["headers"]["OnploRequestId"];
7999
+ [name: string]: unknown;
8000
+ };
8001
+ content: {
8002
+ "application/json": components["schemas"]["FeatureVote"];
8003
+ };
8004
+ };
8005
+ 400: components["responses"]["BadRequest"];
8006
+ 401: components["responses"]["Unauthorized"];
8007
+ 403: components["responses"]["Forbidden"];
8008
+ 404: components["responses"]["NotAPerson"];
8009
+ 413: components["responses"]["ContentTooLarge"];
8010
+ 415: components["responses"]["UnsupportedMediaType"];
8011
+ 422: components["responses"]["Unprocessable"];
8012
+ 500: components["responses"]["ServerError"];
7921
8013
  503: components["responses"]["ServiceUnavailable"];
7922
8014
  };
7923
8015
  };
@@ -7947,11 +8039,11 @@ export interface operations {
7947
8039
  400: components["responses"]["BadRequest"];
7948
8040
  401: components["responses"]["Unauthorized"];
7949
8041
  403: components["responses"]["Forbidden"];
8042
+ 404: components["responses"]["NotAPerson"];
7950
8043
  413: components["responses"]["ContentTooLarge"];
7951
8044
  415: components["responses"]["UnsupportedMediaType"];
7952
8045
  422: components["responses"]["Unprocessable"];
7953
8046
  500: components["responses"]["ServerError"];
7954
- 501: components["responses"]["NotImplemented"];
7955
8047
  503: components["responses"]["ServiceUnavailable"];
7956
8048
  };
7957
8049
  };
package/generated/ai.d.ts CHANGED
@@ -1121,12 +1121,11 @@ export interface paths {
1121
1121
  * THE AGENT MUST BE ONE YOU MAY USE, in this account environment, and turned on. Anything else
1122
1122
  * is refused (422 naming `agent_id`).
1123
1123
  *
1124
- * A MODEL CALL. Every one passes through the routing layer, which is not built
1125
- * (ONPLO-2225). IT ASKS THE MODEL SOMEBODY PICKED, AND ONPLO PICKS NONE (decision 0867): the
1124
+ * A MODEL CALL. Every one passes through the routing layer (ONPLO-2225).
1125
+ * IT ASKS THE MODEL SOMEBODY PICKED, AND ONPLO PICKS NONE (decision 0867): the
1126
1126
  * agent's own, or else your Default provider & model. With none picked, nothing is asked and
1127
- * no chat is made: 503 `no_model_picked`, which says where to pick one.
1128
- *
1129
- * **NOT BUILT YET — it answers 501 (ONPLO-1722).**
1127
+ * no chat is made: 503 `no_model_picked`, which says where to pick one. This said "the routing
1128
+ * layer, which is not built" and "NOT BUILT YET — it answers 501" until it was served (ONPLO-1722).
1130
1129
  */
1131
1130
  post: operations["startChat"];
1132
1131
  delete?: never;
@@ -1207,9 +1206,8 @@ export interface paths {
1207
1206
  * not carried on (409 `chat_in_trash`).
1208
1207
  *
1209
1208
  * A MODEL CALL, as starting one is. No answer leaves nothing behind: 503 `no_model_answered`.
1210
- * With no model picked, nothing is asked: 503 `no_model_picked` (decision 0867, rule 3).
1211
- *
1212
- * **NOT BUILT YET — it answers 501 (ONPLO-1722).**
1209
+ * With no model picked, nothing is asked: 503 `no_model_picked` (decision 0867, rule 3). This
1210
+ * said "NOT BUILT YET — it answers 501" until it was served (ONPLO-1722).
1213
1211
  */
1214
1212
  post: operations["carryOnChat"];
1215
1213
  delete?: never;
@@ -2614,6 +2612,72 @@ export interface paths {
2614
2612
  patch?: never;
2615
2613
  trace?: never;
2616
2614
  };
2615
+ "/machines/{machine_id}/times": {
2616
+ parameters: {
2617
+ query?: never;
2618
+ header?: never;
2619
+ path: {
2620
+ machine_id: components["parameters"]["MachineId"];
2621
+ };
2622
+ cookie?: never;
2623
+ };
2624
+ get?: never;
2625
+ /**
2626
+ * Set when a machine shows offline, and when its job shows stalled
2627
+ * @description "Offline after 3 missed heartbeats · stalled after 10 min silence", the defaults, "all tunable":
2628
+ * this is where one machine's own times are set. A machine on a slow line may be given longer before
2629
+ * it shows offline, and one running long jobs longer before a silent job shows stalled.
2630
+ *
2631
+ * BOTH ARE SENT EVERY TIME, and each replaces what the machine had. Sending 180 and 600 gives it the
2632
+ * defaults back. Setting the times it already has changes nothing, and answers it as it is.
2633
+ *
2634
+ * WHO MAY: whoever may Pause the machine, `ai:machine.suspend`, as the owner ruled (ONPLO-5200). One AI
2635
+ * was never told about answers 404, as reading it does.
2636
+ */
2637
+ put: operations["setMachineTimes"];
2638
+ post?: never;
2639
+ delete?: never;
2640
+ options?: never;
2641
+ head?: never;
2642
+ patch?: never;
2643
+ trace?: never;
2644
+ };
2645
+ "/machine-connector/work": {
2646
+ parameters: {
2647
+ query?: never;
2648
+ header?: never;
2649
+ path?: never;
2650
+ cookie?: never;
2651
+ };
2652
+ /**
2653
+ * A machine's waiting work
2654
+ * @description The connector "asks 'is there work for me?', and when there is, hands the job to the AI tool
2655
+ * already installed and signed in on that machine". This is that question: the jobs given to this
2656
+ * machine that wait to be picked up, in the order the task service lists them: it promises none.
2657
+ *
2658
+ * A MACHINE ASKS ONLY FOR ITSELF. It calls as itself, holding the machine-connector credential
2659
+ * Integrations made when it was connected (ONPLO-4445), so the machine is the caller and no
2660
+ * permission is asked, as for its heartbeat. A person or an agent asking is refused (403
2661
+ * `reported_by_a_machine_only`).
2662
+ *
2663
+ * A PAUSED MACHINE IS GIVEN NO NEW WORK: "Your Pause stops the machine entirely, so it is given no
2664
+ * new work." While it is paused, `data` is empty and `paused` is `true`, whatever waits under it.
2665
+ *
2666
+ * AT MOST 100 AT A TIME. The rest are answered once those are picked up.
2667
+ *
2668
+ * PICKING ONE UP IS NOT HERE: it is still the task service's StartTask, "through its grant". A job's
2669
+ * progress and cost ride on the heartbeat. Each poll leaves its look on the machine, as every read
2670
+ * here does (decision 0675).
2671
+ */
2672
+ get: operations["listMachineWork"];
2673
+ put?: never;
2674
+ post?: never;
2675
+ delete?: never;
2676
+ options?: never;
2677
+ head?: never;
2678
+ patch?: never;
2679
+ trace?: never;
2680
+ };
2617
2681
  "/machine-connector/heartbeat": {
2618
2682
  parameters: {
2619
2683
  query?: never;
@@ -4544,18 +4608,17 @@ export interface components {
4544
4608
  /** @description The machine, by the id its record has in Integrations. */
4545
4609
  machine_id: components["schemas"]["Id"];
4546
4610
  /**
4547
- * @description "Presence from connector heartbeats." Offline after the heartbeats it may miss — three, so 180
4548
- * seconds after the last one. Every machine gets those three: no machine has a setting of its
4549
- * own for it yet (ONPLO-5200).
4611
+ * @description "Presence from connector heartbeats." Offline once `offline_after_seconds` have passed since
4612
+ * the last one: 180, three missed heartbeats, until somebody sets the machine's own (ONPLO-5200).
4550
4613
  * @enum {string}
4551
4614
  */
4552
4615
  presence: "online" | "offline";
4553
4616
  /** @description When its last heartbeat arrived, or `null` until the first one. */
4554
4617
  last_seen_at: components["schemas"]["Timestamp"] | null;
4555
4618
  /**
4556
- * @description `stalled` while a job it is running has not moved for longer than its setting allows — ten
4557
- * minutes, for every machine until a machine has a setting of its own (ONPLO-5200) — as its
4558
- * last heartbeat reported it. `working` otherwise. Returning such a job to waiting is the task
4619
+ * @description `stalled` while a job it is running has not moved for longer than `stalled_after_seconds` —
4620
+ * ten minutes until somebody sets the machine's own (ONPLO-5200) — as its last heartbeat
4621
+ * reported it. `working` otherwise. Returning such a job to waiting is the task
4559
4622
  * service's, and not this board's.
4560
4623
  * @enum {string}
4561
4624
  */
@@ -4569,8 +4632,29 @@ export interface components {
4569
4632
  * on the machine, or `null` until it reports one. An estimate: the bill is the subscription's.
4570
4633
  */
4571
4634
  month_cost_estimate: components["schemas"]["Money"] | null;
4635
+ /** @description Seconds after its last heartbeat that it shows offline. 180 until set (`setMachineTimes`). */
4636
+ offline_after_seconds: number;
4637
+ /** @description Seconds a job may go without moving before the machine shows stalled. 600 until set. */
4638
+ stalled_after_seconds: number;
4572
4639
  environment_id: components["schemas"]["Id"];
4573
4640
  };
4641
+ /** @description One machine's own times, both sent every time (ONPLO-5200). 180 and 600 are the defaults. */
4642
+ MachineTimes: {
4643
+ /**
4644
+ * @description Seconds after its last heartbeat that it shows offline. At least 120, two heartbeats, so one
4645
+ * heartbeat late never shows a machine offline; at most a day.
4646
+ */
4647
+ offline_after_seconds: number;
4648
+ /** @description Seconds a job may go without moving before the machine shows stalled. One minute to a day. */
4649
+ stalled_after_seconds: number;
4650
+ };
4651
+ /** @description The jobs that wait for this machine, or none while it is paused (ONPLO-5202). */
4652
+ MachineWork: {
4653
+ /** @description Whether somebody here paused it. While `true`, `data` is empty. */
4654
+ paused: boolean;
4655
+ /** @description The jobs given to this machine that wait to be picked up, at most 100. */
4656
+ data: components["schemas"]["Job"][];
4657
+ };
4574
4658
  /**
4575
4659
  * @description What the connector reports of its own machine, every 60 seconds. Each heartbeat replaces the last
4576
4660
  * one whole.
@@ -6861,7 +6945,6 @@ export interface operations {
6861
6945
  415: components["responses"]["UnsupportedMediaType"];
6862
6946
  422: components["responses"]["Unprocessable"];
6863
6947
  500: components["responses"]["ServerError"];
6864
- 501: components["responses"]["NotImplemented"];
6865
6948
  503: components["responses"]["ChatUnavailable"];
6866
6949
  };
6867
6950
  };
@@ -7041,7 +7124,6 @@ export interface operations {
7041
7124
  415: components["responses"]["UnsupportedMediaType"];
7042
7125
  422: components["responses"]["Unprocessable"];
7043
7126
  500: components["responses"]["ServerError"];
7044
- 501: components["responses"]["NotImplemented"];
7045
7127
  503: components["responses"]["ChatUnavailable"];
7046
7128
  };
7047
7129
  };
@@ -9098,6 +9180,83 @@ export interface operations {
9098
9180
  503: components["responses"]["ServiceUnavailable"];
9099
9181
  };
9100
9182
  };
9183
+ setMachineTimes: {
9184
+ parameters: {
9185
+ query?: never;
9186
+ header?: never;
9187
+ path: {
9188
+ machine_id: components["parameters"]["MachineId"];
9189
+ };
9190
+ cookie?: never;
9191
+ };
9192
+ requestBody: {
9193
+ content: {
9194
+ "application/json": components["schemas"]["MachineTimes"];
9195
+ };
9196
+ };
9197
+ responses: {
9198
+ /** @description The machine, judged by its new times. */
9199
+ 200: {
9200
+ headers: {
9201
+ "Onplo-Request-Id": components["headers"]["OnploRequestId"];
9202
+ [name: string]: unknown;
9203
+ };
9204
+ content: {
9205
+ "application/json": components["schemas"]["MachineOnTheBoard"];
9206
+ };
9207
+ };
9208
+ 400: components["responses"]["BadRequest"];
9209
+ 401: components["responses"]["Unauthorized"];
9210
+ 403: components["responses"]["Forbidden"];
9211
+ 404: components["responses"]["NotFound"];
9212
+ 413: components["responses"]["ContentTooLarge"];
9213
+ 415: components["responses"]["UnsupportedMediaType"];
9214
+ 422: components["responses"]["Unprocessable"];
9215
+ 500: components["responses"]["ServerError"];
9216
+ 503: components["responses"]["ServiceUnavailable"];
9217
+ };
9218
+ };
9219
+ listMachineWork: {
9220
+ parameters: {
9221
+ query?: never;
9222
+ header?: never;
9223
+ path?: never;
9224
+ cookie?: never;
9225
+ };
9226
+ requestBody?: never;
9227
+ responses: {
9228
+ /** @description Its waiting work, or none. */
9229
+ 200: {
9230
+ headers: {
9231
+ "Onplo-Request-Id": components["headers"]["OnploRequestId"];
9232
+ [name: string]: unknown;
9233
+ };
9234
+ content: {
9235
+ "application/json": components["schemas"]["MachineWork"];
9236
+ };
9237
+ };
9238
+ 400: components["responses"]["BadRequest"];
9239
+ 401: components["responses"]["Unauthorized"];
9240
+ /** @description Refused. `reported_by_a_machine_only`: the caller is a person or an agent, and only a machine asks for its own work. The door's own three, as on every other operation: `permission_missing` and `ring_requires_person`, when identity refuses the credential, and `outside_session_scope`, when the act is not within the scope this session declared at sign-in. */
9241
+ 403: {
9242
+ headers: {
9243
+ "Onplo-Request-Id": components["headers"]["OnploRequestId"];
9244
+ [name: string]: unknown;
9245
+ };
9246
+ content: {
9247
+ "application/problem+json": components["schemas"]["Problem"] & {
9248
+ /** @enum {unknown} */
9249
+ code?: "reported_by_a_machine_only" | "permission_missing" | "ring_requires_person" | "outside_session_scope";
9250
+ };
9251
+ };
9252
+ };
9253
+ 413: components["responses"]["ContentTooLarge"];
9254
+ 415: components["responses"]["UnsupportedMediaType"];
9255
+ 422: components["responses"]["Unprocessable"];
9256
+ 500: components["responses"]["ServerError"];
9257
+ 503: components["responses"]["TasksUnavailable"];
9258
+ };
9259
+ };
9101
9260
  reportMachineHeartbeat: {
9102
9261
  parameters: {
9103
9262
  query?: never;
@@ -95,6 +95,45 @@ export interface paths {
95
95
  patch?: never;
96
96
  trace?: never;
97
97
  };
98
+ "/token": {
99
+ parameters: {
100
+ query?: never;
101
+ header?: never;
102
+ path?: never;
103
+ cookie?: never;
104
+ };
105
+ get?: never;
106
+ put?: never;
107
+ /**
108
+ * Trade an app's one-time code for the person's session
109
+ * @description THE TOKEN ENDPOINT (RFC 6749 §4.1.3, OpenID Connect Core §3.1.3; architecture decision record
110
+ * 037). An app that `grantAuthorizationCode` sent back with a code trades it here, once, for:
111
+ *
112
+ * - THE ACCESS TOKEN, which is the person's session, opaque, read by every Onplo service as every
113
+ * session is. It records the app it was issued to.
114
+ * - THE ID TOKEN, a JWT signed with a key of `readProviderKeySet`, which says who signed in: `iss`,
115
+ * `sub` (the person), `aud` (the app), `exp`, `iat`, `auth_time`, `amr` and the `nonce` the app
116
+ * sent. It is for the app alone and NO ONPLO SERVICE TAKES IT AS A BEARER.
117
+ *
118
+ * THE CODE IS TRADED ONLY BY THE APP IT WAS HANDED TO: the same `client_id`, the same
119
+ * `redirect_uri`, and a `code_verifier` whose SHA-256 is the challenge it was asked with (RFC 7636).
120
+ * A CODE SHOWN A SECOND TIME IS REFUSED, AND THE SESSION ITS FIRST TRADE OPENED IS ENDED, because a
121
+ * code shown twice is a code somebody else holds.
122
+ *
123
+ * REFUSED AS OAUTH REFUSES (RFC 6749 §5.2), with a 400 and an `error`, so any OAuth client reads
124
+ * it: a field missing is `invalid_request`, a grant other than `authorization_code` is
125
+ * `unsupported_grant_type`, and a code unknown, expired, spent or shown by another app is
126
+ * `invalid_grant`, told apart from nothing.
127
+ *
128
+ * SIGNED OUT, because the code is the proof, and LIMITED by how often it is called (decision 0732).
129
+ */
130
+ post: operations["requestTokens"];
131
+ delete?: never;
132
+ options?: never;
133
+ head?: never;
134
+ patch?: never;
135
+ trace?: never;
136
+ };
98
137
  "/passkey-proofs": {
99
138
  parameters: {
100
139
  query?: never;
@@ -1316,6 +1355,58 @@ export interface components {
1316
1355
  detail: string;
1317
1356
  }[];
1318
1357
  };
1358
+ /**
1359
+ * @description The trade, as RFC 6749 §4.1.3 names its fields. NONE IS REQUIRED HERE, so a field missing is
1360
+ * answered as OAuth answers it, `invalid_request`, and never as a 422.
1361
+ */
1362
+ TokenRequest: {
1363
+ /** @description Always `authorization_code`. */
1364
+ grant_type?: string;
1365
+ /** @description The code `grantAuthorizationCode` sent the app back with. */
1366
+ code?: string;
1367
+ /** @description The return address the code was sent to, exactly as the app asked with it. */
1368
+ redirect_uri?: string;
1369
+ /** @description The app, by the id Onplo lists it under. */
1370
+ client_id?: string;
1371
+ /** @description The PKCE verifier whose SHA-256 the app sent as its challenge. */
1372
+ code_verifier?: string;
1373
+ };
1374
+ /** @description The answer, under the names RFC 6749 §5.1 and OpenID Connect Core §3.1.3.3 give it. */
1375
+ Tokens: {
1376
+ /** @description The person's session. Sent as a bearer to every Onplo service. */
1377
+ access_token: string;
1378
+ /**
1379
+ * @description Always `Bearer`.
1380
+ * @enum {string}
1381
+ */
1382
+ token_type: "Bearer";
1383
+ /** @description The seconds until the session ends, twelve hours from the touch at most. */
1384
+ expires_in: number;
1385
+ /** @description Who signed in, signed ES256, for the app alone. Never a bearer. */
1386
+ id_token: string;
1387
+ /** @description The scopes granted, space-separated, as the app asked them. */
1388
+ scope: string;
1389
+ };
1390
+ /** @description OAuth's refusal (RFC 6749 §5.2), so any OAuth client reads it. */
1391
+ TokenRefusal: {
1392
+ /**
1393
+ * @description `invalid_request`: a field is missing. `unsupported_grant_type`: the grant is not
1394
+ * `authorization_code`. `invalid_grant`: the code is unknown, expired, spent or shown by
1395
+ * another app.
1396
+ * @enum {string}
1397
+ */
1398
+ error: "invalid_request" | "unsupported_grant_type" | "invalid_grant";
1399
+ };
1400
+ /**
1401
+ * @description A 400 at the token endpoint: OAuth's refusal, or the server's `malformed_request` for a form it
1402
+ * could not read (a key sent twice). The two never overlap: a refusal carries `error` alone.
1403
+ */
1404
+ TokenRefusedOrUnread: components["schemas"]["TokenRefusal"] | components["schemas"]["TokenFormUnread"];
1405
+ /** @description The server's Problem for a token form it could not read, such as a key sent twice. */
1406
+ TokenFormUnread: components["schemas"]["Problem"] & {
1407
+ /** @enum {unknown} */
1408
+ code?: "malformed_request";
1409
+ };
1319
1410
  /**
1320
1411
  * @description The provider's metadata, under the names OpenID Connect Discovery 1.0 gives them, so any
1321
1412
  * standard client reads it unchanged. Every list holds only what identity supports.
@@ -1749,6 +1840,51 @@ export interface operations {
1749
1840
  500: components["responses"]["ServerError"];
1750
1841
  };
1751
1842
  };
1843
+ requestTokens: {
1844
+ parameters: {
1845
+ query?: never;
1846
+ header?: never;
1847
+ path?: never;
1848
+ cookie?: never;
1849
+ };
1850
+ requestBody: {
1851
+ content: {
1852
+ "application/x-www-form-urlencoded": components["schemas"]["TokenRequest"];
1853
+ };
1854
+ };
1855
+ responses: {
1856
+ /** @description The session and the ID token. */
1857
+ 200: {
1858
+ headers: {
1859
+ "Onplo-Request-Id": components["headers"]["OnploRequestId"];
1860
+ [name: string]: unknown;
1861
+ };
1862
+ content: {
1863
+ "application/json": components["schemas"]["Tokens"];
1864
+ };
1865
+ };
1866
+ /**
1867
+ * @description OAuth's refusal, its `error` saying which. Or a body the server could not read, before the
1868
+ * endpoint saw it: the `malformed_request` problem every operation declares on 400, sent as
1869
+ * `application/problem+json`. One media type is declared because a status carries one.
1870
+ */
1871
+ 400: {
1872
+ headers: {
1873
+ "Onplo-Request-Id": components["headers"]["OnploRequestId"];
1874
+ [name: string]: unknown;
1875
+ };
1876
+ content: {
1877
+ "application/json": components["schemas"]["TokenRefusedOrUnread"];
1878
+ };
1879
+ };
1880
+ 413: components["responses"]["ContentTooLarge"];
1881
+ 415: components["responses"]["UnsupportedMediaType"];
1882
+ 422: components["responses"]["Unprocessable"];
1883
+ 429: components["responses"]["TooManyCalls"];
1884
+ 500: components["responses"]["ServerError"];
1885
+ 501: components["responses"]["NotImplemented"];
1886
+ };
1887
+ };
1752
1888
  startPasskeyProof: {
1753
1889
  parameters: {
1754
1890
  query?: never;
@@ -166,8 +166,8 @@ export interface paths {
166
166
  get: operations["listConnections"];
167
167
  put?: never;
168
168
  /**
169
- * Connect a system with an API key, connect a database, a Custom API or an MCP server
170
- * @description The four connect flows in which you TYPE the credential. `kind` says which, and each takes
169
+ * Connect a system with an API key or as an app, connect a database, a Custom API or an MCP server
170
+ * @description The five connect flows in which you TYPE the credential. `kind` says which, and each takes
171
171
  * the fields of its own configuration block. An OAuth connection is not made here: you grant
172
172
  * access at the provider, so it starts with `POST /connection-authorizations`.
173
173
  *
@@ -180,6 +180,10 @@ export interface paths {
180
180
  * signing in with none, a key in a header or a Bearer token (ONPLO-3478). OAuth on the
181
181
  * server's own screen is not made here yet (ONPLO-4032).
182
182
  *
183
+ * GITHUB IS CONNECTED AS AN APP (`kind: app`, ONPLO-4887): the app's id, its installation's
184
+ * id and its private key, which is the credential, and optionally the repositories and the
185
+ * permissions the connection is narrowed to. Making it calls nobody, as every connect here.
186
+ *
183
187
  * THE CREDENTIAL IS WRITE-ONLY. It is visible while you type it and masked for ever after:
184
188
  * it goes to the central vault as an entry in the Keys app, in this same account environment,
185
189
  * and the connection that comes back carries that entry's id and never the value. Changing
@@ -481,14 +485,18 @@ export interface paths {
481
485
  * one in the same Keys entry, so `credential_key_id` does not move, and nothing that uses the
482
486
  * connection has to be redeployed.
483
487
  *
484
- * FOR A CONNECTION WHOSE CREDENTIAL YOU TYPED — an API key, a database, a Custom API or an
485
- * outside MCP server. An OAuth connection holds a grant rather than something you typed, and
488
+ * FOR A CONNECTION WHOSE CREDENTIAL YOU TYPED — an API key, a database, a Custom API, an
489
+ * outside MCP server or an app. An OAuth connection holds a grant rather than something you typed, and
486
490
  * is renewed by reconnecting; this operation refuses it, and refuses a body of another kind,
487
491
  * with `connection_kind_mismatch`.
488
492
  *
489
493
  * THE BODY NAMES ITS KIND in `kind`, with the value creating a connection of that kind uses:
490
- * `api_key`, `database`, `custom_api` or `mcp_server`. A body that names no kind, or a kind
491
- * its fields are not, matches none of the four shapes and is refused with the 422.
494
+ * `api_key`, `database`, `custom_api`, `mcp_server` or `app`. A body that names no kind, or a
495
+ * kind its fields are not, matches none of the five shapes and is refused with the 422.
496
+ *
497
+ * AN APP'S IS ITS PRIVATE KEY, AND ROTATING IT NEEDS NO RECONNECT (ONPLO-4887). GitHub lets an
498
+ * app hold more than one key at once: make a new key at GitHub, enter it here, and delete the
499
+ * old one at GitHub once the connection says the new one works. It keeps the same Keys entry.
492
500
  *
493
501
  * AN MCP SERVER'S IS ITS KEY OR ITS TOKEN, FOR THE SAME ADDRESS, as a Custom API's is: nothing
494
502
  * else is sent, and it keeps the same Keys entry (ONPLO-4031). One that signs in with nothing
@@ -2622,15 +2630,19 @@ export interface components {
2622
2630
  OwnerScope: "personal" | "company";
2623
2631
  /**
2624
2632
  * @description HOW THE CONNECTION PROVES ITSELF, and so which connect flow made it: an OAuth account, an
2625
- * API key, a database, a custom API, a sign-up, an outside MCP server, or an app. A property
2626
- * of the row, never a separate list.
2633
+ * API key, a database, a custom API, a sign-up, an outside MCP server, an app, or a role. A
2634
+ * property of the row, never a separate list.
2635
+ *
2636
+ * `role` is a cloud account reached by a role Onplo assumes through OIDC federation, so it holds
2637
+ * no long-lived access key: AWS, given the role's address (its ARN), as a deploy target (ONPLO-4906). The
2638
+ * catalogue offers it; nothing makes one yet, so no connection carries it.
2627
2639
  *
2628
2640
  * `app` is a system connected as an app the person made there, signing in as the app and never
2629
2641
  * as a person: GitHub, given the app's id, the installation's id and the app's private key,
2630
2642
  * which becomes the connection's Machine secret. Every call signs a token of at most 10 minutes
2631
2643
  * with that key and trades it for an installation token of one hour, held only in memory
2632
- * (ONPLO-4839). The catalogue offers it; nothing makes one yet (ONPLO-4887), so no connection
2633
- * carries it.
2644
+ * (ONPLO-4839). `createConnection` makes one (ONPLO-4887); the trade itself is the vault's and
2645
+ * is not built yet (ONPLO-5233), so nothing calls through one yet.
2634
2646
  *
2635
2647
  * `mcp_server` is an outside MCP server: its HTTPS address and a name, signing in with none,
2636
2648
  * an API key in a header, a Bearer token, or OAuth on the server's own screen. What uses it is
@@ -2649,7 +2661,7 @@ export interface components {
2649
2661
  * are read with `getCustomApiAddress` (decision 0811); and `POST /connections` makes one.
2650
2662
  * @enum {string}
2651
2663
  */
2652
- ConnectionKind: "oauth" | "api_key" | "database" | "custom_api" | "sign_up" | "mcp_server" | "app";
2664
+ ConnectionKind: "oauth" | "api_key" | "database" | "custom_api" | "sign_up" | "mcp_server" | "app" | "role";
2653
2665
  /**
2654
2666
  * @description ONE VOCABULARY, used by every app that points at a connection: WORKING · EXPIRING · NOT
2655
2667
  * WORKING · DISCONNECTED. Those four words are the whole set. `expiring` carries the date it
@@ -3116,6 +3128,63 @@ export interface components {
3116
3128
  /** @description Left out, it is off. */
3117
3129
  sub_processor?: components["schemas"]["SubProcessorTag"];
3118
3130
  };
3131
+ /**
3132
+ * @description A SYSTEM CONNECTED AS AN APP YOU MADE THERE: GitHub (ONPLO-4887). You make a GitHub App in
3133
+ * your organisation, install it on the repositories it may touch, and hand Onplo the app's
3134
+ * id, the installation's id and the app's private key. Every call shows at GitHub as the
3135
+ * app's, never as a person's, so the connection does not leave with whoever made it.
3136
+ *
3137
+ * NARROWED PER CONNECTION. `repositories` may name fewer repositories than the app is
3138
+ * installed on, and `permissions` may leave out any the connection does not need. Two
3139
+ * connections may share one app with different reaches.
3140
+ *
3141
+ * WHAT IS NOT DONE HERE YET: the call through it. Onplo signs a token of at most 10 minutes
3142
+ * with the key and trades it at GitHub for a one-hour installation token, held in memory
3143
+ * only. That trade is the vault's, and is not built yet (ONPLO-5233).
3144
+ */
3145
+ AppConnectionCreate: {
3146
+ /** @enum {string} */
3147
+ kind: "app";
3148
+ /** @description Picked from the catalog. A system that offers no app connection is refused. */
3149
+ system_id: components["schemas"]["Id"];
3150
+ /** @description Left out, it is the system's own name. */
3151
+ name?: components["schemas"]["ConnectionName"];
3152
+ owner_scope: components["schemas"]["OwnerScope"];
3153
+ /** @description Who manages it. Left out, it is you. */
3154
+ owner_person_id?: components["schemas"]["Id"];
3155
+ /**
3156
+ * @description The number GitHub shows on the app's settings page.
3157
+ * @example 123456
3158
+ */
3159
+ app_id: string;
3160
+ /**
3161
+ * @description The number in the address of the app's installation page, for the organisation or
3162
+ * account it is installed on.
3163
+ * @example 98765432
3164
+ */
3165
+ installation_id: string;
3166
+ /**
3167
+ * @description WRITE-ONLY: the text of the private key file GitHub hands over, a PEM block. It becomes
3168
+ * the connection's Machine secret in the Keys app and is returned by no operation, to
3169
+ * anyone.
3170
+ */
3171
+ private_key: string;
3172
+ /**
3173
+ * @description The repositories this connection may touch, as `owner/name`, narrowed from those the
3174
+ * app is installed on. Left out or empty, all of them. A repository named twice is
3175
+ * refused (422 naming the field).
3176
+ */
3177
+ repositories?: string[];
3178
+ /**
3179
+ * @description The permissions this connection keeps on, each one of the catalog entry's scopes,
3180
+ * spelled as the entry spells it. Left out, all of them. One the entry does not list is
3181
+ * refused (422 naming the field): a permission the app was not made with cannot be
3182
+ * switched on here. They are answered as the connection's `provider_scopes`.
3183
+ */
3184
+ permissions?: string[];
3185
+ /** @description Left out, it is off. */
3186
+ sub_processor?: components["schemas"]["SubProcessorTag"];
3187
+ };
3119
3188
  /**
3120
3189
  * @description THE KEY, THE TOKEN OR THE PASSWORD — "write-only, vaulted": visible while typing, masked
3121
3190
  * for ever after. It is stored in the central vault and returned by no operation, to anyone.
@@ -3201,6 +3270,12 @@ export interface components {
3201
3270
  kind: "mcp_server";
3202
3271
  secret: components["schemas"]["CustomApiSecret"];
3203
3272
  };
3273
+ AppCredential: {
3274
+ /** @enum {string} */
3275
+ kind: "app";
3276
+ /** @description The new private key file's text, a PEM block. Write-only, as when it was connected. */
3277
+ private_key: string;
3278
+ };
3204
3279
  /**
3205
3280
  * @description WHERE AN MCP SERVER IS REACHED AND HOW IT SIGNS IN, WHOLE, WITH THE CREDENTIAL TYPED AGAIN.
3206
3281
  *
@@ -5084,7 +5159,7 @@ export interface operations {
5084
5159
  };
5085
5160
  requestBody: {
5086
5161
  content: {
5087
- "application/json": components["schemas"]["ApiKeyConnectionCreate"] | components["schemas"]["DatabaseConnectionCreate"] | components["schemas"]["CustomApiConnectionCreate"] | components["schemas"]["McpServerConnectionCreate"];
5162
+ "application/json": components["schemas"]["ApiKeyConnectionCreate"] | components["schemas"]["DatabaseConnectionCreate"] | components["schemas"]["CustomApiConnectionCreate"] | components["schemas"]["McpServerConnectionCreate"] | components["schemas"]["AppConnectionCreate"];
5088
5163
  };
5089
5164
  };
5090
5165
  responses: {
@@ -5398,7 +5473,7 @@ export interface operations {
5398
5473
  };
5399
5474
  requestBody: {
5400
5475
  content: {
5401
- "application/json": components["schemas"]["ApiKeyCredential"] | components["schemas"]["DatabaseCredential"] | components["schemas"]["CustomApiCredential"] | components["schemas"]["McpServerCredential"];
5476
+ "application/json": components["schemas"]["ApiKeyCredential"] | components["schemas"]["DatabaseCredential"] | components["schemas"]["CustomApiCredential"] | components["schemas"]["McpServerCredential"] | components["schemas"]["AppCredential"];
5402
5477
  };
5403
5478
  };
5404
5479
  responses: {
@@ -20,6 +20,13 @@ export interface paths {
20
20
  *
21
21
  * A KEY IN THE TRASH IS LEFT OUT unless `in_trash` asks for the Trash instead.
22
22
  *
23
+ * THE TRASH ENDS IN ITS GHOSTS (decision 0672). A key deleted for good while a legal hold
24
+ * covers it leaves use at once and stays under the Trash filter, after the keys in the Trash,
25
+ * carrying `kept_by_legal_hold`. Which are drawn, and for whom, is the deletion service's to
26
+ * say (decision 0686): the person a hidden hold names sees no ghost, and is answered exactly
27
+ * what a key simply gone would answer. When the deletion service cannot be asked, no ghost is
28
+ * drawn and the rest of the Trash is listed.
29
+ *
23
30
  * A LIST IS REFUSED RATHER THAN CUT SHORT — `reach_too_wide`. The list is drawn from where
24
31
  * your grants sit, and one list covers grants on at most 500 rings and at most 500 single
25
32
  * keys. Somebody granted more than either is answered a 409 and no keys, because a list drawn
@@ -1990,7 +1997,7 @@ export interface paths {
1990
1997
  put?: never;
1991
1998
  /**
1992
1999
  * Attach a key to a flow project or a deploy environment
1993
- * @description EXPLICIT, PER TARGET, EVERY TIME (decision 0512). A target does not inherit a secret from a
2000
+ * @description EXPLICIT, PER TARGET, EVERY TIME (decision 0512). A key is never attached to a target by the
1994
2001
  * scope it happens to sit in: somebody with the right to grant it picks the entry and attaches
1995
2002
  * it to THAT target, and again for the next one. It is a grant the one authorization service
1996
2003
  * resolves, never a copy of the secret.
@@ -3118,6 +3125,31 @@ export interface components {
3118
3125
  * leaves it suspended.
3119
3126
  */
3120
3127
  suspended_at: components["schemas"]["Timestamp"] | null;
3128
+ /**
3129
+ * @description "KEPT BY A LEGAL HOLD", AND SINCE WHEN — the line of a ghost row under the Trash filter
3130
+ * (decision 0672). What is kept is what the glossary calls a Ghost: the key was deleted for
3131
+ * good while a Compliance legal hold covered it, so it is out of use and erased when the
3132
+ * hold is released. A ROW CARRYING IT CANNOT BE OPENED, CHANGED, ROTATED, MOVED, REVEALED,
3133
+ * USED OR RESTORED: every operation on one key answers its id as a key that is not there.
3134
+ *
3135
+ * THE ONE FIELD OF A KEY THAT MAY BE LEFT OUT, AND IT IS NEVER `null`. It is the deletion
3136
+ * service's to answer, for whoever is looking, and "a ghost is never shown unasked"
3137
+ * (decision 0686): so it is present exactly on a ghost this caller may see, which only the
3138
+ * Trash filter of the list draws. LEFT OUT MEANS ONLY THAT THIS ROW IS NO GHOST.
3139
+ */
3140
+ kept_by_legal_hold?: components["schemas"]["KeptByLegalHold"];
3141
+ };
3142
+ /**
3143
+ * @description A KEY A LEGAL HOLD KEEPS: out of use, unreadable, and erased when the hold is released. It
3144
+ * names no hold and gives no reason — those are the Compliance app's, for the people allowed
3145
+ * to see them — and it carries no end date, because a hold has none.
3146
+ */
3147
+ KeptByLegalHold: {
3148
+ /**
3149
+ * @description SINCE WHEN IT IS KEPT: the moment it was deleted for good, never the moment the hold was
3150
+ * placed (the glossary's Ghost). Every app that points at one key shows this one moment.
3151
+ */
3152
+ since: components["schemas"]["Timestamp"];
3121
3153
  };
3122
3154
  /**
3123
3155
  * @description WHAT PUT A KEY IN THE TRASH, AND ITS NAME AS IT WAS THEN. The name is kept, never looked up:
@@ -4872,7 +4904,10 @@ export interface operations {
4872
4904
  key_ring_id?: components["schemas"]["Id"];
4873
4905
  /** @description Only keys of this kind. */
4874
4906
  kind?: components["schemas"]["KeyKind"];
4875
- /** @description The Trash instead of the list — the keys waiting out their keep-time. */
4907
+ /**
4908
+ * @description The Trash instead of the list — the keys waiting out their keep-time, and after them the
4909
+ * keys a legal hold keeps, each carrying `kept_by_legal_hold`.
4910
+ */
4876
4911
  in_trash?: boolean;
4877
4912
  /**
4878
4913
  * @description Only the suspended keys — the Suspended chip. Left out, suspended and unsuspended keys are
@@ -5752,7 +5787,10 @@ export interface operations {
5752
5787
  * than the freshness window, or there has never been one, and for a credential that is not
5753
5788
  * a person's signed-in session this is final. Or `device_wiped`. Or
5754
5789
  * `fill_device_not_managed`: your company fills keys only on its managed devices, and
5755
- * Devices did not say this one is managed and compliant.
5790
+ * Devices did not say this one is managed and compliant. Its `detail` names Devices'
5791
+ * reason in Devices' own words — `not_enrolled`, `not_compliant`, `unknown`, `stale`,
5792
+ * `exempt`, `check_in_too_old` or `device_not_there` — or `no_device_named` when this
5793
+ * session was signed in on no device.
5756
5794
  */
5757
5795
  403: {
5758
5796
  headers: {
@@ -4390,6 +4390,9 @@ export interface components {
4390
4390
  * credential lacks the permission when all that is known is that we could not ask (decision
4391
4391
  * 0553). Every operation can raise it, the ungated ones included: a revoked credential dies on
4392
4392
  * the next check and that check is the same hop.
4393
+ *
4394
+ * Or Storage's own database could not be reached — `database_unavailable` (ONPLO-5128). Nothing
4395
+ * ran, and the same request can be sent again.
4393
4396
  */
4394
4397
  ServiceUnavailable: {
4395
4398
  headers: {
@@ -4399,7 +4402,7 @@ export interface components {
4399
4402
  content: {
4400
4403
  "application/problem+json": components["schemas"]["Problem"] & {
4401
4404
  /** @enum {unknown} */
4402
- code?: "authorization_unavailable";
4405
+ code?: "authorization_unavailable" | "database_unavailable";
4403
4406
  };
4404
4407
  };
4405
4408
  };
@@ -4417,6 +4420,9 @@ export interface components {
4417
4420
  * item, changing a share and ending one are written by the identity service itself. When it
4418
4421
  * could not be reached, whether the share changed is not known — and sending the same request
4419
4422
  * again is the same act, never a second share.
4423
+ *
4424
+ * Or Storage's own database could not be reached — `database_unavailable` (ONPLO-5128). Nothing
4425
+ * ran, and the same request can be sent again.
4420
4426
  */
4421
4427
  IdentityUnavailable: {
4422
4428
  headers: {
@@ -4426,7 +4432,7 @@ export interface components {
4426
4432
  content: {
4427
4433
  "application/problem+json": components["schemas"]["Problem"] & {
4428
4434
  /** @enum {unknown} */
4429
- code?: "authorization_unavailable" | "identity_unavailable";
4435
+ code?: "authorization_unavailable" | "identity_unavailable" | "database_unavailable";
4430
4436
  };
4431
4437
  };
4432
4438
  };
@@ -4455,6 +4461,9 @@ export interface components {
4455
4461
  * upload's parts and cuts them (ONPLO-2344), hands out the address a file is read from
4456
4462
  * (ONPLO-2720), and keeps and restores a file's work sessions (ONPLO-2758, ONPLO-2761). The same
4457
4463
  * request can be sent again; a part already sent stays sent.
4464
+ *
4465
+ * Or Storage's own database could not be reached — `database_unavailable` (ONPLO-5128). Nothing
4466
+ * ran, and the same request can be sent again.
4458
4467
  */
4459
4468
  ObjectStoreUnavailable: {
4460
4469
  headers: {
@@ -4464,7 +4473,7 @@ export interface components {
4464
4473
  content: {
4465
4474
  "application/problem+json": components["schemas"]["Problem"] & {
4466
4475
  /** @enum {unknown} */
4467
- code?: "authorization_unavailable" | "object_store_unavailable";
4476
+ code?: "authorization_unavailable" | "object_store_unavailable" | "database_unavailable";
4468
4477
  };
4469
4478
  };
4470
4479
  };
@@ -4474,6 +4483,9 @@ export interface components {
4474
4483
  * (`object_store_unavailable`), or the identity service, which is told a file exists before
4475
4484
  * anyone can see it (`identity_unavailable`, decision 0635). The upload stays as it was, and
4476
4485
  * finishing it again is safe.
4486
+ *
4487
+ * Or Storage's own database could not be reached — `database_unavailable` (ONPLO-5128). Nothing
4488
+ * ran, and the same request can be sent again.
4477
4489
  */
4478
4490
  UploadCompletionUnavailable: {
4479
4491
  headers: {
@@ -4483,7 +4495,7 @@ export interface components {
4483
4495
  content: {
4484
4496
  "application/problem+json": components["schemas"]["Problem"] & {
4485
4497
  /** @enum {unknown} */
4486
- code?: "authorization_unavailable" | "object_store_unavailable" | "identity_unavailable";
4498
+ code?: "authorization_unavailable" | "object_store_unavailable" | "identity_unavailable" | "database_unavailable";
4487
4499
  };
4488
4500
  };
4489
4501
  };
@@ -4494,6 +4506,9 @@ export interface components {
4494
4506
  * event choices, so there was nothing to answer from and nothing was stored. The same request
4495
4507
  * can be sent again. The two operations on Storage's own events answer this in place of the
4496
4508
  * shared `503`.
4509
+ *
4510
+ * Or Storage's own database could not be reached — `database_unavailable` (ONPLO-5128). Nothing
4511
+ * ran, and the same request can be sent again.
4497
4512
  */
4498
4513
  NotificationsUnavailable: {
4499
4514
  headers: {
@@ -4503,7 +4518,7 @@ export interface components {
4503
4518
  content: {
4504
4519
  "application/problem+json": components["schemas"]["Problem"] & {
4505
4520
  /** @enum {unknown} */
4506
- code?: "authorization_unavailable" | "notifications_unavailable";
4521
+ code?: "authorization_unavailable" | "notifications_unavailable" | "database_unavailable";
4507
4522
  };
4508
4523
  };
4509
4524
  };
@@ -4515,6 +4530,9 @@ export interface components {
4515
4530
  * is not "not held": no list is answered and no switch is refused in its place. The same
4516
4531
  * request can be sent again. The two operations on your own Storage features, and the two
4517
4532
  * on retention, answer this in place of the shared `503`.
4533
+ *
4534
+ * Or Storage's own database could not be reached — `database_unavailable` (ONPLO-5128). Nothing
4535
+ * ran, and the same request can be sent again.
4518
4536
  */
4519
4537
  AccountUnavailable: {
4520
4538
  headers: {
@@ -4524,7 +4542,7 @@ export interface components {
4524
4542
  content: {
4525
4543
  "application/problem+json": components["schemas"]["Problem"] & {
4526
4544
  /** @enum {unknown} */
4527
- code?: "authorization_unavailable" | "account_unavailable";
4545
+ code?: "authorization_unavailable" | "account_unavailable" | "database_unavailable";
4528
4546
  };
4529
4547
  };
4530
4548
  };
@@ -8622,6 +8640,9 @@ export interface operations {
8622
8640
  /**
8623
8641
  * @description The file store could not be asked for the address (`object_store_unavailable`). Nothing
8624
8642
  * was counted or spent; the same request can be sent again.
8643
+ *
8644
+ * Or Storage's own database could not be reached — `database_unavailable` (ONPLO-5128). Nothing
8645
+ * ran, and the same request can be sent again.
8625
8646
  */
8626
8647
  503: {
8627
8648
  headers: {
@@ -8631,7 +8652,7 @@ export interface operations {
8631
8652
  content: {
8632
8653
  "application/problem+json": components["schemas"]["Problem"] & {
8633
8654
  /** @enum {unknown} */
8634
- code?: "object_store_unavailable";
8655
+ code?: "object_store_unavailable" | "database_unavailable";
8635
8656
  };
8636
8657
  };
8637
8658
  };
@@ -8802,6 +8823,9 @@ export interface operations {
8802
8823
  /**
8803
8824
  * @description The file store could not be asked for the address (`object_store_unavailable`). Nothing
8804
8825
  * was recorded; the same request can be sent again.
8826
+ *
8827
+ * Or Storage's own database could not be reached — `database_unavailable` (ONPLO-5128). Nothing
8828
+ * ran, and the same request can be sent again.
8805
8829
  */
8806
8830
  503: {
8807
8831
  headers: {
@@ -8811,7 +8835,7 @@ export interface operations {
8811
8835
  content: {
8812
8836
  "application/problem+json": components["schemas"]["Problem"] & {
8813
8837
  /** @enum {unknown} */
8814
- code?: "object_store_unavailable";
8838
+ code?: "object_store_unavailable" | "database_unavailable";
8815
8839
  };
8816
8840
  };
8817
8841
  };
@@ -8882,6 +8906,9 @@ export interface operations {
8882
8906
  /**
8883
8907
  * @description The file store could not be asked for the zip (`object_store_unavailable`). Nothing was
8884
8908
  * recorded; the same request can be sent again.
8909
+ *
8910
+ * Or Storage's own database could not be reached — `database_unavailable` (ONPLO-5128). Nothing
8911
+ * ran, and the same request can be sent again.
8885
8912
  */
8886
8913
  503: {
8887
8914
  headers: {
@@ -8891,7 +8918,7 @@ export interface operations {
8891
8918
  content: {
8892
8919
  "application/problem+json": components["schemas"]["Problem"] & {
8893
8920
  /** @enum {unknown} */
8894
- code?: "object_store_unavailable";
8921
+ code?: "object_store_unavailable" | "database_unavailable";
8895
8922
  };
8896
8923
  };
8897
8924
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@onplo/sdk",
3
- "version": "0.0.1",
3
+ "version": "0.0.2",
4
4
  "description": "The Onplo SDK: a typed client for Onplo's public API, generated from its OpenAPI contracts.",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",