@fleetless/contracts 6.0.0 → 6.1.0-next.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.
Files changed (41) hide show
  1. package/CHANGELOG.md +42 -0
  2. package/artifacts/openapi.json +692 -1
  3. package/artifacts/routes.json +101 -0
  4. package/artifacts/schema/addon-catalogue-entry.schema.json +81 -0
  5. package/artifacts/schema/addon-key.schema.json +11 -0
  6. package/artifacts/schema/admin-plan-change-request.schema.json +189 -0
  7. package/artifacts/schema/asset-plan-limit-details.schema.json +115 -0
  8. package/artifacts/schema/audit-actor.schema.json +2 -1
  9. package/artifacts/schema/audit-event.schema.json +2 -1
  10. package/artifacts/schema/audit-list-response.schema.json +2 -1
  11. package/artifacts/schema/org-addons.schema.json +44 -0
  12. package/artifacts/schema/org-lock.schema.json +25 -0
  13. package/artifacts/schema/org-locked-details.schema.json +18 -0
  14. package/artifacts/schema/org-plan-usage.schema.json +51 -0
  15. package/artifacts/schema/org-plan.schema.json +500 -0
  16. package/artifacts/schema/pending-plan-change.schema.json +123 -0
  17. package/artifacts/schema/plan-catalogue-entry.schema.json +249 -0
  18. package/artifacts/schema/plan-change-keep.schema.json +49 -0
  19. package/artifacts/schema/plan-change-reason.schema.json +10 -0
  20. package/artifacts/schema/plan-change-request.schema.json +77 -0
  21. package/artifacts/schema/plan-currency.schema.json +8 -0
  22. package/artifacts/schema/plan-features.schema.json +44 -0
  23. package/artifacts/schema/plan-id.schema.json +10 -0
  24. package/artifacts/schema/plan-limit-details.schema.json +94 -0
  25. package/artifacts/schema/plan-limits.schema.json +121 -0
  26. package/artifacts/schema/plan-overrides.schema.json +111 -0
  27. package/artifacts/schema/plan-prices.schema.json +37 -0
  28. package/artifacts/schema/plan-required-details.schema.json +45 -0
  29. package/dist/audit.d.ts +10 -0
  30. package/dist/audit.js +8 -1
  31. package/dist/errors.d.ts +138 -1
  32. package/dist/errors.js +104 -0
  33. package/dist/index.d.ts +6 -2
  34. package/dist/index.js +11 -1
  35. package/dist/plans.d.ts +507 -0
  36. package/dist/plans.js +487 -0
  37. package/dist/realtime.d.ts +2 -0
  38. package/dist/realtime.js +6 -0
  39. package/dist/routes.d.ts +5 -1
  40. package/dist/routes.js +59 -0
  41. package/package.json +1 -1
@@ -6368,6 +6368,107 @@
6368
6368
  "transport": "http",
6369
6369
  "notes": "The message is stored before any mail is tried, so `202` means it is kept whatever `mail` says: `sent`, `failed`, or `not_configured` when this cloud has no feedback address. At most 10 messages per developer per hour; the 11th answers `429 rate_limited` with `retry_after_ms`. Replies come by mail, to the sender's address."
6370
6370
  },
