@onplo/sdk 0.0.0-stage → 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,1466 @@
1
+ export interface paths {
2
+ "/software-projects": {
3
+ parameters: {
4
+ query?: never;
5
+ header?: never;
6
+ path?: never;
7
+ cookie?: never;
8
+ };
9
+ /**
10
+ * The software projects you may see
11
+ * @description EVERY SOFTWARE PROJECT YOU MAY SEE, in the account environment this credential acts in, in
12
+ * the order they were marked. A project you hold no grant on is absent, never masked.
13
+ *
14
+ * AN UNMARKED PROJECT IS LEFT OUT unless `include_unmarked` asks for it: it is archived, and
15
+ * stays readable with all it holds.
16
+ *
17
+ * EACH ROW SAYS WHAT STORAGE LAST SAID OF ITS FOLDER (`folder_state`): there, in Trash, or gone
18
+ * for good.
19
+ */
20
+ get: operations["listSoftwareProjects"];
21
+ put?: never;
22
+ post?: never;
23
+ delete?: never;
24
+ options?: never;
25
+ head?: never;
26
+ patch?: never;
27
+ trace?: never;
28
+ };
29
+ "/software-projects-in-own-folders": {
30
+ parameters: {
31
+ query?: never;
32
+ header?: never;
33
+ path?: never;
34
+ cookie?: never;
35
+ };
36
+ get?: never;
37
+ put?: never;
38
+ /**
39
+ * Mark a folder of your own as a software project
40
+ * @description A STORAGE FOLDER BECOMES A SOFTWARE PROJECT. Any folder of your own, a nested one too. The
41
+ * code stays in it, with Storage keeping its versions; Software never moves, renames or copies
42
+ * it.
43
+ *
44
+ * TWO PERMISSIONS, EACH ASKED OF ITS OWN OBJECT. "Mark a folder as a software project" is asked
45
+ * of the account environment, and the right to share the folder in Storage is asked of the
46
+ * folder: sharing is asked, not just reading, because marking lets the project's viewers see
47
+ * what is built from the code. A refusal is one 403.
48
+ *
49
+ * WHOEVER MARKS IT HOLDS ADMINISTRATOR ON THE PROJECT, and looks after it, until it is handed
50
+ * on. A folder of your own is yours, so the project is yours too.
51
+ *
52
+ * A COMPANY FOLDER IS MARKED BY ITS OWN OPERATION, `markCompanyFolderAsSoftwareProject`, because
53
+ * its folder permission is a different one (decision 0831).
54
+ *
55
+ * A FOLDER THAT IS NOT THERE IS REFUSED with `folder_not_found`, and nothing is made: no such
56
+ * folder, one in Trash, a file, one in a colleague's tree. The answer does not say which.
57
+ *
58
+ * A FOLDER ALREADY A SOFTWARE PROJECT IS REFUSED with `folder_already_a_software_project`. A
59
+ * folder inside another project's folder is its own folder, and may be marked.
60
+ *
61
+ * ONLY A PERSON MARKS A FOLDER. A machine is refused with a 422 on `/body/folder_id`, code
62
+ * `agents_never_mark_a_folder`: there is no person whose share it would be.
63
+ */
64
+ post: operations["markOwnFolderAsSoftwareProject"];
65
+ delete?: never;
66
+ options?: never;
67
+ head?: never;
68
+ patch?: never;
69
+ trace?: never;
70
+ };
71
+ "/software-projects-in-company-folders": {
72
+ parameters: {
73
+ query?: never;
74
+ header?: never;
75
+ path?: never;
76
+ cookie?: never;
77
+ };
78
+ get?: never;
79
+ put?: never;
80
+ /**
81
+ * Mark a company folder as a software project
82
+ * @description The same act as `markOwnFolderAsSoftwareProject`, on a folder of the company's, and the
83
+ * project is the company's. Its folder permission is "Set who may reach a company folder".
84
+ *
85
+ * A PERSONAL ACCOUNT ENVIRONMENT HAS NO COMPANY FOLDERS: there, this is refused with 409
86
+ * `company_project_in_a_personal_environment`, and nothing is made.
87
+ *
88
+ * WHOEVER MARKS IT HOLDS ADMINISTRATOR ON THE PROJECT from the moment it exists: the identity
89
+ * service places that role in the same act that makes the project (ONPLO-4976), so a company
90
+ * project nobody may manage is never made.
91
+ */
92
+ post: operations["markCompanyFolderAsSoftwareProject"];
93
+ delete?: never;
94
+ options?: never;
95
+ head?: never;
96
+ patch?: never;
97
+ trace?: never;
98
+ };
99
+ "/software-projects/{software_project_id}": {
100
+ parameters: {
101
+ query?: never;
102
+ header?: never;
103
+ path: {
104
+ software_project_id: components["parameters"]["SoftwareProjectId"];
105
+ };
106
+ cookie?: never;
107
+ };
108
+ /**
109
+ * Read one software project
110
+ * @description THE PROJECT AND ITS SETTINGS, an unmarked one too. Seeing it never opens the code: a file
111
+ * opens in Storage only for someone Storage lets read it.
112
+ */
113
+ get: operations["getSoftwareProject"];
114
+ put?: never;
115
+ post?: never;
116
+ /**
117
+ * Unmark a software project
118
+ * @description THE FOLDER IS UNTOUCHED: it stays in Storage with its code and versions, and is no longer a
119
+ * software project, so it may be marked again. The project is archived, and its builds,
120
+ * checks, screens and releases stay readable to whoever could read them.
121
+ *
122
+ * UNMARKING ONE ALREADY UNMARKED IS NOT AN ERROR: nothing is left to unmark.
123
+ */
124
+ delete: operations["unmarkSoftwareProject"];
125
+ options?: never;
126
+ head?: never;
127
+ /**
128
+ * Change a software project's settings
129
+ * @description NAME, STAGING SITE, PRODUCTION SITE, WHERE SCREENS COME FROM. Every field is optional; an
130
+ * omitted field is untouched, and an explicit `null` clears a site.
131
+ *
132
+ * NOT HERE: the folder (`chooseOwnFolderForSoftwareProject`), who looks after it
133
+ * (`handOnSoftwareProject`), and GitHub (`connectSoftwareProjectToGitHub`), each an act of its
134
+ * own.
135
+ *
136
+ * AN UNMARKED PROJECT IS NOT CHANGED: 409 `software_project_unmarked`.
137
+ */
138
+ patch: operations["updateSoftwareProject"];
139
+ trace?: never;
140
+ };
141
+ "/software-projects/{software_project_id}/looked-after-by": {
142
+ parameters: {
143
+ query?: never;
144
+ header?: never;
145
+ path: {
146
+ software_project_id: components["parameters"]["SoftwareProjectId"];
147
+ };
148
+ cookie?: never;
149
+ };
150
+ get?: never;
151
+ /**
152
+ * Hand on a software project
153
+ * @description WHO LOOKS AFTER IT changes to another member of the account environment, who takes
154
+ * Administrator on the project with it. The one before steps down: their access on the project
155
+ * becomes Editor, a share they were given included, because a person holds one grant on a
156
+ * project (decision 0650). When the folder is their own, they still own it, so they keep full
157
+ * rights over the project for as long as the folder is theirs.
158
+ *
159
+ * HANDING IT TO THE PERSON WHO LOOKS AFTER IT NOW CHANGES NOTHING and refuses nothing.
160
+ *
161
+ * SOMEONE WHO IS NOT A MEMBER IS REFUSED with a 422 on `/body/person_id`, code `not_a_member`.
162
+ * An unmarked project is not handed on: 409 `software_project_unmarked`.
163
+ */
164
+ put: operations["handOnSoftwareProject"];
165
+ post?: never;
166
+ delete?: never;
167
+ options?: never;
168
+ head?: never;
169
+ patch?: never;
170
+ trace?: never;
171
+ };
172
+ "/software-projects/{software_project_id}/github": {
173
+ parameters: {
174
+ query?: never;
175
+ header?: never;
176
+ path: {
177
+ software_project_id: components["parameters"]["SoftwareProjectId"];
178
+ };
179
+ cookie?: never;
180
+ };
181
+ get?: never;
182
+ /**
183
+ * Connect a software project to a GitHub repository
184
+ * @description "CODE ALSO ON GITHUB": a GitHub connection the Integrations app holds, and the repository on
185
+ * it. Connecting sends the code outside Onplo, so it is an act of its own, held from Manager up,
186
+ * and using the connection is asked of the account environment as Integrations gives it.
187
+ *
188
+ * CONNECTING AGAIN REPLACES the connection and the repository the project had.
189
+ *
190
+ * A CONNECTION THAT IS NOT A GITHUB ONE, OR NOT USABLE HERE, is refused with a 422 on
191
+ * `/body/connection_id`, code `github_connection_not_usable`. An unmarked project is not
192
+ * connected: 409 `software_project_unmarked`.
193
+ */
194
+ put: operations["connectSoftwareProjectToGitHub"];
195
+ post?: never;
196
+ delete?: never;
197
+ options?: never;
198
+ head?: never;
199
+ patch?: never;
200
+ trace?: never;
201
+ };
202
+ "/software-projects/{software_project_id}/own-folder": {
203
+ parameters: {
204
+ query?: never;
205
+ header?: never;
206
+ path: {
207
+ software_project_id: components["parameters"]["SoftwareProjectId"];
208
+ };
209
+ cookie?: never;
210
+ };
211
+ get?: never;
212
+ /**
213
+ * Choose another folder of your own for a software project
214
+ * @description "FOLDER GONE — CHOOSE ANOTHER FOLDER OR UNMARK IT". Once Trash removes a project's folder for
215
+ * good, the project asks for another. Choosing one asks the same as marking one: the right to
216
+ * share the new folder. The project keeps its id, its name, its settings and its history; old
217
+ * builds keep naming the folder they were built from.
218
+ *
219
+ * ONLY A PROJECT IN A FOLDER OF YOUR OWN chooses one of yours. A company project chooses a
220
+ * company folder (`chooseCompanyFolderForSoftwareProject`), and its id is not found here.
221
+ *
222
+ * A PROJECT WHOSE FOLDER IS STILL THERE OR IN TRASH IS REFUSED with 409 `folder_still_there`:
223
+ * it follows its folder, and a project is never pointed away from a folder that exists.
224
+ * A folder that is not there is refused with `folder_not_found`, one already a software project
225
+ * with `folder_already_a_software_project`, and nothing changes.
226
+ */
227
+ put: operations["chooseOwnFolderForSoftwareProject"];
228
+ post?: never;
229
+ delete?: never;
230
+ options?: never;
231
+ head?: never;
232
+ patch?: never;
233
+ trace?: never;
234
+ };
235
+ "/software-projects/{software_project_id}/company-folder": {
236
+ parameters: {
237
+ query?: never;
238
+ header?: never;
239
+ path: {
240
+ software_project_id: components["parameters"]["SoftwareProjectId"];
241
+ };
242
+ cookie?: never;
243
+ };
244
+ get?: never;
245
+ /**
246
+ * Choose another company folder for a software project
247
+ * @description The same act as `chooseOwnFolderForSoftwareProject`, for a company project and a company
248
+ * folder, whose folder permission is "Set who may reach a company folder".
249
+ */
250
+ put: operations["chooseCompanyFolderForSoftwareProject"];
251
+ post?: never;
252
+ delete?: never;
253
+ options?: never;
254
+ head?: never;
255
+ patch?: never;
256
+ trace?: never;
257
+ };
258
+ "/software-projects/{software_project_id}/grants": {
259
+ parameters: {
260
+ query?: never;
261
+ header?: never;
262
+ path: {
263
+ software_project_id: components["parameters"]["SoftwareProjectId"];
264
+ };
265
+ cookie?: never;
266
+ };
267
+ get?: never;
268
+ put?: never;
269
+ /**
270
+ * Share a software project
271
+ * @description ONE OF FOUR ROLES — Viewer, Editor, Manager, Administrator — each the register's
272
+ * `software.role.<this word>`. Commenter is not offered on a project, because comments live on
273
+ * a build or a screen.
274
+ *
275
+ * WITH A MEMBER OR A TEAM OF THIS ACCOUNT ENVIRONMENT. Nobody by that id here, or no such team,
276
+ * is refused (409 `recipient_not_found`). SHARING WITH AN OUTSIDE TESTER IS NOT HERE YET: a
277
+ * share outside the account environment asks Account's permission as well (decision 0658), so
278
+ * `recipient.kind` has no word for an outside person until that half is declared.
279
+ *
280
+ * SHARING AGAIN CHANGES THE SHARE THAT IS THERE. A holder has one grant per object (decision
281
+ * 0650), so a person or a team shared with again takes the new role and the new end and keeps
282
+ * the id. `created` says which it was and the status is `200` either way.
283
+ *
284
+ * `access_until` IS THE MOMENT THIS SHARE ENDS, and the time zone it was chosen in (decision
285
+ * 0650). Left out, the share has no end. A moment that has already passed is refused (422
286
+ * naming `access_until`, `access_until_passed`).
287
+ *
288
+ * NEVER AN AI AGENT'S TO DO, and never a raw key's: a share is a grant of access (403
289
+ * `ring_requires_person`).
290
+ *
291
+ * THE IDENTITY SERVICE KEEPS THE GRANT, AND WRITES IT ITSELF. When it cannot be reached, 503
292
+ * `identity_unavailable`: whether the share landed is not known, so send the same request
293
+ * again.
294
+ */
295
+ post: operations["shareSoftwareProject"];
296
+ delete?: never;
297
+ options?: never;
298
+ head?: never;
299
+ patch?: never;
300
+ trace?: never;
301
+ };
302
+ "/software-projects/{software_project_id}/grants/{grant_id}": {
303
+ parameters: {
304
+ query?: never;
305
+ header?: never;
306
+ path: {
307
+ software_project_id: components["parameters"]["SoftwareProjectId"];
308
+ /** @description The id sharing the project answered. A share is a grant, and the identity service gives it its id. */
309
+ grant_id: components["parameters"]["SoftwareProjectShareId"];
310
+ };
311
+ cookie?: never;
312
+ };
313
+ get?: never;
314
+ put?: never;
315
+ post?: never;
316
+ /**
317
+ * End a share of a software project
318
+ * @description THE ACCESS STOPS AT ONCE. The share is ended and never deleted, and ending one that has
319
+ * already ended is not an error.
320
+ *
321
+ * ENDED WHERE IT WAS PLACED, as a share is changed (409 `share_placed_elsewhere`). An id that
322
+ * names no share reaching this project is the 404.
323
+ *
324
+ * When the identity service cannot be reached, 503 `identity_unavailable`: whether the share
325
+ * ended is not known, so send the same request again.
326
+ */
327
+ delete: operations["endSoftwareProjectShare"];
328
+ options?: never;
329
+ head?: never;
330
+ /**
331
+ * Change a share of a software project
332
+ * @description A DIFFERENT ROLE, OR A DIFFERENT END. Every field is optional; an omitted field is untouched,
333
+ * and an explicit `null` on `access_until` removes the end. Both edits land or neither does.
334
+ *
335
+ * CHANGED WHERE IT WAS PLACED. A role held across the whole account environment reaches the
336
+ * project too, and is changed where it was given (409 `share_placed_elsewhere`). An id that
337
+ * names no share reaching this project is the 404.
338
+ *
339
+ * A SHARE THAT HAS ENDED IS NEVER BROUGHT BACK BY CHANGING ITS END (409 `share_ended`).
340
+ *
341
+ * When the identity service cannot be reached, 503 `identity_unavailable`: whether the change
342
+ * landed is not known, so send the same request again.
343
+ */
344
+ patch: operations["changeSoftwareProjectShare"];
345
+ trace?: never;
346
+ };
347
+ }
348
+ export type webhooks = Record<string, never>;
349
+ export interface components {
350
+ schemas: {
351
+ /**
352
+ * Format: uuid
353
+ * @description A UUID version 7 (RFC 9562) — sortable by creation, and never a counter. A software project's
354
+ * id is its own, never its folder's: the project can outlive its folder and be given another.
355
+ * @example 019250e1-8f3c-7c21-9a4d-3a2f7b6c1d90
356
+ */
357
+ Id: string;
358
+ /**
359
+ * @description WHOSE FOLDERS THE PROJECT IS IN. `personal`: a folder of your own, so the project is yours.
360
+ * `company`: a company folder, so the project is the company's; only in a business account
361
+ * environment.
362
+ * @enum {string}
363
+ */
364
+ OwnerScope: "personal" | "company";
365
+ /**
366
+ * @description What the project is called on every page of Software. One line.
367
+ * @example Customer portal
368
+ */
369
+ SoftwareProjectName: string;
370
+ /**
371
+ * Format: uri
372
+ * @example https://www.example.com
373
+ */
374
+ SiteAddress: string;
375
+ /**
376
+ * @description Where the project's screens come from: its specification, a robot walking the staging site,
377
+ * or both.
378
+ * @enum {string}
379
+ */
380
+ ScreensComeFrom: "specification" | "robot" | "both";
381
+ /**
382
+ * @description WHAT STORAGE LAST SAID OF THE PROJECT'S FOLDER. `there`: the folder is in Storage, wherever it
383
+ * was moved and whatever it is called now. `in_trash`: "Folder in Trash" — no new build starts,
384
+ * everything stays readable, and restoring the folder brings the project back as it was.
385
+ * `gone`: Trash removed it for good — "choose another folder or unmark it".
386
+ * @enum {string}
387
+ */
388
+ FolderState: "there" | "in_trash" | "gone";
389
+ /**
390
+ * @description The repository on GitHub, as GitHub writes it, `owner/name`.
391
+ * @example example-org/customer-portal
392
+ */
393
+ GitHubRepository: string;
394
+ /**
395
+ * @description A STORAGE FOLDER MARKED AS A SOFTWARE PROJECT, and the project's own settings. Nothing of the
396
+ * folder's is here: its name, its place and its files are Storage's to answer.
397
+ */
398
+ SoftwareProject: {
399
+ id: components["schemas"]["Id"];
400
+ name: components["schemas"]["SoftwareProjectName"];
401
+ /** @description The Storage folder the code is in, by its id. A move or a rename keeps it. */
402
+ folder_id: components["schemas"]["Id"];
403
+ folder_state: components["schemas"]["FolderState"];
404
+ owner_scope: components["schemas"]["OwnerScope"];
405
+ /** @description Where builds are tried before release. `null` when none is set. */
406
+ staging_site: components["schemas"]["SiteAddress"] | null;
407
+ /** @description The address people use. `null` when none is set. */
408
+ production_site: components["schemas"]["SiteAddress"] | null;
409
+ screens_come_from: components["schemas"]["ScreensComeFrom"];
410
+ /** @description The member who looks after the project and holds Administrator on it. `null` once that person asked to be forgotten: the project stays the company's and names nobody until it is handed on. */
411
+ looked_after_by: components["schemas"]["Id"] | null;
412
+ /** @description "Code also on GitHub": the repository it is connected to. `null` when it is not. */
413
+ github_repository: components["schemas"]["GitHubRepository"] | null;
414
+ /** @description `true` once the project is unmarked: archived, and read and nothing else. */
415
+ unmarked: boolean;
416
+ /** @description When the folder was marked. */
417
+ created_at: components["schemas"]["Timestamp"];
418
+ };
419
+ /** @description Which folder becomes a software project, and what the project is called. */
420
+ NewSoftwareProject: {
421
+ /** @description The Storage folder, by its id. */
422
+ folder_id: components["schemas"]["Id"];
423
+ name: components["schemas"]["SoftwareProjectName"];
424
+ };
425
+ /** @description A new name, sites, or where screens come from. At least one. */
426
+ SoftwareProjectUpdate: {
427
+ name?: components["schemas"]["SoftwareProjectName"];
428
+ /** @description A new staging site, or `null` to clear it. */
429
+ staging_site?: components["schemas"]["SiteAddress"] | null;
430
+ /** @description A new production site, or `null` to clear it. */
431
+ production_site?: components["schemas"]["SiteAddress"] | null;
432
+ screens_come_from?: components["schemas"]["ScreensComeFrom"];
433
+ };
434
+ SoftwareProjectHandOn: {
435
+ /** @description The member who looks after the project from now on. */
436
+ person_id: components["schemas"]["Id"];
437
+ };
438
+ /** @description Which GitHub connection the code goes out through, and to which repository on it. */
439
+ GitHubRepositoryChoice: {
440
+ /** @description A GitHub connection the Integrations app holds, by its id. */
441
+ connection_id: components["schemas"]["Id"];
442
+ repository: components["schemas"]["GitHubRepository"];
443
+ };
444
+ FolderChoice: {
445
+ /** @description The Storage folder the project is in from now on, by its id. */
446
+ folder_id: components["schemas"]["Id"];
447
+ };
448
+ /**
449
+ * @description WHO A PROJECT IS SHARED WITH, by id and never by name: a member of this account environment,
450
+ * or one of its teams. The outside tester is not here yet (`shareSoftwareProject` says why).
451
+ */
452
+ SoftwareProjectShareRecipient: {
453
+ /** @enum {string} */
454
+ kind: "person" | "team";
455
+ id: components["schemas"]["Id"];
456
+ };
457
+ /**
458
+ * @description WHAT A SHARE LETS ITS HOLDER DO — the ladder every app has (decision 0969), each the
459
+ * register's `software.role.<this word>`. No Commenter: comments live on a build or a screen.
460
+ * @enum {string}
461
+ */
462
+ SoftwareProjectShareRole: "viewer" | "editor" | "manager" | "administrator";
463
+ /**
464
+ * @description WHEN A SHARE ENDS: A MOMENT AND THE TIME ZONE IT WAS CHOSEN IN (decision 0650). The shape is
465
+ * Storage's `AccessUntil`, key for key, so a share reads the same in every app.
466
+ */
467
+ SoftwareProjectShareAccessUntil: {
468
+ /**
469
+ * Format: date-time
470
+ * @description The moment the share ends, RFC 3339 with its offset written out. A request may write
471
+ * it in any offset; an answer writes it in UTC, as every moment here is.
472
+ * @example 2026-11-03T16:00:00Z
473
+ */
474
+ at: string;
475
+ /**
476
+ * @description The IANA time zone the moment was chosen in.
477
+ * @example Europe/Brussels
478
+ */
479
+ zone: string;
480
+ };
481
+ /**
482
+ * @description ONE SHARE OF ONE SOFTWARE PROJECT. It is a grant the identity service keeps, so every field
483
+ * of it is that service's answer and Software stores none of it.
484
+ */
485
+ SoftwareProjectShare: {
486
+ /** @description The grant's id, given by the identity service. */
487
+ id: components["schemas"]["Id"];
488
+ /** @description The project the share was placed on. */
489
+ software_project_id: components["schemas"]["Id"];
490
+ recipient: components["schemas"]["SoftwareProjectShareRecipient"];
491
+ role: components["schemas"]["SoftwareProjectShareRole"];
492
+ /** @description `null` when the share has no end. */
493
+ access_until: components["schemas"]["SoftwareProjectShareAccessUntil"] | null;
494
+ /** @description When it was first given. A later change leaves this as it was. */
495
+ created_at: components["schemas"]["Timestamp"];
496
+ };
497
+ /** @description What sharing a project answers — the share, and whether this request made it. */
498
+ PlacedSoftwareProjectShare: {
499
+ share: components["schemas"]["SoftwareProjectShare"];
500
+ /**
501
+ * @description `true` when this request made the share. `false` when the person or team already held
502
+ * one placed on this project and this request changed it: the id is the one they had.
503
+ */
504
+ created: boolean;
505
+ };
506
+ /** @description Who to share the project with, what they may do, and when it ends. */
507
+ NewSoftwareProjectShare: {
508
+ recipient: components["schemas"]["SoftwareProjectShareRecipient"];
509
+ role: components["schemas"]["SoftwareProjectShareRole"];
510
+ /** @description Left out or `null`, the share has no end. */
511
+ access_until?: components["schemas"]["SoftwareProjectShareAccessUntil"] | null;
512
+ };
513
+ /** @description A different role, a different end, or both. At least one. */
514
+ SoftwareProjectShareChange: {
515
+ role?: components["schemas"]["SoftwareProjectShareRole"];
516
+ /** @description A new end, or `null` to remove the end. Left out, the end is untouched. */
517
+ access_until?: components["schemas"]["SoftwareProjectShareAccessUntil"] | null;
518
+ };
519
+ /**
520
+ * Format: date-time
521
+ * @description RFC 3339, always UTC, always with the offset written out.
522
+ * @example 2026-09-13T06:06:00Z
523
+ */
524
+ Timestamp: string;
525
+ /**
526
+ * @description Pass it as `cursor` for the next page. `null` means this was the last page — the only
527
+ * honest end signal, because a short page is not one.
528
+ */
529
+ NextCursor: string | null;
530
+ /**
531
+ * @description RFC 9457. Served as `application/problem+json`, on every failure, from every operation —
532
+ * one shape to handle rather than one per endpoint. CLOSED, like every other object here:
533
+ * the server validates its own answers against this schema, and an open object is the one
534
+ * shape that check cannot see through.
535
+ */
536
+ Problem: {
537
+ /**
538
+ * Format: uri
539
+ * @description A stable URI naming the kind of problem. Dereferenceable; documentation lives there.
540
+ * @example https://onplo.com/problems/folder_already_a_software_project
541
+ */
542
+ type: string;
543
+ /** @example This folder is a software project already */
544
+ title: string;
545
+ status: number;
546
+ /** @description What went wrong THIS time, in a sentence a person could be shown. */
547
+ detail?: string;
548
+ /**
549
+ * Format: uri-reference
550
+ * @description The request path this happened on.
551
+ */
552
+ instance?: string;
553
+ /**
554
+ * @description The machine name, stable across wording changes. `type` is the URI a human opens; this
555
+ * is what a client branches on.
556
+ * @example folder_already_a_software_project
557
+ */
558
+ code: string;
559
+ /**
560
+ * Format: uuid
561
+ * @description Quote it in a support request and the exact call can be found. It is also on the
562
+ * `Onplo-Request-Id` response header of every response, failed or not.
563
+ */
564
+ request_id: string;
565
+ /** @description One entry per field that is wrong. REQUIRED on a 422. */
566
+ errors?: {
567
+ /**
568
+ * @description A JSON Pointer (RFC 6901) at the wrong value, rooted at the REQUEST: `/body/...`
569
+ * for a body field, `/query/...` for a query parameter, `/path/...` for a path
570
+ * segment.
571
+ * @example /body/name
572
+ * @example /query/limit
573
+ */
574
+ pointer: string;
575
+ code: string;
576
+ detail: string;
577
+ }[];
578
+ };
579
+ };
580
+ responses: {
581
+ /**
582
+ * @description The request could not be read, so nothing in it was looked at — `malformed_request`. Its body
583
+ * is not valid JSON, or its address carries a broken `%`-escape. No field is named, because
584
+ * none was read. Declared on every operation, the ones that take no body included: a body is
585
+ * read before the server knows which operation it was sent to.
586
+ */
587
+ BadRequest: {
588
+ headers: {
589
+ "Onplo-Request-Id": components["headers"]["OnploRequestId"];
590
+ [name: string]: unknown;
591
+ };
592
+ content: {
593
+ "application/problem+json": components["schemas"]["Problem"] & {
594
+ /** @enum {unknown} */
595
+ code?: "malformed_request";
596
+ };
597
+ };
598
+ };
599
+ /**
600
+ * @description There is no usable credential on this call — it is missing, malformed, unknown, expired, or
601
+ * it has been REVOKED. A revoked credential fails HERE and not with 403, because it is no
602
+ * longer a credential.
603
+ */
604
+ Unauthorized: {
605
+ headers: {
606
+ "Onplo-Request-Id": components["headers"]["OnploRequestId"];
607
+ "WWW-Authenticate": components["headers"]["WwwAuthenticate"];
608
+ [name: string]: unknown;
609
+ };
610
+ content: {
611
+ "application/problem+json": components["schemas"]["Problem"] & {
612
+ /** @enum {unknown} */
613
+ code?: "credential_missing" | "credential_malformed" | "credential_unknown" | "credential_expired" | "credential_revoked";
614
+ };
615
+ };
616
+ };
617
+ /**
618
+ * @description The credential is good and this call is refused anyway. `permission_missing`: the
619
+ * credential does not carry the permission this operation needs, on this software project —
620
+ * and that is the answer whether or not the project exists, so a refusal never tells you one
621
+ * does. `ring_requires_person`: a ring-1 act attempted by a raw key or an agent, refused
622
+ * regardless of scopes; sharing a project is one. `outside_session_scope`: allowed to this
623
+ * subject and not within the scope this session declared at sign-in.
624
+ *
625
+ * ONE COMPONENT ON EVERY OPERATION. THE ENUM IS THE UNION ACROSS EVERY ONPLO CONTRACT, so a
626
+ * client writes one branch.
627
+ */
628
+ Forbidden: {
629
+ headers: {
630
+ "Onplo-Request-Id": components["headers"]["OnploRequestId"];
631
+ [name: string]: unknown;
632
+ };
633
+ content: {
634
+ "application/problem+json": components["schemas"]["Problem"] & {
635
+ /** @enum {unknown} */
636
+ code?: "permission_missing" | "ring_requires_person" | "outside_session_scope";
637
+ };
638
+ };
639
+ };
640
+ /**
641
+ * @description No such thing, for a caller who was allowed to ask. A caller who was not is answered 403,
642
+ * the same whether the thing exists or not, so neither answer tells somebody a project
643
+ * exists that they hold no role on.
644
+ */
645
+ NotFound: {
646
+ headers: {
647
+ "Onplo-Request-Id": components["headers"]["OnploRequestId"];
648
+ "Cache-Control": components["headers"]["CacheControl"];
649
+ [name: string]: unknown;
650
+ };
651
+ content: {
652
+ "application/problem+json": components["schemas"]["Problem"] & {
653
+ /** @enum {unknown} */
654
+ code?: "not_found";
655
+ };
656
+ };
657
+ };
658
+ /**
659
+ * @description The request body is larger than this API reads — `request_too_large`. `detail` names the
660
+ * limit in bytes. Declared on every operation, for the reason `BadRequest` gives. This API never
661
+ * takes a file: the code stays in Storage.
662
+ */
663
+ ContentTooLarge: {
664
+ headers: {
665
+ "Onplo-Request-Id": components["headers"]["OnploRequestId"];
666
+ [name: string]: unknown;
667
+ };
668
+ content: {
669
+ "application/problem+json": components["schemas"]["Problem"] & {
670
+ /** @enum {unknown} */
671
+ code?: "request_too_large";
672
+ };
673
+ };
674
+ };
675
+ /**
676
+ * @description The request body is in a form this API does not read — `unsupported_media_type`. This API
677
+ * reads JSON, sent uncompressed as `application/json`, and nothing else.
678
+ */
679
+ UnsupportedMediaType: {
680
+ headers: {
681
+ "Onplo-Request-Id": components["headers"]["OnploRequestId"];
682
+ [name: string]: unknown;
683
+ };
684
+ content: {
685
+ "application/problem+json": components["schemas"]["Problem"] & {
686
+ /** @enum {unknown} */
687
+ code?: "unsupported_media_type";
688
+ };
689
+ };
690
+ };
691
+ /**
692
+ * @description The request parsed and something in it is wrong. `errors` says what, one entry per field,
693
+ * each with a JSON Pointer at it. ONE `code`, because the detail is in `errors`.
694
+ */
695
+ Unprocessable: {
696
+ headers: {
697
+ "Onplo-Request-Id": components["headers"]["OnploRequestId"];
698
+ [name: string]: unknown;
699
+ };
700
+ content: {
701
+ "application/problem+json": components["schemas"]["Problem"] & {
702
+ /** @enum {unknown} */
703
+ code?: "unprocessable_request";
704
+ };
705
+ };
706
+ };
707
+ /**
708
+ * @description Something failed that this contract cannot describe — including an answer this API produced
709
+ * and then refused to send, because the contract does not describe that answer either
710
+ * (`response_not_in_contract`). Response validation stays on in production (decision 0551).
711
+ * `request_id` is what finds the call.
712
+ */
713
+ ServerError: {
714
+ headers: {
715
+ "Onplo-Request-Id": components["headers"]["OnploRequestId"];
716
+ [name: string]: unknown;
717
+ };
718
+ content: {
719
+ "application/problem+json": components["schemas"]["Problem"] & {
720
+ /** @enum {unknown} */
721
+ code?: "internal_error" | "response_not_in_contract";
722
+ };
723
+ };
724
+ };
725
+ /**
726
+ * @description The authorization service could not be asked, so whether this credential carries the
727
+ * permission is UNKNOWN — `authorization_unavailable`. Never a 403, which would claim the
728
+ * credential lacks the permission when all that is known is that we could not ask.
729
+ */
730
+ ServiceUnavailable: {
731
+ headers: {
732
+ "Onplo-Request-Id": components["headers"]["OnploRequestId"];
733
+ [name: string]: unknown;
734
+ };
735
+ content: {
736
+ "application/problem+json": components["schemas"]["Problem"] & {
737
+ /** @enum {unknown} */
738
+ code?: "authorization_unavailable";
739
+ };
740
+ };
741
+ };
742
+ /**
743
+ * @description One of two things could not be reached. `authorization_unavailable`: the authorization
744
+ * service could not be asked, so whether this credential carries the permission is unknown,
745
+ * and nothing was written. `identity_unavailable`: the call was allowed, and the identity
746
+ * service, which writes a share's grant itself, could not then be asked to write it. Whether
747
+ * the share changed is NOT KNOWN, so send the same request again: it is the same act, and its
748
+ * answer says how the share stands. The three operations on a project's share answer this in
749
+ * place of the shared `503`.
750
+ */
751
+ IdentityUnavailable: {
752
+ headers: {
753
+ "Onplo-Request-Id": components["headers"]["OnploRequestId"];
754
+ [name: string]: unknown;
755
+ };
756
+ content: {
757
+ "application/problem+json": components["schemas"]["Problem"] & {
758
+ /** @enum {unknown} */
759
+ code?: "authorization_unavailable" | "identity_unavailable";
760
+ };
761
+ };
762
+ };
763
+ /**
764
+ * @description **Onplo has not built this operation yet** — `not_implemented` (decision 0580). It is
765
+ * declared here because the contract is written before the code; it is not a 404, because the
766
+ * address is right, and not a 503, because there is nothing to retry. Treat the operation as
767
+ * absent for now. Nothing about your credential or your request caused this.
768
+ */
769
+ NotImplemented: {
770
+ headers: {
771
+ "Onplo-Request-Id": components["headers"]["OnploRequestId"];
772
+ "Cache-Control": components["headers"]["CacheControl"];
773
+ [name: string]: unknown;
774
+ };
775
+ content: {
776
+ "application/problem+json": components["schemas"]["Problem"] & {
777
+ /** @enum {unknown} */
778
+ code?: "not_implemented";
779
+ };
780
+ };
781
+ };
782
+ /**
783
+ * @description Refused, and nothing is made: the folder is not there (`folder_not_found`), or it is a
784
+ * software project already (`folder_already_a_software_project`).
785
+ */
786
+ MarkRefused: {
787
+ headers: {
788
+ "Onplo-Request-Id": components["headers"]["OnploRequestId"];
789
+ [name: string]: unknown;
790
+ };
791
+ content: {
792
+ "application/problem+json": components["schemas"]["Problem"] & {
793
+ /** @enum {unknown} */
794
+ code?: "folder_not_found" | "folder_already_a_software_project";
795
+ };
796
+ };
797
+ };
798
+ /**
799
+ * @description Refused, and nothing is made: the folder is not there (`folder_not_found`), it is a software
800
+ * project already (`folder_already_a_software_project`), or this account environment is a
801
+ * personal one, with no company folders (`company_project_in_a_personal_environment`).
802
+ */
803
+ CompanyMarkRefused: {
804
+ headers: {
805
+ "Onplo-Request-Id": components["headers"]["OnploRequestId"];
806
+ [name: string]: unknown;
807
+ };
808
+ content: {
809
+ "application/problem+json": components["schemas"]["Problem"] & {
810
+ /** @enum {unknown} */
811
+ code?: "folder_not_found" | "folder_already_a_software_project" | "company_project_in_a_personal_environment";
812
+ };
813
+ };
814
+ };
815
+ /** @description Refused, and nothing changed: the project is unmarked, and an archived project is read and nothing else (`software_project_unmarked`). */
816
+ ProjectUnmarked: {
817
+ headers: {
818
+ "Onplo-Request-Id": components["headers"]["OnploRequestId"];
819
+ [name: string]: unknown;
820
+ };
821
+ content: {
822
+ "application/problem+json": components["schemas"]["Problem"] & {
823
+ /** @enum {unknown} */
824
+ code?: "software_project_unmarked";
825
+ };
826
+ };
827
+ };
828
+ /**
829
+ * @description Refused, and nothing changed: the project's folder is still there or in Trash, and the
830
+ * project follows it (`folder_still_there`); the folder chosen is not there
831
+ * (`folder_not_found`) or is a software project already (`folder_already_a_software_project`);
832
+ * or the project is unmarked (`software_project_unmarked`).
833
+ */
834
+ FolderChoiceRefused: {
835
+ headers: {
836
+ "Onplo-Request-Id": components["headers"]["OnploRequestId"];
837
+ [name: string]: unknown;
838
+ };
839
+ content: {
840
+ "application/problem+json": components["schemas"]["Problem"] & {
841
+ /** @enum {unknown} */
842
+ code?: "folder_still_there" | "folder_not_found" | "folder_already_a_software_project" | "software_project_unmarked";
843
+ };
844
+ };
845
+ };
846
+ /**
847
+ * @description One of three things could not be asked, and in each NOTHING WAS MADE.
848
+ * `authorization_unavailable`: what this credential may do is unknown. `storage_unavailable`:
849
+ * the Storage app, which says whether the folder is there and holds it for the project.
850
+ * `identity_unavailable`: the identity service, which is told the project exists. The same
851
+ * request can be sent again.
852
+ */
853
+ MarkUnavailable: {
854
+ headers: {
855
+ "Onplo-Request-Id": components["headers"]["OnploRequestId"];
856
+ [name: string]: unknown;
857
+ };
858
+ content: {
859
+ "application/problem+json": components["schemas"]["Problem"] & {
860
+ /** @enum {unknown} */
861
+ code?: "authorization_unavailable" | "storage_unavailable" | "identity_unavailable";
862
+ };
863
+ };
864
+ };
865
+ /**
866
+ * @description One of two things could not be asked, and in both NOTHING CHANGED.
867
+ * `authorization_unavailable`: what this credential may do is unknown. `storage_unavailable`:
868
+ * the Storage app, which says whether the folder chosen is there and holds it for the project.
869
+ * The same request can be sent again.
870
+ */
871
+ StorageUnavailable: {
872
+ headers: {
873
+ "Onplo-Request-Id": components["headers"]["OnploRequestId"];
874
+ [name: string]: unknown;
875
+ };
876
+ content: {
877
+ "application/problem+json": components["schemas"]["Problem"] & {
878
+ /** @enum {unknown} */
879
+ code?: "authorization_unavailable" | "storage_unavailable";
880
+ };
881
+ };
882
+ };
883
+ /**
884
+ * @description One of two things could not be asked, and in both NOTHING CHANGED.
885
+ * `authorization_unavailable`: what this credential may do is unknown.
886
+ * `integrations_unavailable`: the Integrations app, which says whether the connection may be
887
+ * used and keeps its list of what uses it. The same request can be sent again.
888
+ */
889
+ IntegrationsUnavailable: {
890
+ headers: {
891
+ "Onplo-Request-Id": components["headers"]["OnploRequestId"];
892
+ [name: string]: unknown;
893
+ };
894
+ content: {
895
+ "application/problem+json": components["schemas"]["Problem"] & {
896
+ /** @enum {unknown} */
897
+ code?: "authorization_unavailable" | "integrations_unavailable";
898
+ };
899
+ };
900
+ };
901
+ };
902
+ parameters: {
903
+ /** @description How many to return. */
904
+ Limit: number;
905
+ /**
906
+ * @description The `next_cursor` of the previous page. Opaque on purpose — its contents are the server's
907
+ * business and change without notice.
908
+ */
909
+ Cursor: string;
910
+ /** @description Only projects in folders of your own, or only the company's. Left out, both. */
911
+ OwnerScopeFilter: components["schemas"]["OwnerScope"];
912
+ /** @description List unmarked projects too, each carrying that it is unmarked. */
913
+ IncludeUnmarked: boolean;
914
+ SoftwareProjectId: components["schemas"]["Id"];
915
+ /** @description The id sharing the project answered. A share is a grant, and the identity service gives it its id. */
916
+ SoftwareProjectShareId: components["schemas"]["Id"];
917
+ };
918
+ requestBodies: never;
919
+ headers: {
920
+ /**
921
+ * @description The id of this call. Minted by the server as a UUID version 7 and **never taken from a
922
+ * request header** (decision 0553). It rides EVERY response, and it is the same value as the
923
+ * problem document's `request_id` when there is one. Quote it in a support request and the
924
+ * exact call can be found.
925
+ */
926
+ OnploRequestId: string;
927
+ /**
928
+ * @description The challenge RFC 9110 §11.6.1 and RFC 6750 §3 require on a 401 under a bearer scheme
929
+ * (decision 0569). `Bearer realm="onplo"` alone when no credential was sent; otherwise
930
+ * `Bearer realm="onplo", error="invalid_token"`. It never carries `error_description` and never
931
+ * `scope`. A 403 carries no challenge at all.
932
+ */
933
+ WwwAuthenticate: string;
934
+ /**
935
+ * @description `no-store`, on the statuses RFC 9110 §15.1 makes cacheable by default — a 404 and a 501
936
+ * (decision 0580). A cached "not built yet" would outlive the day the operation is built, and
937
+ * a cached "no such project" the day the project is shared with you.
938
+ */
939
+ CacheControl: "no-store";
940
+ };
941
+ pathItems: never;
942
+ }
943
+ export type $defs = Record<string, never>;
944
+ export interface operations {
945
+ listSoftwareProjects: {
946
+ parameters: {
947
+ query?: {
948
+ /** @description How many to return. */
949
+ limit?: components["parameters"]["Limit"];
950
+ /**
951
+ * @description The `next_cursor` of the previous page. Opaque on purpose — its contents are the server's
952
+ * business and change without notice.
953
+ */
954
+ cursor?: components["parameters"]["Cursor"];
955
+ /** @description Only projects in folders of your own, or only the company's. Left out, both. */
956
+ owner_scope?: components["parameters"]["OwnerScopeFilter"];
957
+ /** @description List unmarked projects too, each carrying that it is unmarked. */
958
+ include_unmarked?: components["parameters"]["IncludeUnmarked"];
959
+ };
960
+ header?: never;
961
+ path?: never;
962
+ cookie?: never;
963
+ };
964
+ requestBody?: never;
965
+ responses: {
966
+ /** @description The software projects. */
967
+ 200: {
968
+ headers: {
969
+ "Onplo-Request-Id": components["headers"]["OnploRequestId"];
970
+ [name: string]: unknown;
971
+ };
972
+ content: {
973
+ "application/json": {
974
+ data: components["schemas"]["SoftwareProject"][];
975
+ next_cursor: components["schemas"]["NextCursor"];
976
+ };
977
+ };
978
+ };
979
+ 400: components["responses"]["BadRequest"];
980
+ 401: components["responses"]["Unauthorized"];
981
+ 403: components["responses"]["Forbidden"];
982
+ 413: components["responses"]["ContentTooLarge"];
983
+ 415: components["responses"]["UnsupportedMediaType"];
984
+ 422: components["responses"]["Unprocessable"];
985
+ 500: components["responses"]["ServerError"];
986
+ 501: components["responses"]["NotImplemented"];
987
+ 503: components["responses"]["ServiceUnavailable"];
988
+ };
989
+ };
990
+ markOwnFolderAsSoftwareProject: {
991
+ parameters: {
992
+ query?: never;
993
+ header?: never;
994
+ path?: never;
995
+ cookie?: never;
996
+ };
997
+ requestBody: {
998
+ content: {
999
+ "application/json": components["schemas"]["NewSoftwareProject"];
1000
+ };
1001
+ };
1002
+ responses: {
1003
+ /** @description The software project, as it now stands. */
1004
+ 201: {
1005
+ headers: {
1006
+ "Onplo-Request-Id": components["headers"]["OnploRequestId"];
1007
+ [name: string]: unknown;
1008
+ };
1009
+ content: {
1010
+ "application/json": components["schemas"]["SoftwareProject"];
1011
+ };
1012
+ };
1013
+ 400: components["responses"]["BadRequest"];
1014
+ 401: components["responses"]["Unauthorized"];
1015
+ 403: components["responses"]["Forbidden"];
1016
+ 409: components["responses"]["MarkRefused"];
1017
+ 413: components["responses"]["ContentTooLarge"];
1018
+ 415: components["responses"]["UnsupportedMediaType"];
1019
+ 422: components["responses"]["Unprocessable"];
1020
+ 500: components["responses"]["ServerError"];
1021
+ 501: components["responses"]["NotImplemented"];
1022
+ 503: components["responses"]["MarkUnavailable"];
1023
+ };
1024
+ };
1025
+ markCompanyFolderAsSoftwareProject: {
1026
+ parameters: {
1027
+ query?: never;
1028
+ header?: never;
1029
+ path?: never;
1030
+ cookie?: never;
1031
+ };
1032
+ requestBody: {
1033
+ content: {
1034
+ "application/json": components["schemas"]["NewSoftwareProject"];
1035
+ };
1036
+ };
1037
+ responses: {
1038
+ /** @description The software project, as it now stands. */
1039
+ 201: {
1040
+ headers: {
1041
+ "Onplo-Request-Id": components["headers"]["OnploRequestId"];
1042
+ [name: string]: unknown;
1043
+ };
1044
+ content: {
1045
+ "application/json": components["schemas"]["SoftwareProject"];
1046
+ };
1047
+ };
1048
+ 400: components["responses"]["BadRequest"];
1049
+ 401: components["responses"]["Unauthorized"];
1050
+ 403: components["responses"]["Forbidden"];
1051
+ 409: components["responses"]["CompanyMarkRefused"];
1052
+ 413: components["responses"]["ContentTooLarge"];
1053
+ 415: components["responses"]["UnsupportedMediaType"];
1054
+ 422: components["responses"]["Unprocessable"];
1055
+ 500: components["responses"]["ServerError"];
1056
+ 501: components["responses"]["NotImplemented"];
1057
+ 503: components["responses"]["MarkUnavailable"];
1058
+ };
1059
+ };
1060
+ getSoftwareProject: {
1061
+ parameters: {
1062
+ query?: never;
1063
+ header?: never;
1064
+ path: {
1065
+ software_project_id: components["parameters"]["SoftwareProjectId"];
1066
+ };
1067
+ cookie?: never;
1068
+ };
1069
+ requestBody?: never;
1070
+ responses: {
1071
+ /** @description The software project. */
1072
+ 200: {
1073
+ headers: {
1074
+ "Onplo-Request-Id": components["headers"]["OnploRequestId"];
1075
+ [name: string]: unknown;
1076
+ };
1077
+ content: {
1078
+ "application/json": components["schemas"]["SoftwareProject"];
1079
+ };
1080
+ };
1081
+ 400: components["responses"]["BadRequest"];
1082
+ 401: components["responses"]["Unauthorized"];
1083
+ 403: components["responses"]["Forbidden"];
1084
+ 404: components["responses"]["NotFound"];
1085
+ 413: components["responses"]["ContentTooLarge"];
1086
+ 415: components["responses"]["UnsupportedMediaType"];
1087
+ 422: components["responses"]["Unprocessable"];
1088
+ 500: components["responses"]["ServerError"];
1089
+ 501: components["responses"]["NotImplemented"];
1090
+ 503: components["responses"]["ServiceUnavailable"];
1091
+ };
1092
+ };
1093
+ unmarkSoftwareProject: {
1094
+ parameters: {
1095
+ query?: never;
1096
+ header?: never;
1097
+ path: {
1098
+ software_project_id: components["parameters"]["SoftwareProjectId"];
1099
+ };
1100
+ cookie?: never;
1101
+ };
1102
+ requestBody?: never;
1103
+ responses: {
1104
+ /** @description The folder is no longer a software project. */
1105
+ 204: {
1106
+ headers: {
1107
+ "Onplo-Request-Id": components["headers"]["OnploRequestId"];
1108
+ [name: string]: unknown;
1109
+ };
1110
+ content?: never;
1111
+ };
1112
+ 400: components["responses"]["BadRequest"];
1113
+ 401: components["responses"]["Unauthorized"];
1114
+ 403: components["responses"]["Forbidden"];
1115
+ 404: components["responses"]["NotFound"];
1116
+ 413: components["responses"]["ContentTooLarge"];
1117
+ 415: components["responses"]["UnsupportedMediaType"];
1118
+ 422: components["responses"]["Unprocessable"];
1119
+ 500: components["responses"]["ServerError"];
1120
+ 501: components["responses"]["NotImplemented"];
1121
+ 503: components["responses"]["ServiceUnavailable"];
1122
+ };
1123
+ };
1124
+ updateSoftwareProject: {
1125
+ parameters: {
1126
+ query?: never;
1127
+ header?: never;
1128
+ path: {
1129
+ software_project_id: components["parameters"]["SoftwareProjectId"];
1130
+ };
1131
+ cookie?: never;
1132
+ };
1133
+ requestBody: {
1134
+ content: {
1135
+ "application/json": components["schemas"]["SoftwareProjectUpdate"];
1136
+ };
1137
+ };
1138
+ responses: {
1139
+ /** @description The software project as it now stands. */
1140
+ 200: {
1141
+ headers: {
1142
+ "Onplo-Request-Id": components["headers"]["OnploRequestId"];
1143
+ [name: string]: unknown;
1144
+ };
1145
+ content: {
1146
+ "application/json": components["schemas"]["SoftwareProject"];
1147
+ };
1148
+ };
1149
+ 400: components["responses"]["BadRequest"];
1150
+ 401: components["responses"]["Unauthorized"];
1151
+ 403: components["responses"]["Forbidden"];
1152
+ 404: components["responses"]["NotFound"];
1153
+ 409: components["responses"]["ProjectUnmarked"];
1154
+ 413: components["responses"]["ContentTooLarge"];
1155
+ 415: components["responses"]["UnsupportedMediaType"];
1156
+ 422: components["responses"]["Unprocessable"];
1157
+ 500: components["responses"]["ServerError"];
1158
+ 501: components["responses"]["NotImplemented"];
1159
+ 503: components["responses"]["ServiceUnavailable"];
1160
+ };
1161
+ };
1162
+ handOnSoftwareProject: {
1163
+ parameters: {
1164
+ query?: never;
1165
+ header?: never;
1166
+ path: {
1167
+ software_project_id: components["parameters"]["SoftwareProjectId"];
1168
+ };
1169
+ cookie?: never;
1170
+ };
1171
+ requestBody: {
1172
+ content: {
1173
+ "application/json": components["schemas"]["SoftwareProjectHandOn"];
1174
+ };
1175
+ };
1176
+ responses: {
1177
+ /** @description The software project, looked after by the person named. */
1178
+ 200: {
1179
+ headers: {
1180
+ "Onplo-Request-Id": components["headers"]["OnploRequestId"];
1181
+ [name: string]: unknown;
1182
+ };
1183
+ content: {
1184
+ "application/json": components["schemas"]["SoftwareProject"];
1185
+ };
1186
+ };
1187
+ 400: components["responses"]["BadRequest"];
1188
+ 401: components["responses"]["Unauthorized"];
1189
+ 403: components["responses"]["Forbidden"];
1190
+ 404: components["responses"]["NotFound"];
1191
+ 409: components["responses"]["ProjectUnmarked"];
1192
+ 413: components["responses"]["ContentTooLarge"];
1193
+ 415: components["responses"]["UnsupportedMediaType"];
1194
+ 422: components["responses"]["Unprocessable"];
1195
+ 500: components["responses"]["ServerError"];
1196
+ 501: components["responses"]["NotImplemented"];
1197
+ 503: components["responses"]["IdentityUnavailable"];
1198
+ };
1199
+ };
1200
+ connectSoftwareProjectToGitHub: {
1201
+ parameters: {
1202
+ query?: never;
1203
+ header?: never;
1204
+ path: {
1205
+ software_project_id: components["parameters"]["SoftwareProjectId"];
1206
+ };
1207
+ cookie?: never;
1208
+ };
1209
+ requestBody: {
1210
+ content: {
1211
+ "application/json": components["schemas"]["GitHubRepositoryChoice"];
1212
+ };
1213
+ };
1214
+ responses: {
1215
+ /** @description The software project, connected. */
1216
+ 200: {
1217
+ headers: {
1218
+ "Onplo-Request-Id": components["headers"]["OnploRequestId"];
1219
+ [name: string]: unknown;
1220
+ };
1221
+ content: {
1222
+ "application/json": components["schemas"]["SoftwareProject"];
1223
+ };
1224
+ };
1225
+ 400: components["responses"]["BadRequest"];
1226
+ 401: components["responses"]["Unauthorized"];
1227
+ 403: components["responses"]["Forbidden"];
1228
+ 404: components["responses"]["NotFound"];
1229
+ 409: components["responses"]["ProjectUnmarked"];
1230
+ 413: components["responses"]["ContentTooLarge"];
1231
+ 415: components["responses"]["UnsupportedMediaType"];
1232
+ 422: components["responses"]["Unprocessable"];
1233
+ 500: components["responses"]["ServerError"];
1234
+ 501: components["responses"]["NotImplemented"];
1235
+ 503: components["responses"]["IntegrationsUnavailable"];
1236
+ };
1237
+ };
1238
+ chooseOwnFolderForSoftwareProject: {
1239
+ parameters: {
1240
+ query?: never;
1241
+ header?: never;
1242
+ path: {
1243
+ software_project_id: components["parameters"]["SoftwareProjectId"];
1244
+ };
1245
+ cookie?: never;
1246
+ };
1247
+ requestBody: {
1248
+ content: {
1249
+ "application/json": components["schemas"]["FolderChoice"];
1250
+ };
1251
+ };
1252
+ responses: {
1253
+ /** @description The software project, in its new folder. */
1254
+ 200: {
1255
+ headers: {
1256
+ "Onplo-Request-Id": components["headers"]["OnploRequestId"];
1257
+ [name: string]: unknown;
1258
+ };
1259
+ content: {
1260
+ "application/json": components["schemas"]["SoftwareProject"];
1261
+ };
1262
+ };
1263
+ 400: components["responses"]["BadRequest"];
1264
+ 401: components["responses"]["Unauthorized"];
1265
+ 403: components["responses"]["Forbidden"];
1266
+ 404: components["responses"]["NotFound"];
1267
+ 409: components["responses"]["FolderChoiceRefused"];
1268
+ 413: components["responses"]["ContentTooLarge"];
1269
+ 415: components["responses"]["UnsupportedMediaType"];
1270
+ 422: components["responses"]["Unprocessable"];
1271
+ 500: components["responses"]["ServerError"];
1272
+ 501: components["responses"]["NotImplemented"];
1273
+ 503: components["responses"]["StorageUnavailable"];
1274
+ };
1275
+ };
1276
+ chooseCompanyFolderForSoftwareProject: {
1277
+ parameters: {
1278
+ query?: never;
1279
+ header?: never;
1280
+ path: {
1281
+ software_project_id: components["parameters"]["SoftwareProjectId"];
1282
+ };
1283
+ cookie?: never;
1284
+ };
1285
+ requestBody: {
1286
+ content: {
1287
+ "application/json": components["schemas"]["FolderChoice"];
1288
+ };
1289
+ };
1290
+ responses: {
1291
+ /** @description The software project, in its new folder. */
1292
+ 200: {
1293
+ headers: {
1294
+ "Onplo-Request-Id": components["headers"]["OnploRequestId"];
1295
+ [name: string]: unknown;
1296
+ };
1297
+ content: {
1298
+ "application/json": components["schemas"]["SoftwareProject"];
1299
+ };
1300
+ };
1301
+ 400: components["responses"]["BadRequest"];
1302
+ 401: components["responses"]["Unauthorized"];
1303
+ 403: components["responses"]["Forbidden"];
1304
+ 404: components["responses"]["NotFound"];
1305
+ 409: components["responses"]["FolderChoiceRefused"];
1306
+ 413: components["responses"]["ContentTooLarge"];
1307
+ 415: components["responses"]["UnsupportedMediaType"];
1308
+ 422: components["responses"]["Unprocessable"];
1309
+ 500: components["responses"]["ServerError"];
1310
+ 501: components["responses"]["NotImplemented"];
1311
+ 503: components["responses"]["StorageUnavailable"];
1312
+ };
1313
+ };
1314
+ shareSoftwareProject: {
1315
+ parameters: {
1316
+ query?: never;
1317
+ header?: never;
1318
+ path: {
1319
+ software_project_id: components["parameters"]["SoftwareProjectId"];
1320
+ };
1321
+ cookie?: never;
1322
+ };
1323
+ requestBody: {
1324
+ content: {
1325
+ "application/json": components["schemas"]["NewSoftwareProjectShare"];
1326
+ };
1327
+ };
1328
+ responses: {
1329
+ /** @description The share as it now stands, and whether this request made it. */
1330
+ 200: {
1331
+ headers: {
1332
+ "Onplo-Request-Id": components["headers"]["OnploRequestId"];
1333
+ [name: string]: unknown;
1334
+ };
1335
+ content: {
1336
+ "application/json": components["schemas"]["PlacedSoftwareProjectShare"];
1337
+ };
1338
+ };
1339
+ 400: components["responses"]["BadRequest"];
1340
+ 401: components["responses"]["Unauthorized"];
1341
+ 403: components["responses"]["Forbidden"];
1342
+ 404: components["responses"]["NotFound"];
1343
+ /** @description Refused: nobody by that id, or no such team, in this account environment (`recipient_not_found`). Nothing was shared. */
1344
+ 409: {
1345
+ headers: {
1346
+ "Onplo-Request-Id": components["headers"]["OnploRequestId"];
1347
+ [name: string]: unknown;
1348
+ };
1349
+ content: {
1350
+ "application/problem+json": components["schemas"]["Problem"] & {
1351
+ /** @enum {unknown} */
1352
+ code?: "recipient_not_found";
1353
+ };
1354
+ };
1355
+ };
1356
+ 413: components["responses"]["ContentTooLarge"];
1357
+ 415: components["responses"]["UnsupportedMediaType"];
1358
+ 422: components["responses"]["Unprocessable"];
1359
+ 500: components["responses"]["ServerError"];
1360
+ 501: components["responses"]["NotImplemented"];
1361
+ 503: components["responses"]["IdentityUnavailable"];
1362
+ };
1363
+ };
1364
+ endSoftwareProjectShare: {
1365
+ parameters: {
1366
+ query?: never;
1367
+ header?: never;
1368
+ path: {
1369
+ software_project_id: components["parameters"]["SoftwareProjectId"];
1370
+ /** @description The id sharing the project answered. A share is a grant, and the identity service gives it its id. */
1371
+ grant_id: components["parameters"]["SoftwareProjectShareId"];
1372
+ };
1373
+ cookie?: never;
1374
+ };
1375
+ requestBody?: never;
1376
+ responses: {
1377
+ /** @description Ended. */
1378
+ 204: {
1379
+ headers: {
1380
+ "Onplo-Request-Id": components["headers"]["OnploRequestId"];
1381
+ [name: string]: unknown;
1382
+ };
1383
+ content?: never;
1384
+ };
1385
+ 400: components["responses"]["BadRequest"];
1386
+ 401: components["responses"]["Unauthorized"];
1387
+ 403: components["responses"]["Forbidden"];
1388
+ 404: components["responses"]["NotFound"];
1389
+ /** @description Refused: the access was given across the whole account environment and is ended there (`share_placed_elsewhere`). Nothing was changed. */
1390
+ 409: {
1391
+ headers: {
1392
+ "Onplo-Request-Id": components["headers"]["OnploRequestId"];
1393
+ [name: string]: unknown;
1394
+ };
1395
+ content: {
1396
+ "application/problem+json": components["schemas"]["Problem"] & {
1397
+ /** @enum {unknown} */
1398
+ code?: "share_placed_elsewhere";
1399
+ };
1400
+ };
1401
+ };
1402
+ 413: components["responses"]["ContentTooLarge"];
1403
+ 415: components["responses"]["UnsupportedMediaType"];
1404
+ 422: components["responses"]["Unprocessable"];
1405
+ 500: components["responses"]["ServerError"];
1406
+ 501: components["responses"]["NotImplemented"];
1407
+ 503: components["responses"]["IdentityUnavailable"];
1408
+ };
1409
+ };
1410
+ changeSoftwareProjectShare: {
1411
+ parameters: {
1412
+ query?: never;
1413
+ header?: never;
1414
+ path: {
1415
+ software_project_id: components["parameters"]["SoftwareProjectId"];
1416
+ /** @description The id sharing the project answered. A share is a grant, and the identity service gives it its id. */
1417
+ grant_id: components["parameters"]["SoftwareProjectShareId"];
1418
+ };
1419
+ cookie?: never;
1420
+ };
1421
+ requestBody: {
1422
+ content: {
1423
+ "application/json": components["schemas"]["SoftwareProjectShareChange"];
1424
+ };
1425
+ };
1426
+ responses: {
1427
+ /** @description The share as it now stands. */
1428
+ 200: {
1429
+ headers: {
1430
+ "Onplo-Request-Id": components["headers"]["OnploRequestId"];
1431
+ [name: string]: unknown;
1432
+ };
1433
+ content: {
1434
+ "application/json": components["schemas"]["SoftwareProjectShare"];
1435
+ };
1436
+ };
1437
+ 400: components["responses"]["BadRequest"];
1438
+ 401: components["responses"]["Unauthorized"];
1439
+ 403: components["responses"]["Forbidden"];
1440
+ 404: components["responses"]["NotFound"];
1441
+ /**
1442
+ * @description Refused, and nothing was changed: the access was given across the whole account
1443
+ * environment and is changed there (`share_placed_elsewhere`), or the share has ended
1444
+ * (`share_ended`).
1445
+ */
1446
+ 409: {
1447
+ headers: {
1448
+ "Onplo-Request-Id": components["headers"]["OnploRequestId"];
1449
+ [name: string]: unknown;
1450
+ };
1451
+ content: {
1452
+ "application/problem+json": components["schemas"]["Problem"] & {
1453
+ /** @enum {unknown} */
1454
+ code?: "share_placed_elsewhere" | "share_ended";
1455
+ };
1456
+ };
1457
+ };
1458
+ 413: components["responses"]["ContentTooLarge"];
1459
+ 415: components["responses"]["UnsupportedMediaType"];
1460
+ 422: components["responses"]["Unprocessable"];
1461
+ 500: components["responses"]["ServerError"];
1462
+ 501: components["responses"]["NotImplemented"];
1463
+ 503: components["responses"]["IdentityUnavailable"];
1464
+ };
1465
+ };
1466
+ }