6371
+ {
6372
+ "method": "GET",
6373
+ "path": "/api/org/plan",
6374
+ "section": "org",
6375
+ "summary": "Reads the org's plan: its limits, its usage against them, its add-ons and any change already queued.",
6376
+ "audience": "developer",
6377
+ "auth": "developer",
6378
+ "rateLimited": false,
6379
+ "ownerTier": false,
6380
+ "status": 200,
6381
+ "params": [],
6382
+ "query": null,
6383
+ "request": null,
6384
+ "response": "org-plan",
6385
+ "errors": [
6386
+ "unauthorized",
6387
+ "token_expired",
6388
+ "token_revoked"
6389
+ ],
6390
+ "transport": "http",
6391
+ "notes": "The one read the console's Plan & billing page, its usage and limit gauges, and every upgrade prompt and feature gate draw from — nothing else computes `limits` or `usage` on its own. `limits` is already the effective ceiling, the catalogue row raised by `addons` or replaced by an operator's override, so a consumer never recomputes it from the catalogue. `usage` is counted fresh on every call, never cached. `switch` is present only for an organization still on the beta that has not yet landed on a priced plan."
6392
+ },
6393
+ {
6394
+ "method": "PUT",
6395
+ "path": "/api/org/plan/change",
6396
+ "section": "org",
6397
+ "summary": "Moves the org's plan down — a lower plan or a cancellation to Basic — queuing the change rather than applying it at once.",
6398
+ "audience": "developer",
6399
+ "auth": "developer",
6400
+ "rateLimited": false,
6401
+ "ownerTier": true,
6402
+ "status": 200,
6403
+ "params": [],
6404
+ "query": null,
6405
+ "request": "plan-change-request",
6406
+ "response": "org-plan",
6407
+ "errors": [
6408
+ "unauthorized",
6409
+ "token_expired",
6410
+ "token_revoked",
6411
+ "tier_required",
6412
+ "validation_error",
6413
+ "plan_limit",
6414
+ "target_state_conflict"
6415
+ ],
6416
+ "transport": "http",
6417
+ "notes": "Owner tier, and **downward only**: this route moves the org to a lower plan or cancels it outright to Basic. It never moves the org up — until payment exists, an upgrade or an add-on is not this route's job at all, and is handled today as a Feedback request that Fleetless then applies through the admin route. `409 target_state_conflict` names `target_plan` with rule `not_lower` when the chosen plan is not below the org's current one; with rule `locked_basic_only` when the org is locked (`orgLock`) and the chosen plan is anything but Basic; and with rule `migration_basic_only` when the org is still on the beta, awaiting the switch to priced plans, and the chosen plan is anything but Basic — that choice is exactly what the org lands on at the switch. An owner is never named in `keep` and always stays, but still counts against the target plan's `seats`; `409 plan_limit` names `seats` when the owners alone already exceed it, and names whichever other limit `keep` still exceeds otherwise. `keep` is `null` when the org's current usage already fits the target plan outright and nothing is deleted; named, it lists exactly the robots, apps, app users and developers that stay. The choice is stored as `pending_change` and takes effect at `period_ends_at` — **everything of the chosen kind not named in `keep` is deleted at that instant, never before** — except a choice made while the org is locked, which takes effect at once, and a beta org's choice, which takes effect at the switch date instead. Anything created while the choice is pending is checked against the target plan too and, when it passes, is folded into `keep`, so exactly what the confirmation counted is what is actually deleted. A later `PUT` replaces a still-pending choice outright."
6418
+ },
6419
+ {
6420
+ "method": "DELETE",
6421
+ "path": "/api/org/plan/change",
6422
+ "section": "org",
6423
+ "summary": "Withdraws a plan change that was queued but has not taken effect yet.",
6424
+ "audience": "developer",
6425
+ "auth": "developer",
6426
+ "rateLimited": false,
6427
+ "ownerTier": true,
6428
+ "status": 204,
6429
+ "params": [],
6430
+ "query": null,
6431
+ "request": null,
6432
+ "response": null,
6433
+ "errors": [
6434
+ "unauthorized",
6435
+ "token_expired",
6436
+ "token_revoked",
6437
+ "tier_required",
6438
+ "not_found"
6439
+ ],
6440
+ "transport": "http",
6441
+ "notes": "Owner tier. `404 not_found` when the org has no `pending_change` to withdraw. The org stays on its current plan, unchanged, as if the choice had never been made; a developer who wants a different one sends a new `PUT`, which would have replaced this one outright anyway."
6442
+ },
6443
+ {
6444
+ "method": "PATCH",
6445
+ "path": "/api/admin/orgs/:id/plan",
6446
+ "section": "org",
6447
+ "summary": "Changes an org's plan, add-ons, limit overrides, currency or billing period as the operator.",
6448
+ "audience": "internal",
6449
+ "auth": "ops",
6450
+ "rateLimited": true,
6451
+ "ownerTier": false,
6452
+ "status": 200,
6453
+ "params": [
6454
+ {
6455
+ "name": "id",
6456
+ "description": "The org's uuid, whose plan, add-ons or overrides the operator is changing."
6457
+ }
6458
+ ],
6459
+ "query": null,
6460
+ "request": "admin-plan-change-request",
6461
+ "response": "org-plan",
6462
+ "errors": [
6463
+ "unauthorized",
6464
+ "not_found",
6465
+ "validation_error",
6466
+ "plan_limit",
6467
+ "rate_limited"
6468
+ ],
6469
+ "transport": "http",
6470
+ "notes": "Every public host answers `404 not_found` for every `/api/admin/*` path — this route is reachable only on the cloud's private address — and that same address answers `404` here too while `OPS_API_TOKEN` is not configured, so a door with no key behind it reads exactly like one nobody opened. An unknown `:id` is the same `404`. Applies at once, never queued as a `pending_change`, and only when the org's current usage fits the result: `409 plan_limit` when a lower plan, a lowered override or a removed add-on would leave the org over a limit — the operator never deletes an org's things, only the owner's own choice does. On success it also withdraws any `pending_change`, ends a beta org's wait for the switch and lifts a lock. Audited as `org.plan_changed` with the `fleetless` actor, never a developer's — the row names what an operator did, not who in the org asked for it."
6471
+ },
6371
6472
  {
6372
6473
  "method": "POST",
6373
6474
  "path": "/api/bridge/assets",
@@ -0,0 +1,81 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "type": "object",
4
+ "properties": {
5
+ "key": {
6
+ "type": "string",
7
+ "enum": [
8
+ "seats",
9
+ "robots",
10
+ "apps",
11
+ "app_user_packs",
12
+ "live_video_packs"
13
+ ],
14
+ "description": "The add-on."
15
+ },
16
+ "raises": {
17
+ "type": "string",
18
+ "enum": [
19
+ "seats",
20
+ "robots",
21
+ "apps",
22
+ "app_users",
23
+ "live_video_ms_per_month",
24
+ "asset_bytes_per_robot",
25
+ "history_days",
26
+ "audit_days"
27
+ ],
28
+ "description": "The plan limit this add-on raises."
29
+ },
30
+ "per_unit": {
31
+ "type": "integer",
32
+ "exclusiveMinimum": 0,
33
+ "maximum": 9007199254740991,
34
+ "description": "How much one unit of this add-on raises `raises` by."
35
+ },
36
+ "prices": {
37
+ "type": "object",
38
+ "properties": {
39
+ "eur_month": {
40
+ "type": "integer",
41
+ "minimum": 0,
42
+ "maximum": 9007199254740991,
43
+ "description": "Per month in euro cents, excluding VAT."
44
+ },
45
+ "usd_month": {
46
+ "type": "integer",
47
+ "minimum": 0,
48
+ "maximum": 9007199254740991,
49
+ "description": "Per month in US dollar cents, excluding VAT: the euro price × 1.15, rounded up to a whole dollar."
50
+ },
51
+ "eur_year": {
52
+ "type": "integer",
53
+ "minimum": 0,
54
+ "maximum": 9007199254740991,
55
+ "description": "Per year in euro cents, excluding VAT: twelve months less 15 %."
56
+ },
57
+ "usd_year": {
58
+ "type": "integer",
59
+ "minimum": 0,
60
+ "maximum": 9007199254740991,
61
+ "description": "Per year in US dollar cents, excluding VAT: the yearly euro price × 1.15, rounded up to a whole dollar."
62
+ }
63
+ },
64
+ "required": [
65
+ "eur_month",
66
+ "usd_month",
67
+ "eur_year",
68
+ "usd_year"
69
+ ],
70
+ "additionalProperties": false,
71
+ "description": "The price of one unit."
72
+ }
73
+ },
74
+ "required": [
75
+ "key",
76
+ "raises",
77
+ "per_unit",
78
+ "prices"
79
+ ],
80
+ "additionalProperties": false
81
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "type": "string",
4
+ "enum": [
5
+ "seats",
6
+ "robots",
7
+ "apps",
8
+ "app_user_packs",
9
+ "live_video_packs"
10
+ ]
11
+ }
@@ -0,0 +1,189 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "type": "object",
4
+ "properties": {
5
+ "plan": {
6
+ "type": "string",
7
+ "enum": [
8
+ "basic",
9
+ "plus",
10
+ "pro",
11
+ "enterprise"
12
+ ],
13
+ "description": "The plan the org is on after this request."
14
+ },
15
+ "addons": {
16
+ "description": "Add-on counts to set. Counts not named stay as they are.",
17
+ "type": "object",
18
+ "properties": {
19
+ "seats": {
20
+ "type": "integer",
21
+ "minimum": 0,
22
+ "maximum": 9007199254740991,
23
+ "description": "Extra developer seats, one each."
24
+ },
25
+ "robots": {
26
+ "type": "integer",
27
+ "minimum": 0,
28
+ "maximum": 9007199254740991,
29
+ "description": "Extra robots, one each."
30
+ },
31
+ "apps": {
32
+ "type": "integer",
33
+ "minimum": 0,
34
+ "maximum": 9007199254740991,
35
+ "description": "Extra apps, one each."
36
+ },
37
+ "app_user_packs": {
38
+ "type": "integer",
39
+ "minimum": 0,
40
+ "maximum": 9007199254740991,
41
+ "description": "Packs of five extra app users."
42
+ },
43
+ "live_video_packs": {
44
+ "type": "integer",
45
+ "minimum": 0,
46
+ "maximum": 9007199254740991,
47
+ "description": "Packs of 250 extra hours of app-user live video per month."
48
+ }
49
+ },
50
+ "additionalProperties": false
51
+ },
52
+ "overrides": {
53
+ "description": "Limits to override. `null` clears an override.",
54
+ "type": "object",
55
+ "properties": {
56
+ "seats": {
57
+ "description": "Replaces the plan's `seats`. `null` clears the override.",
58
+ "anyOf": [
59
+ {
60
+ "type": "integer",
61
+ "exclusiveMinimum": 0,
62
+ "maximum": 9007199254740991
63
+ },
64
+ {
65
+ "type": "null"
66
+ }
67
+ ]
68
+ },
69
+ "robots": {
70
+ "description": "Replaces the plan's `robots`. `null` clears the override.",
71
+ "anyOf": [
72
+ {
73
+ "type": "integer",
74
+ "exclusiveMinimum": 0,
75
+ "maximum": 9007199254740991
76
+ },
77
+ {
78
+ "type": "null"
79
+ }
80
+ ]
81
+ },
82
+ "apps": {
83
+ "description": "Replaces the plan's `apps`. `null` clears the override.",
84
+ "anyOf": [
85
+ {
86
+ "type": "integer",
87
+ "exclusiveMinimum": 0,
88
+ "maximum": 9007199254740991
89
+ },
90
+ {
91
+ "type": "null"
92
+ }
93
+ ]
94
+ },
95
+ "app_users": {
96
+ "description": "Replaces the plan's `app_users`. `null` clears the override.",
97
+ "anyOf": [
98
+ {
99
+ "type": "integer",
100
+ "exclusiveMinimum": 0,
101
+ "maximum": 9007199254740991
102
+ },
103
+ {
104
+ "type": "null"
105
+ }
106
+ ]
107
+ },
108
+ "live_video_ms_per_month": {
109
+ "description": "Replaces the plan's `live_video_ms_per_month`. `null` clears the override.",
110
+ "anyOf": [
111
+ {
112
+ "type": "integer",
113
+ "exclusiveMinimum": 0,
114
+ "maximum": 9007199254740991
115
+ },
116
+ {
117
+ "type": "null"
118
+ }
119
+ ]
120
+ },
121
+ "asset_bytes_per_robot": {
122
+ "description": "Replaces the plan's `asset_bytes_per_robot`. `null` clears the override.",
123
+ "anyOf": [
124
+ {
125
+ "type": "integer",
126
+ "exclusiveMinimum": 0,
127
+ "maximum": 9007199254740991
128
+ },
129
+ {
130
+ "type": "null"
131
+ }
132
+ ]
133
+ },
134
+ "history_days": {
135
+ "description": "Replaces the plan's `history_days`. `null` clears the override.",
136
+ "anyOf": [
137
+ {
138
+ "type": "integer",
139
+ "exclusiveMinimum": 0,
140
+ "maximum": 9007199254740991
141
+ },
142
+ {
143
+ "type": "null"
144
+ }
145
+ ]
146
+ },
147
+ "audit_days": {
148
+ "description": "Replaces the plan's `audit_days`. `null` clears the override.",
149
+ "anyOf": [
150
+ {
151
+ "type": "integer",
152
+ "exclusiveMinimum": 0,
153
+ "maximum": 9007199254740991
154
+ },
155
+ {
156
+ "type": "null"
157
+ }
158
+ ]
159
+ }
160
+ },
161
+ "additionalProperties": false
162
+ },
163
+ "currency": {
164
+ "description": "The currency the org is billed in.",
165
+ "type": "string",
166
+ "enum": [
167
+ "eur",
168
+ "usd"
169
+ ]
170
+ },
171
+ "period_ends_at": {
172
+ "description": "The end of the org's billing period. `null` falls back to the end of the current UTC month.",
173
+ "anyOf": [
174
+ {
175
+ "type": "string",
176
+ "format": "date-time",
177
+ "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
178
+ },
179
+ {
180
+ "type": "null"
181
+ }
182
+ ]
183
+ }
184
+ },
185
+ "required": [
186
+ "plan"
187
+ ],
188
+ "additionalProperties": false
189
+ }
@@ -0,0 +1,115 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "type": "object",
4
+ "properties": {
5
+ "limit": {
6
+ "type": "string",
7
+ "enum": [
8
+ "seats",
9
+ "robots",
10
+ "apps",
11
+ "app_users",
12
+ "live_video_ms_per_month",
13
+ "asset_bytes_per_robot"
14
+ ],
15
+ "description": "The limit the action would exceed."
16
+ },
17
+ "used": {
18
+ "type": "integer",
19
+ "minimum": 0,
20
+ "maximum": 9007199254740991,
21
+ "description": "How much of the limit the org uses now."
22
+ },
23
+ "max": {
24
+ "type": "integer",
25
+ "minimum": 0,
26
+ "maximum": 9007199254740991,
27
+ "description": "The limit. For `asset_bytes_per_robot`, the org's whole pool: robots × the plan's bytes per robot."
28
+ },
29
+ "plan": {
30
+ "type": "string",
31
+ "enum": [
32
+ "basic",
33
+ "plus",
34
+ "pro",
35
+ "enterprise"
36
+ ],
37
+ "description": "The plan whose limit refused: the target plan while a move to a lower plan is pending."
38
+ },
39
+ "lifted_by": {
40
+ "type": "object",
41
+ "properties": {
42
+ "plan": {
43
+ "anyOf": [
44
+ {
45
+ "type": "string",
46
+ "enum": [
47
+ "basic",
48
+ "plus",
49
+ "pro",
50
+ "enterprise"
51
+ ]
52
+ },
53
+ {
54
+ "type": "null"
55
+ }
56
+ ],
57
+ "description": "The cheapest higher plan that raises this limit, or `null` when none does."
58
+ },
59
+ "addon": {
60
+ "anyOf": [
61
+ {
62
+ "type": "string",
63
+ "enum": [
64
+ "seats",
65
+ "robots",
66
+ "apps",
67
+ "app_user_packs",
68
+ "live_video_packs"
69
+ ]
70
+ },
71
+ {
72
+ "type": "null"
73
+ }
74
+ ],
75
+ "description": "The add-on that raises this limit, when the org's plan can buy add-ons; otherwise `null`."
76
+ }
77
+ },
78
+ "required": [
79
+ "plan",
80
+ "addon"
81
+ ],
82
+ "additionalProperties": false,
83
+ "description": "What would lift the limit."
84
+ },
85
+ "store_bytes": {
86
+ "type": "integer",
87
+ "exclusiveMinimum": 0,
88
+ "maximum": 9007199254740991,
89
+ "description": "The org's asset pool, in bytes: `robots × asset_bytes_per_robot`."
90
+ },
91
+ "used_bytes": {
92
+ "type": "integer",
93
+ "minimum": 0,
94
+ "maximum": 9007199254740991,
95
+ "description": "Bytes the org's assets occupy, across every robot, before this upload."
96
+ },
97
+ "size_bytes": {
98
+ "type": "integer",
99
+ "exclusiveMinimum": 0,
100
+ "maximum": 9007199254740991,
101
+ "description": "The refused upload, in bytes."
102
+ }
103
+ },
104
+ "required": [
105
+ "limit",
106
+ "used",
107
+ "max",
108
+ "plan",
109
+ "lifted_by",
110
+ "store_bytes",
111
+ "used_bytes",
112
+ "size_bytes"
113
+ ],
114
+ "additionalProperties": false
115
+ }
@@ -9,7 +9,8 @@
9
9
  "end_user",
10
10
  "app_user",
11
11
  "server_key",
12
- "bridge"
12
+ "bridge",
13
+ "fleetless"
13
14
  ]
14
15
  },
15
16
  "id": {
@@ -32,7 +32,8 @@
32
32
  "end_user",
33
33
  "app_user",
34
34
  "server_key",
35
- "bridge"
35
+ "bridge",
36
+ "fleetless"
36
37
  ]
37
38
  },
38
39
  "id": {
@@ -37,7 +37,8 @@
37
37
  "end_user",
38
38
  "app_user",
39
39
  "server_key",
40
- "bridge"
40
+ "bridge",
41
+ "fleetless"
41
42
  ]
42
43
  },
43
44
  "id": {
@@ -0,0 +1,44 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "type": "object",
4
+ "properties": {
5
+ "seats": {
6
+ "type": "integer",
7
+ "minimum": 0,
8
+ "maximum": 9007199254740991,
9
+ "description": "Extra developer seats, one each."
10
+ },
11
+ "robots": {
12
+ "type": "integer",
13
+ "minimum": 0,
14
+ "maximum": 9007199254740991,
15
+ "description": "Extra robots, one each."
16
+ },
17
+ "apps": {
18
+ "type": "integer",
19
+ "minimum": 0,
20
+ "maximum": 9007199254740991,
21
+ "description": "Extra apps, one each."
22
+ },
23
+ "app_user_packs": {
24
+ "type": "integer",
25
+ "minimum": 0,
26
+ "maximum": 9007199254740991,
27
+ "description": "Packs of five extra app users."
28
+ },
29
+ "live_video_packs": {
30
+ "type": "integer",
31
+ "minimum": 0,
32
+ "maximum": 9007199254740991,
33
+ "description": "Packs of 250 extra hours of app-user live video per month."
34
+ }
35
+ },
36
+ "required": [
37
+ "seats",
38
+ "robots",
39
+ "apps",
40
+ "app_user_packs",
41
+ "live_video_packs"
42
+ ],
43
+ "additionalProperties": false
44
+ }
@@ -0,0 +1,25 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "type": "object",
4
+ "properties": {
5
+ "reason": {
6
+ "type": "string",
7
+ "enum": [
8
+ "payment",
9
+ "migration"
10
+ ],
11
+ "description": "`payment`: a payment is missing. `migration`: the org did not choose what stays when the beta ended."
12
+ },
13
+ "since": {
14
+ "type": "string",
15
+ "format": "date-time",
16
+ "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
17
+ "description": "When the org was locked."
18
+ }
19
+ },
20
+ "required": [
21
+ "reason",
22
+ "since"
23
+ ],
24
+ "additionalProperties": false
25
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "type": "object",
4
+ "properties": {
5
+ "reason": {
6
+ "type": "string",
7
+ "enum": [
8
+ "payment",
9
+ "migration"
10
+ ],
11
+ "description": "`payment`: a payment is missing. `migration`: the org did not choose what stays when the beta ended."
12
+ }
13
+ },
14
+ "required": [
15
+ "reason"
16
+ ],
17
+ "additionalProperties": false
18
+ }
@@ -0,0 +1,51 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "type": "object",
4
+ "properties": {
5
+ "seats": {
6
+ "type": "integer",
7
+ "minimum": 0,
8
+ "maximum": 9007199254740991,
9
+ "description": "Developers, owners included, plus pending team invitations."
10
+ },
11
+ "robots": {
12
+ "type": "integer",
13
+ "minimum": 0,
14
+ "maximum": 9007199254740991,
15
+ "description": "Robots in the org."
16
+ },
17
+ "apps": {
18
+ "type": "integer",
19
+ "minimum": 0,
20
+ "maximum": 9007199254740991,
21
+ "description": "Apps in the org."
22
+ },
23
+ "app_users": {
24
+ "type": "integer",
25
+ "minimum": 0,
26
+ "maximum": 9007199254740991,
27
+ "description": "App users across every app, plus pending app-user invitations."
28
+ },
29
+ "live_video_ms_this_month": {
30
+ "type": "integer",
31
+ "minimum": 0,
32
+ "maximum": 9007199254740991,
33
+ "description": "Live video watched by app users in the current UTC calendar month, in milliseconds. Console sessions do not count."
34
+ },
35
+ "asset_bytes": {
36
+ "type": "integer",
37
+ "minimum": 0,
38
+ "maximum": 9007199254740991,
39
+ "description": "Bytes the assets of every robot of the org occupy, together."
40
+ }
41
+ },
42
+ "required": [
43
+ "seats",
44
+ "robots",
45
+ "apps",
46
+ "app_users",
47
+ "live_video_ms_this_month",
48
+ "asset_bytes"
49
+ ],
50
+ "additionalProperties": false
51
+ }