openvibers/openvibe.contracts Commits

Contracts 0.175.0: media.usage.recorded (per-zone hourly rollups), media.object.s3 lists multipart, ADR-031 interim host (#133)

OP OpenVibers committed 29 days ago · dbba086ecd · 52 files, +1203 −78

**`media.usage.recorded`** is Media's per-zone hourly rollups (ADR-031 section 8), as `common.usage-recorded@1`.

Every rollup names its zone twice:
- `resource`: the zone's OVRN, `ovrn:zone:<project>:object-zone/<zon_id>`;
- `dimension`: the zone id in lowercase.

The series:

| What | Capability | Unit |
|---|---|---|
| Stored bytes | `media.object.upload` | `byte_hours` (sampled each minute) |
| Writes | `media.object.upload`, `media.object.delete` | `requests` |
| Lists | `media.object.list` | `requests` |
| Reads | `media.object.read` | `requests` |
| Egress | `media.object.read` | `egress_bytes` |

Errors are mapped to `media.s3.<code>`.

**Changes:**
- **Catalog:** new event, first-party, ADR-014 like the other usage topics. Its payload `$ref`s the common rollup.
- **Manifests:** Media produces it; Network (project usage) and Zone (its usage view) consume it. `usage-topics` allows exactly those consumers.
- **`media.object.s3`** lists multipart uploads (Media#109): the operations, the limits, the routes. Copy and part copy still answer NotImplemented.
- **ADR-031:** the interim `s3.openvibe.network` host behind Cloudflare (HEAD forwarded as GET, Media#110, `private, no-store`), and "what v1 leaves out" brought up to date.
- **Fixtures:** valid `stored-byte-hours`, `reads-with-errors` and `egress` (revision 2); invalid `resource-of-a-person` and `carries-an-object-key`.

**Checks:** `npm test` passes all 19,996 checks. `compat.js v0.174.0` finds no breaking changes.

Changes

ddiff --git a/CHANGELOG.md b/CHANGELOG.md
iindex 954607d6..306a05af 100644
---- a/CHANGELOG.md
++++ b/CHANGELOG.md
@@@ -4,6 +4,21 @@ All notable changes to `openvibe-contracts`. Releases are git tags (`vX.Y.Z`) th
from `https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/<tag>`. Before v0.30.0,
the notes were in the tag and commit messages (`git tag -n1`).
++## 0.175.0 — 2026-10-15
++
++- **`media.usage.recorded`** (ADR-031 section 8): Media's per-zone hourly rollups (`common.usage-recorded@1`). Each one
++ names the zone twice: `resource` is its OVRN and `dimension` its id in lowercase. The series:
++ - stored bytes (`media.object.upload`, `byte_hours`);
++ - writes (`media.object.upload`, `media.object.delete`) and lists (`media.object.list`), each in `requests`;
++ - reads (`media.object.read`), in `requests` and `egress_bytes`.
++
++ Media produces it. Network (the project's usage) and Zone (its usage view) consume it.
++- **`media.object.s3`** lists multipart uploads (Media#109) and their routes. Copy and part copy still answer
++ NotImplemented.
++- **ADR-031:**
++ - the interim `s3.openvibe.network` host behind Cloudflare, where a HEAD forwarded as GET is served (Media#110);
++ - what v1 leaves out, now that multipart and the rollups exist.
++
## 0.174.0 — 2026-10-14
- **`browser`, a computer kind** (plan T14/T17 next step; OpenVibe.Node's computer plugin 0.5.0). `bot.command@1` takes
ddiff --git a/contracts/catalog.json b/contracts/catalog.json
iindex d245b72b..6713d1f8 100644
---- a/contracts/catalog.json
++++ b/contracts/catalog.json
@@@ -2389,6 +2389,16 @@
"status": "active",
"adr": "ADR-014"
},
++ {
++ "id": "media.usage.recorded",
++ "version": "1.0.0",
++ "owner": "media",
++ "schema": "events/payloads/media.usage.recorded.v1.json",
++ "visibility": "first-party",
++ "compatibility": "backward",
++ "status": "active",
++ "adr": "ADR-014"
++ },
{
"id": "live.stream.started",
"version": "1.0.0",
ddiff --git a/contracts/events/payloads/media.usage.recorded.v1.json b/contracts/events/payloads/media.usage.recorded.v1.json
nnew file mode 100644
iindex 00000000..f6516305
---- /dev/null
++++ b/contracts/events/payloads/media.usage.recorded.v1.json
@@@ -0,0 +1,7 @@
++{
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/events/payloads/media.usage.recorded.v1.json",
++ "title": "MediaUsageRecordedPayload",
++ "description": "media.usage.recorded v1 (ADR-031 amendment 2026-10-02, section 8). One closed hour of one zone's use on OpenVibe.Media's S3 surface: resource is the zone's OVRN (ovrn:zone:<project_id>:object-zone/<zon_id>) and dimension the zone id in lowercase, on every rollup. The series: stored bytes (media.object.upload, unit byte_hours: the live objects' bytes summed over the hour, sampled each minute), writes (media.object.upload and media.object.delete, unit requests), lists (media.object.list, unit requests), reads (media.object.read, unit requests) and egress (media.object.read, unit egress_bytes). errors counts the operations refused or failed in the hour, by S3 error code mapped to media.s3.<code>. Media counts as it answers and stores the rollup as its own event after the hour closes, in the same transaction that marks the hour sent; a corrected hour is re-sent with a higher revision. Rollups are counts for dashboards and quotas, never money. The payload is common.usage-recorded@1. Envelope: source media, subject { type: project, id: <project_id> }, visibility internal, priority low, actor service:media.",
++ "$ref": "../../common/usage-recorded.v1.json"
++}
ddiff --git a/docs/adr/ADR-031-s3-compatible-surface.md b/docs/adr/ADR-031-s3-compatible-surface.md
iindex 4fad4b90..0daca288 100644
---- a/docs/adr/ADR-031-s3-compatible-surface.md
++++ b/docs/adr/ADR-031-s3-compatible-surface.md
@@@ -292,8 +292,9 @@ A hold placed on an object of the zone after that check is still allowed: Media
- Zone serves its site and API on its apex, `https://openvibe.zone`.
- `s3.openvibe.media` and `api.openvibe.zone` wait for their DNS records. The DNS token expired, so creating them is the owner's action.
- The certificates already cover both names (wildcards).
++- Meanwhile Zone points people at `s3.openvibe.network`, which Cloudflare proxies. Cloudflare forwards a HEAD as a GET for paths it may cache, so Media serves a header-signed request that verifies only as HEAD as the GET (never a presigned URL; Media#110). Every S3 answer is `private, no-store`, so the edge never caches one.
**What v1 leaves out.**
--- Multipart uploads and CopyObject answer `NotImplemented`. Single-request objects go up to Media's single-upload limit.
++- CopyObject and UploadPartCopy answer `NotImplemented`. Multipart uploads work since 2026-10-15 (Media#109): parts of 256 MB and objects of 20 GB at most by default, and a single request goes up to Media's single-upload limit.
- Overwritten and deleted objects keep counting against a developer project's quota until they are purged. That is Media's existing rule for developer tenants; this ADR's "only live objects count" applies once Media changes that rule.
--- Per-zone usage rollups (`media.usage.recorded` with the zone's resource name) are not emitted yet. Zone shows Media's live snapshot.
++- Per-zone usage rollups are `media.usage.recorded` (contracts 0.175.0), with the series of section 8. Network adds them to the project's usage, and Zone sums them in its usage view beside Media's live snapshot.
ddiff --git a/fixtures/media.usage.recorded/invalid/carries-an-object-key.json b/fixtures/media.usage.recorded/invalid/carries-an-object-key.json
nnew file mode 100644
iindex 00000000..f95e0fd9
---- /dev/null
++++ b/fixtures/media.usage.recorded/invalid/carries-an-object-key.json
@@@ -0,0 +1,14 @@
++{
++ "project_id": "prj_01JAB2C3D4E5F6G7H8J9K0MNPQ",
++ "env": "production",
++ "resource": "ovrn:zone:prj_01JAB2C3D4E5F6G7H8J9K0MNPQ:object-zone/zon_01JAB2C3D4E5F6G7H8J9K0MNPR",
++ "dimension": "zon_01jab2c3d4e5f6g7h8j9k0mnpr",
++ "window": "hour",
++ "window_start": "2026-10-15T10:00:00.000Z",
++ "window_end": "2026-10-15T11:00:00.000Z",
++ "capability": "media.object.upload",
++ "unit": "requests",
++ "quantity": 1,
++ "errors": 0,
++ "object_key": "photos/me.jpg"
++}
ddiff --git a/fixtures/media.usage.recorded/invalid/resource-of-a-person.json b/fixtures/media.usage.recorded/invalid/resource-of-a-person.json
nnew file mode 100644
iindex 00000000..86a0a127
---- /dev/null
++++ b/fixtures/media.usage.recorded/invalid/resource-of-a-person.json
@@@ -0,0 +1,13 @@
++{
++ "project_id": "prj_01JAB2C3D4E5F6G7H8J9K0MNPQ",
++ "env": "production",
++ "resource": "ovrn:network:prj_01JAB2C3D4E5F6G7H8J9K0MNPQ:account/usr_01JAB2C3D4E5F6G7H8J9K0MNPS",
++ "dimension": "zon_01jab2c3d4e5f6g7h8j9k0mnpr",
++ "window": "hour",
++ "window_start": "2026-10-15T10:00:00.000Z",
++ "window_end": "2026-10-15T11:00:00.000Z",
++ "capability": "media.object.read",
++ "unit": "requests",
++ "quantity": 1,
++ "errors": 0
++}
ddiff --git a/fixtures/media.usage.recorded/valid/egress.json b/fixtures/media.usage.recorded/valid/egress.json
nnew file mode 100644
iindex 00000000..5b102b33
---- /dev/null
++++ b/fixtures/media.usage.recorded/valid/egress.json
@@@ -0,0 +1,14 @@
++{
++ "project_id": "prj_01JAB2C3D4E5F6G7H8J9K0MNPQ",
++ "env": "production",
++ "resource": "ovrn:zone:prj_01JAB2C3D4E5F6G7H8J9K0MNPQ:object-zone/zon_01JAB2C3D4E5F6G7H8J9K0MNPR",
++ "dimension": "zon_01jab2c3d4e5f6g7h8j9k0mnpr",
++ "window": "hour",
++ "window_start": "2026-10-15T10:00:00.000Z",
++ "window_end": "2026-10-15T11:00:00.000Z",
++ "capability": "media.object.read",
++ "unit": "egress_bytes",
++ "quantity": 104857600,
++ "errors": 0,
++ "revision": 2
++}
ddiff --git a/fixtures/media.usage.recorded/valid/reads-with-errors.json b/fixtures/media.usage.recorded/valid/reads-with-errors.json
nnew file mode 100644
iindex 00000000..6fb8f13a
---- /dev/null
++++ b/fixtures/media.usage.recorded/valid/reads-with-errors.json
@@@ -0,0 +1,24 @@
++{
++ "project_id": "prj_01JAB2C3D4E5F6G7H8J9K0MNPQ",
++ "env": "production",
++ "resource": "ovrn:zone:prj_01JAB2C3D4E5F6G7H8J9K0MNPQ:object-zone/zon_01JAB2C3D4E5F6G7H8J9K0MNPR",
++ "dimension": "zon_01jab2c3d4e5f6g7h8j9k0mnpr",
++ "window": "hour",
++ "window_start": "2026-10-15T10:00:00.000Z",
++ "window_end": "2026-10-15T11:00:00.000Z",
++ "capability": "media.object.read",
++ "unit": "requests",
++ "quantity": 420,
++ "errors": 3,
++ "error_codes": {
++ "media.s3.no_such_key": 2,
++ "media.s3.access_denied": 1
++ },
++ "samples": [
++ {
++ "at": "2026-10-15T10:42:10.000Z",
++ "code": "media.s3.no_such_key",
++ "status": 404
++ }
++ ]
++}
ddiff --git a/fixtures/media.usage.recorded/valid/stored-byte-hours.json b/fixtures/media.usage.recorded/valid/stored-byte-hours.json
nnew file mode 100644
iindex 00000000..080b19bd
---- /dev/null
++++ b/fixtures/media.usage.recorded/valid/stored-byte-hours.json
@@@ -0,0 +1,13 @@
++{
++ "project_id": "prj_01JAB2C3D4E5F6G7H8J9K0MNPQ",
++ "env": "production",
++ "resource": "ovrn:zone:prj_01JAB2C3D4E5F6G7H8J9K0MNPQ:object-zone/zon_01JAB2C3D4E5F6G7H8J9K0MNPR",
++ "dimension": "zon_01jab2c3d4e5f6g7h8j9k0mnpr",
++ "window": "hour",
++ "window_start": "2026-10-15T10:00:00.000Z",
++ "window_end": "2026-10-15T11:00:00.000Z",
++ "capability": "media.object.upload",
++ "unit": "byte_hours",
++ "quantity": 5368709120,
++ "errors": 0
++}
ddiff --git a/generated/json-schema/bundle.json b/generated/json-schema/bundle.json
iindex e2f8fa39..51ea9041 100644
---- a/generated/json-schema/bundle.json
++++ b/generated/json-schema/bundle.json
@@@ -25472,6 +25472,18 @@
"$ref": "../../common/usage-recorded.v1.json"
}
},
++ "media.usage.recorded": {
++ "version": "1.0.0",
++ "owner": "media",
++ "status": "active",
++ "schema": {
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/events/payloads/media.usage.recorded.v1.json",
++ "title": "MediaUsageRecordedPayload",
++ "description": "media.usage.recorded v1 (ADR-031 amendment 2026-10-02, section 8). One closed hour of one zone's use on OpenVibe.Media's S3 surface: resource is the zone's OVRN (ovrn:zone:<project_id>:object-zone/<zon_id>) and dimension the zone id in lowercase, on every rollup. The series: stored bytes (media.object.upload, unit byte_hours: the live objects' bytes summed over the hour, sampled each minute), writes (media.object.upload and media.object.delete, unit requests), lists (media.object.list, unit requests), reads (media.object.read, unit requests) and egress (media.object.read, unit egress_bytes). errors counts the operations refused or failed in the hour, by S3 error code mapped to media.s3.<code>. Media counts as it answers and stores the rollup as its own event after the hour closes, in the same transaction that marks the hour sent; a corrected hour is re-sent with a higher revision. Rollups are counts for dashboards and quotas, never money. The payload is common.usage-recorded@1. Envelope: source media, subject { type: project, id: <project_id> }, visibility internal, priority low, actor service:media.",
++ "$ref": "../../common/usage-recorded.v1.json"
++ }
++ },
"live.stream.started": {
"version": "1.0.0",
"owner": "live",
ddiff --git a/generated/openapi/actor.json b/generated/openapi/actor.json
iindex 60573d93..c8fbc119 100644
---- a/generated/openapi/actor.json
++++ b/generated/openapi/actor.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Actor API",
-- "version": "0.174.0",
-- "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.174.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.175.0",
++ "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.175.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/ai.json b/generated/openapi/ai.json
iindex 7ebf6ef4..618fd90f 100644
---- a/generated/openapi/ai.json
++++ b/generated/openapi/ai.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.AI API",
-- "version": "0.174.0",
-- "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.174.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.175.0",
++ "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.175.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/billing.json b/generated/openapi/billing.json
iindex 09b513f2..556a9e78 100644
---- a/generated/openapi/billing.json
++++ b/generated/openapi/billing.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Billing API",
-- "version": "0.174.0",
-- "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.174.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.175.0",
++ "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.175.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/blog.json b/generated/openapi/blog.json
iindex 3c9eec31..bf2a2a10 100644
---- a/generated/openapi/blog.json
++++ b/generated/openapi/blog.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Blog API",
-- "version": "0.174.0",
-- "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.174.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.175.0",
++ "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.175.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/bot.json b/generated/openapi/bot.json
iindex 4cdba2f9..4de68ded 100644
---- a/generated/openapi/bot.json
++++ b/generated/openapi/bot.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Bot API",
-- "version": "0.174.0",
-- "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.174.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.175.0",
++ "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.175.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/chat.json b/generated/openapi/chat.json
iindex da91371a..0000f7c8 100644
---- a/generated/openapi/chat.json
++++ b/generated/openapi/chat.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Chat API",
-- "version": "0.174.0",
-- "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.174.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.175.0",
++ "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.175.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/codes.json b/generated/openapi/codes.json
iindex d49375b1..7f3862c2 100644
---- a/generated/openapi/codes.json
++++ b/generated/openapi/codes.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Codes API",
-- "version": "0.174.0",
-- "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.174.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.175.0",
++ "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.175.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/community.json b/generated/openapi/community.json
iindex abaec8eb..9f9d2431 100644
---- a/generated/openapi/community.json
++++ b/generated/openapi/community.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Community API",
-- "version": "0.174.0",
-- "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.174.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.175.0",
++ "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.175.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/coupons.json b/generated/openapi/coupons.json
iindex 15535f82..99e7ed23 100644
---- a/generated/openapi/coupons.json
++++ b/generated/openapi/coupons.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Coupons API",
-- "version": "0.174.0",
-- "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.174.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.175.0",
++ "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.175.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/deals.json b/generated/openapi/deals.json
iindex 71994cf0..bfbeb5c4 100644
---- a/generated/openapi/deals.json
++++ b/generated/openapi/deals.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Deals API",
-- "version": "0.174.0",
-- "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.174.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.175.0",
++ "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.175.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/events.json b/generated/openapi/events.json
iindex a62b05ba..dbb64eed 100644
---- a/generated/openapi/events.json
++++ b/generated/openapi/events.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Events API",
-- "version": "0.174.0",
-- "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.174.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.175.0",
++ "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.175.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/food.json b/generated/openapi/food.json
iindex 520e71aa..03858098 100644
---- a/generated/openapi/food.json
++++ b/generated/openapi/food.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Food API",
-- "version": "0.174.0",
-- "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.174.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.175.0",
++ "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.175.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/games.json b/generated/openapi/games.json
iindex 012e2925..72a36c55 100644
---- a/generated/openapi/games.json
++++ b/generated/openapi/games.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Games API",
-- "version": "0.174.0",
-- "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.174.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.175.0",
++ "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.175.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/host.json b/generated/openapi/host.json
iindex 5e8ec55d..1bdbdda0 100644
---- a/generated/openapi/host.json
++++ b/generated/openapi/host.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Host API",
-- "version": "0.174.0",
-- "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.174.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.175.0",
++ "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.175.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/inventory.json b/generated/openapi/inventory.json
iindex 00e9fd01..9d20abea 100644
---- a/generated/openapi/inventory.json
++++ b/generated/openapi/inventory.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Inventory API",
-- "version": "0.174.0",
-- "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.174.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.175.0",
++ "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.175.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/live.json b/generated/openapi/live.json
iindex 4a205b87..f5cf7911 100644
---- a/generated/openapi/live.json
++++ b/generated/openapi/live.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Live API",
-- "version": "0.174.0",
-- "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.174.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.175.0",
++ "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.175.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/media-hub.json b/generated/openapi/media-hub.json
iindex 92b31eff..49224856 100644
---- a/generated/openapi/media-hub.json
++++ b/generated/openapi/media-hub.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.MediaHub API",
-- "version": "0.174.0",
-- "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.174.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.175.0",
++ "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.175.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/media.json b/generated/openapi/media.json
iindex d533aea0..918992ea 100644
---- a/generated/openapi/media.json
++++ b/generated/openapi/media.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Media API",
-- "version": "0.174.0",
-- "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.174.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.175.0",
++ "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.175.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
@@@ -2596,6 +2596,30 @@
{
"capability": "media.object.s3",
"binding": "DELETE s3:/:zone/:key"
++ },
++ {
++ "capability": "media.object.s3",
++ "binding": "POST s3:/:zone/:key?uploads"
++ },
++ {
++ "capability": "media.object.s3",
++ "binding": "PUT s3:/:zone/:key?partNumber&uploadId"
++ },
++ {
++ "capability": "media.object.s3",
++ "binding": "POST s3:/:zone/:key?uploadId"
++ },
++ {
++ "capability": "media.object.s3",
++ "binding": "DELETE s3:/:zone/:key?uploadId"
++ },
++ {
++ "capability": "media.object.s3",
++ "binding": "GET s3:/:zone/:key?uploadId"
++ },
++ {
++ "capability": "media.object.s3",
++ "binding": "GET s3:/:zone?uploads"
}
]
}
ddiff --git a/generated/openapi/network.json b/generated/openapi/network.json
iindex 726c6946..2e389291 100644
---- a/generated/openapi/network.json
++++ b/generated/openapi/network.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Network API",
-- "version": "0.174.0",
-- "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.174.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.175.0",
++ "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.175.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/news.json b/generated/openapi/news.json
iindex 1cb15e80..09de693b 100644
---- a/generated/openapi/news.json
++++ b/generated/openapi/news.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.News API",
-- "version": "0.174.0",
-- "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.174.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.175.0",
++ "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.175.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/openre.json b/generated/openapi/openre.json
iindex e7993643..814f406e 100644
---- a/generated/openapi/openre.json
++++ b/generated/openapi/openre.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenRestream API",
-- "version": "0.174.0",
-- "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.174.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.175.0",
++ "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.175.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/play.json b/generated/openapi/play.json
iindex cf84bb8a..17228d08 100644
---- a/generated/openapi/play.json
++++ b/generated/openapi/play.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Play API",
-- "version": "0.174.0",
-- "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.174.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.175.0",
++ "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.175.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/reviews.json b/generated/openapi/reviews.json
iindex 85356065..d5282f30 100644
---- a/generated/openapi/reviews.json
++++ b/generated/openapi/reviews.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Reviews API",
-- "version": "0.174.0",
-- "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.174.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.175.0",
++ "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.175.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/run.json b/generated/openapi/run.json
iindex 5a201e38..0c21f0cd 100644
---- a/generated/openapi/run.json
++++ b/generated/openapi/run.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Run API",
-- "version": "0.174.0",
-- "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.174.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.175.0",
++ "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.175.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/search.json b/generated/openapi/search.json
iindex 78559582..368f1743 100644
---- a/generated/openapi/search.json
++++ b/generated/openapi/search.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Search API",
-- "version": "0.174.0",
-- "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.174.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.175.0",
++ "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.175.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/services.json b/generated/openapi/services.json
iindex 10dee983..98546770 100644
---- a/generated/openapi/services.json
++++ b/generated/openapi/services.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Services API",
-- "version": "0.174.0",
-- "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.174.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.175.0",
++ "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.175.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/sources.json b/generated/openapi/sources.json
iindex a9ac6ebb..5c22ac52 100644
---- a/generated/openapi/sources.json
++++ b/generated/openapi/sources.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Sources API",
-- "version": "0.174.0",
-- "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.174.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.175.0",
++ "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.175.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/space.json b/generated/openapi/space.json
iindex 75c622d5..e0d1cc05 100644
---- a/generated/openapi/space.json
++++ b/generated/openapi/space.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Space API",
-- "version": "0.174.0",
-- "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.174.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.175.0",
++ "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.175.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/tips.json b/generated/openapi/tips.json
iindex 0c29f210..a453caa3 100644
---- a/generated/openapi/tips.json
++++ b/generated/openapi/tips.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Tips API",
-- "version": "0.174.0",
-- "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.174.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.175.0",
++ "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.175.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/tools.json b/generated/openapi/tools.json
iindex bc53f108..a787d6f6 100644
---- a/generated/openapi/tools.json
++++ b/generated/openapi/tools.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Tools API",
-- "version": "0.174.0",
-- "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.174.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.175.0",
++ "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.175.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/trade.json b/generated/openapi/trade.json
iindex 58742d88..0fcdf017 100644
---- a/generated/openapi/trade.json
++++ b/generated/openapi/trade.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Trade API",
-- "version": "0.174.0",
-- "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.174.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.175.0",
++ "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.175.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/vip.json b/generated/openapi/vip.json
iindex 2da2c125..f9e2932d 100644
---- a/generated/openapi/vip.json
++++ b/generated/openapi/vip.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.VIP API",
-- "version": "0.174.0",
-- "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.174.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.175.0",
++ "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.175.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/watch.json b/generated/openapi/watch.json
iindex 4cdf4e8a..87941d1e 100644
---- a/generated/openapi/watch.json
++++ b/generated/openapi/watch.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Watch API",
-- "version": "0.174.0",
-- "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.174.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.175.0",
++ "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.175.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/wiki.json b/generated/openapi/wiki.json
iindex 3677f973..cce66952 100644
---- a/generated/openapi/wiki.json
++++ b/generated/openapi/wiki.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Wiki API",
-- "version": "0.174.0",
-- "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.174.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.175.0",
++ "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.175.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/work.json b/generated/openapi/work.json
iindex bb8ced84..c0a2cef2 100644
---- a/generated/openapi/work.json
++++ b/generated/openapi/work.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Work API",
-- "version": "0.174.0",
-- "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.174.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.175.0",
++ "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.175.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/zone.json b/generated/openapi/zone.json
iindex 1e359664..b322f09c 100644
---- a/generated/openapi/zone.json
++++ b/generated/openapi/zone.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Zone API",
-- "version": "0.174.0",
-- "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.174.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.175.0",
++ "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.175.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/typescript/index.d.ts b/generated/typescript/index.d.ts
iindex 8bf70c58..11d4a4d6 100644
---- a/generated/typescript/index.d.ts
++++ b/generated/typescript/index.d.ts
@@@ -146880,6 +146880,974 @@ export interface EventsUsageRecordedPayload {
revision?: number;
}
++/** [email protected] (owner: media) */
++/**
++ * media.usage.recorded v1 (ADR-031 amendment 2026-10-02, section 8). One closed hour of one zone's use on OpenVibe.Media's S3 surface: resource is the zone's OVRN (ovrn:zone:<project_id>:object-zone/<zon_id>) and dimension the zone id in lowercase, on every rollup. The series: stored bytes (media.object.upload, unit byte_hours: the live objects' bytes summed over the hour, sampled each minute), writes (media.object.upload and media.object.delete, unit requests), lists (media.object.list, unit requests), reads (media.object.read, unit requests) and egress (media.object.read, unit egress_bytes). errors counts the operations refused or failed in the hour, by S3 error code mapped to media.s3.<code>. Media counts as it answers and stores the rollup as its own event after the hour closes, in the same transaction that marks the hour sent; a corrected hour is re-sent with a higher revision. Rollups are counts for dashboards and quotas, never money. The payload is common.usage-recorded@1. Envelope: source media, subject { type: project, id: <project_id> }, visibility internal, priority low, actor service:media.
++ */
++export interface MediaUsageRecordedPayload {
++ /**
++ * The developer project whose app token did the work.
++ */
++ project_id: string;
++ /**
++ * The environment of that app token.
++ */
++ env: "sandbox" | "production";
++ /**
++ * The capability the usage counts against: tools.job.create, tools.tool.run, events.app.publish, events.app.subscribe.
++ */
++ capability: string;
++ /**
++ * Optional finer key inside the capability, as the producer names it: a job type (img.process) or a tool id (image-resize). Never the id of a person, an app, a request or a job.
++ */
++ dimension?: string;
++ /**
++ * Optional resource name (ADR-034 section 2) of the project resource the usage counts against, so a dashboard or quota can group a count by resource (rollups are counts, never money; Billing never consumes them and rates only platform.usage-sample readings): ovrn:zone:<project_id>:object-zone/<zon_id> on Media's per-zone rollups (ADR-031 amendment 2026-10-02). Its project is project_id: a resource of another project is refused (contracts.usage.checkUsageRecorded). Added in 1.1.0. Never the resource name of a person, an app, a request or a job.
++ */
++ resource?: string;
++ /**
++ * What quantity counts (jobs, events, deliveries, requests, bytes, tokens): the same word a Network project quota uses for its unit.
++ */
++ unit: string;
++ /**
++ * The length of the window.
++ */
++ window: "hour" | "day";
++ /**
++ * UTC, on the hour (midnight for a day).
++ */
++ window_start: string;
++ /**
++ * window_start plus the window, exclusive.
++ */
++ window_end: string;
++ /**
++ * Units used in the window, by work that succeeded and work that failed alike.
++ */
++ quantity: number;
++ /**
++ * Operations in the window that failed or were refused: a job that failed, a publish refused with a problem, a webhook attempt without a 2xx. A refused operation may use no unit, so errors can exceed quantity.
++ */
++ errors: number;
++ /**
++ * The errors by problem code (at most 20 codes; the rest are only in errors).
++ */
++ error_codes?: {
++ [k: string]: number | undefined;
++ };
++ /**
++ * The last failures of the window, newest first, so a developer can find them in their own logs.
++ *
++ * @maxItems 10
++ */
++ samples?:
++ | []
++ | [
++ {
++ at: string;
++ code: string;
++ /**
++ * The HTTP status the failure was answered with, when there was one.
++ */
++ status?: number;
++ /**
++ * The W3C trace id of the request (or event) that failed.
++ */
++ trace_id?: string;
++ /**
++ * What failed, when the project can look it up with its own token: a job, an event, an AI run, a Media object. Never a subject.
++ */
++ ref?: string;
++ }
++ ]
++ | [
++ {
++ at: string;
++ code: string;
++ /**
++ * The HTTP status the failure was answered with, when there was one.
++ */
++ status?: number;
++ /**
++ * The W3C trace id of the request (or event) that failed.
++ */
++ trace_id?: string;
++ /**
++ * What failed, when the project can look it up with its own token: a job, an event, an AI run, a Media object. Never a subject.
++ */
++ ref?: string;
++ },
++ {
++ at: string;
++ code: string;
++ /**
++ * The HTTP status the failure was answered with, when there was one.
++ */
++ status?: number;
++ /**
++ * The W3C trace id of the request (or event) that failed.
++ */
++ trace_id?: string;
++ /**
++ * What failed, when the project can look it up with its own token: a job, an event, an AI run, a Media object. Never a subject.
++ */
++ ref?: string;
++ }
++ ]
++ | [
++ {
++ at: string;
++ code: string;
++ /**
++ * The HTTP status the failure was answered with, when there was one.
++ */
++ status?: number;
++ /**
++ * The W3C trace id of the request (or event) that failed.
++ */
++ trace_id?: string;
++ /**
++ * What failed, when the project can look it up with its own token: a job, an event, an AI run, a Media object. Never a subject.
++ */
++ ref?: string;
++ },
++ {
++ at: string;
++ code: string;
++ /**
++ * The HTTP status the failure was answered with, when there was one.
++ */
++ status?: number;
++ /**
++ * The W3C trace id of the request (or event) that failed.
++ */
++ trace_id?: string;
++ /**
++ * What failed, when the project can look it up with its own token: a job, an event, an AI run, a Media object. Never a subject.
++ */
++ ref?: string;
++ },
++ {
++ at: string;
++ code: string;
++ /**
++ * The HTTP status the failure was answered with, when there was one.
++ */
++ status?: number;
++ /**
++ * The W3C trace id of the request (or event) that failed.
++ */
++ trace_id?: string;
++ /**
++ * What failed, when the project can look it up with its own token: a job, an event, an AI run, a Media object. Never a subject.
++ */
++ ref?: string;
++ }
++ ]
++ | [
++ {
++ at: string;
++ code: string;
++ /**
++ * The HTTP status the failure was answered with, when there was one.
++ */
++ status?: number;
++ /**
++ * The W3C trace id of the request (or event) that failed.
++ */
++ trace_id?: string;
++ /**
++ * What failed, when the project can look it up with its own token: a job, an event, an AI run, a Media object. Never a subject.
++ */
++ ref?: string;
++ },
++ {
++ at: string;
++ code: string;
++ /**
++ * The HTTP status the failure was answered with, when there was one.
++ */
++ status?: number;
++ /**
++ * The W3C trace id of the request (or event) that failed.
++ */
++ trace_id?: string;
++ /**
++ * What failed, when the project can look it up with its own token: a job, an event, an AI run, a Media object. Never a subject.
++ */
++ ref?: string;
++ },
++ {
++ at: string;
++ code: string;
++ /**
++ * The HTTP status the failure was answered with, when there was one.
++ */
++ status?: number;
++ /**
++ * The W3C trace id of the request (or event) that failed.
++ */
++ trace_id?: string;
++ /**
++ * What failed, when the project can look it up with its own token: a job, an event, an AI run, a Media object. Never a subject.
++ */
++ ref?: string;
++ },
++ {
++ at: string;
++ code: string;
++ /**
++ * The HTTP status the failure was answered with, when there was one.
++ */
++ status?: number;
++ /**
++ * The W3C trace id of the request (or event) that failed.
++ */
++ trace_id?: string;
++ /**
++ * What failed, when the project can look it up with its own token: a job, an event, an AI run, a Media object. Never a subject.
++ */
++ ref?: string;
++ }
++ ]
++ | [
++ {
++ at: string;
++ code: string;
++ /**
++ * The HTTP status the failure was answered with, when there was one.
++ */
++ status?: number;
++ /**
++ * The W3C trace id of the request (or event) that failed.
++ */
++ trace_id?: string;
++ /**
++ * What failed, when the project can look it up with its own token: a job, an event, an AI run, a Media object. Never a subject.
++ */
++ ref?: string;
++ },
++ {
++ at: string;
++ code: string;
++ /**
++ * The HTTP status the failure was answered with, when there was one.
++ */
++ status?: number;
++ /**
++ * The W3C trace id of the request (or event) that failed.
++ */
++ trace_id?: string;
++ /**
++ * What failed, when the project can look it up with its own token: a job, an event, an AI run, a Media object. Never a subject.
++ */
++ ref?: string;
++ },
++ {
++ at: string;
++ code: string;
++ /**
++ * The HTTP status the failure was answered with, when there was one.
++ */
++ status?: number;
++ /**
++ * The W3C trace id of the request (or event) that failed.
++ */
++ trace_id?: string;
++ /**
++ * What failed, when the project can look it up with its own token: a job, an event, an AI run, a Media object. Never a subject.
++ */
++ ref?: string;
++ },
++ {
++ at: string;
++ code: string;
++ /**
++ * The HTTP status the failure was answered with, when there was one.
++ */
++ status?: number;
++ /**
++ * The W3C trace id of the request (or event) that failed.
++ */
++ trace_id?: string;
++ /**
++ * What failed, when the project can look it up with its own token: a job, an event, an AI run, a Media object. Never a subject.
++ */
++ ref?: string;
++ },
++ {
++ at: string;
++ code: string;
++ /**
++ * The HTTP status the failure was answered with, when there was one.
++ */
++ status?: number;
++ /**
++ * The W3C trace id of the request (or event) that failed.
++ */
++ trace_id?: string;
++ /**
++ * What failed, when the project can look it up with its own token: a job, an event, an AI run, a Media object. Never a subject.
++ */
++ ref?: string;
++ }
++ ]
++ | [
++ {
++ at: string;
++ code: string;
++ /**
++ * The HTTP status the failure was answered with, when there was one.
++ */
++ status?: number;
++ /**
++ * The W3C trace id of the request (or event) that failed.
++ */
++ trace_id?: string;
++ /**
++ * What failed, when the project can look it up with its own token: a job, an event, an AI run, a Media object. Never a subject.
++ */
++ ref?: string;
++ },
++ {
++ at: string;
++ code: string;
++ /**
++ * The HTTP status the failure was answered with, when there was one.
++ */
++ status?: number;
++ /**
++ * The W3C trace id of the request (or event) that failed.
++ */
++ trace_id?: string;
++ /**
++ * What failed, when the project can look it up with its own token: a job, an event, an AI run, a Media object. Never a subject.
++ */
++ ref?: string;
++ },
++ {
++ at: string;
++ code: string;
++ /**
++ * The HTTP status the failure was answered with, when there was one.
++ */
++ status?: number;
++ /**
++ * The W3C trace id of the request (or event) that failed.
++ */
++ trace_id?: string;
++ /**
++ * What failed, when the project can look it up with its own token: a job, an event, an AI run, a Media object. Never a subject.
++ */
++ ref?: string;
++ },
++ {
++ at: string;
++ code: string;
++ /**
++ * The HTTP status the failure was answered with, when there was one.
++ */
++ status?: number;
++ /**
++ * The W3C trace id of the request (or event) that failed.
++ */
++ trace_id?: string;
++ /**
++ * What failed, when the project can look it up with its own token: a job, an event, an AI run, a Media object. Never a subject.
++ */
++ ref?: string;
++ },
++ {
++ at: string;
++ code: string;
++ /**
++ * The HTTP status the failure was answered with, when there was one.
++ */
++ status?: number;
++ /**
++ * The W3C trace id of the request (or event) that failed.
++ */
++ trace_id?: string;
++ /**
++ * What failed, when the project can look it up with its own token: a job, an event, an AI run, a Media object. Never a subject.
++ */
++ ref?: string;
++ },
++ {
++ at: string;
++ code: string;
++ /**
++ * The HTTP status the failure was answered with, when there was one.
++ */
++ status?: number;
++ /**
++ * The W3C trace id of the request (or event) that failed.
++ */
++ trace_id?: string;
++ /**
++ * What failed, when the project can look it up with its own token: a job, an event, an AI run, a Media object. Never a subject.
++ */
++ ref?: string;
++ }
++ ]
++ | [
++ {
++ at: string;
++ code: string;
++ /**
++ * The HTTP status the failure was answered with, when there was one.
++ */
++ status?: number;
++ /**
++ * The W3C trace id of the request (or event) that failed.
++ */
++ trace_id?: string;
++ /**
++ * What failed, when the project can look it up with its own token: a job, an event, an AI run, a Media object. Never a subject.
++ */
++ ref?: string;
++ },
++ {
++ at: string;
++ code: string;
++ /**
++ * The HTTP status the failure was answered with, when there was one.
++ */
++ status?: number;
++ /**
++ * The W3C trace id of the request (or event) that failed.
++ */
++ trace_id?: string;
++ /**
++ * What failed, when the project can look it up with its own token: a job, an event, an AI run, a Media object. Never a subject.
++ */
++ ref?: string;
++ },
++ {
++ at: string;
++ code: string;
++ /**
++ * The HTTP status the failure was answered with, when there was one.
++ */
++ status?: number;
++ /**
++ * The W3C trace id of the request (or event) that failed.
++ */
++ trace_id?: string;
++ /**
++ * What failed, when the project can look it up with its own token: a job, an event, an AI run, a Media object. Never a subject.
++ */
++ ref?: string;
++ },
++ {
++ at: string;
++ code: string;
++ /**
++ * The HTTP status the failure was answered with, when there was one.
++ */
++ status?: number;
++ /**
++ * The W3C trace id of the request (or event) that failed.
++ */
++ trace_id?: string;
++ /**
++ * What failed, when the project can look it up with its own token: a job, an event, an AI run, a Media object. Never a subject.
++ */
++ ref?: string;
++ },
++ {
++ at: string;
++ code: string;
++ /**
++ * The HTTP status the failure was answered with, when there was one.
++ */
++ status?: number;
++ /**
++ * The W3C trace id of the request (or event) that failed.
++ */
++ trace_id?: string;
++ /**
++ * What failed, when the project can look it up with its own token: a job, an event, an AI run, a Media object. Never a subject.
++ */
++ ref?: string;
++ },
++ {
++ at: string;
++ code: string;
++ /**
++ * The HTTP status the failure was answered with, when there was one.
++ */
++ status?: number;
++ /**
++ * The W3C trace id of the request (or event) that failed.
++ */
++ trace_id?: string;
++ /**
++ * What failed, when the project can look it up with its own token: a job, an event, an AI run, a Media object. Never a subject.
++ */
++ ref?: string;
++ },
++ {
++ at: string;
++ code: string;
++ /**
++ * The HTTP status the failure was answered with, when there was one.
++ */
++ status?: number;
++ /**
++ * The W3C trace id of the request (or event) that failed.
++ */
++ trace_id?: string;
++ /**
++ * What failed, when the project can look it up with its own token: a job, an event, an AI run, a Media object. Never a subject.
++ */
++ ref?: string;
++ }
++ ]
++ | [
++ {
++ at: string;
++ code: string;
++ /**
++ * The HTTP status the failure was answered with, when there was one.
++ */
++ status?: number;
++ /**
++ * The W3C trace id of the request (or event) that failed.
++ */
++ trace_id?: string;
++ /**
++ * What failed, when the project can look it up with its own token: a job, an event, an AI run, a Media object. Never a subject.
++ */
++ ref?: string;
++ },
++ {
++ at: string;
++ code: string;
++ /**
++ * The HTTP status the failure was answered with, when there was one.
++ */
++ status?: number;
++ /**
++ * The W3C trace id of the request (or event) that failed.
++ */
++ trace_id?: string;
++ /**
++ * What failed, when the project can look it up with its own token: a job, an event, an AI run, a Media object. Never a subject.
++ */
++ ref?: string;
++ },
++ {
++ at: string;
++ code: string;
++ /**
++ * The HTTP status the failure was answered with, when there was one.
++ */
++ status?: number;
++ /**
++ * The W3C trace id of the request (or event) that failed.
++ */
++ trace_id?: string;
++ /**
++ * What failed, when the project can look it up with its own token: a job, an event, an AI run, a Media object. Never a subject.
++ */
++ ref?: string;
++ },
++ {
++ at: string;
++ code: string;
++ /**
++ * The HTTP status the failure was answered with, when there was one.
++ */
++ status?: number;
++ /**
++ * The W3C trace id of the request (or event) that failed.
++ */
++ trace_id?: string;
++ /**
++ * What failed, when the project can look it up with its own token: a job, an event, an AI run, a Media object. Never a subject.
++ */
++ ref?: string;
++ },
++ {
++ at: string;
++ code: string;
++ /**
++ * The HTTP status the failure was answered with, when there was one.
++ */
++ status?: number;
++ /**
++ * The W3C trace id of the request (or event) that failed.
++ */
++ trace_id?: string;
++ /**
++ * What failed, when the project can look it up with its own token: a job, an event, an AI run, a Media object. Never a subject.
++ */
++ ref?: string;
++ },
++ {
++ at: string;
++ code: string;
++ /**
++ * The HTTP status the failure was answered with, when there was one.
++ */
++ status?: number;
++ /**
++ * The W3C trace id of the request (or event) that failed.
++ */
++ trace_id?: string;
++ /**
++ * What failed, when the project can look it up with its own token: a job, an event, an AI run, a Media object. Never a subject.
++ */
++ ref?: string;
++ },
++ {
++ at: string;
++ code: string;
++ /**
++ * The HTTP status the failure was answered with, when there was one.
++ */
++ status?: number;
++ /**
++ * The W3C trace id of the request (or event) that failed.
++ */
++ trace_id?: string;
++ /**
++ * What failed, when the project can look it up with its own token: a job, an event, an AI run, a Media object. Never a subject.
++ */
++ ref?: string;
++ },
++ {
++ at: string;
++ code: string;
++ /**
++ * The HTTP status the failure was answered with, when there was one.
++ */
++ status?: number;
++ /**
++ * The W3C trace id of the request (or event) that failed.
++ */
++ trace_id?: string;
++ /**
++ * What failed, when the project can look it up with its own token: a job, an event, an AI run, a Media object. Never a subject.
++ */
++ ref?: string;
++ }
++ ]
++ | [
++ {
++ at: string;
++ code: string;
++ /**
++ * The HTTP status the failure was answered with, when there was one.
++ */
++ status?: number;
++ /**
++ * The W3C trace id of the request (or event) that failed.
++ */
++ trace_id?: string;
++ /**
++ * What failed, when the project can look it up with its own token: a job, an event, an AI run, a Media object. Never a subject.
++ */
++ ref?: string;
++ },
++ {
++ at: string;
++ code: string;
++ /**
++ * The HTTP status the failure was answered with, when there was one.
++ */
++ status?: number;
++ /**
++ * The W3C trace id of the request (or event) that failed.
++ */
++ trace_id?: string;
++ /**
++ * What failed, when the project can look it up with its own token: a job, an event, an AI run, a Media object. Never a subject.
++ */
++ ref?: string;
++ },
++ {
++ at: string;
++ code: string;
++ /**
++ * The HTTP status the failure was answered with, when there was one.
++ */
++ status?: number;
++ /**
++ * The W3C trace id of the request (or event) that failed.
++ */
++ trace_id?: string;
++ /**
++ * What failed, when the project can look it up with its own token: a job, an event, an AI run, a Media object. Never a subject.
++ */
++ ref?: string;
++ },
++ {
++ at: string;
++ code: string;
++ /**
++ * The HTTP status the failure was answered with, when there was one.
++ */
++ status?: number;
++ /**
++ * The W3C trace id of the request (or event) that failed.
++ */
++ trace_id?: string;
++ /**
++ * What failed, when the project can look it up with its own token: a job, an event, an AI run, a Media object. Never a subject.
++ */
++ ref?: string;
++ },
++ {
++ at: string;
++ code: string;
++ /**
++ * The HTTP status the failure was answered with, when there was one.
++ */
++ status?: number;
++ /**
++ * The W3C trace id of the request (or event) that failed.
++ */
++ trace_id?: string;
++ /**
++ * What failed, when the project can look it up with its own token: a job, an event, an AI run, a Media object. Never a subject.
++ */
++ ref?: string;
++ },
++ {
++ at: string;
++ code: string;
++ /**
++ * The HTTP status the failure was answered with, when there was one.
++ */
++ status?: number;
++ /**
++ * The W3C trace id of the request (or event) that failed.
++ */
++ trace_id?: string;
++ /**
++ * What failed, when the project can look it up with its own token: a job, an event, an AI run, a Media object. Never a subject.
++ */
++ ref?: string;
++ },
++ {
++ at: string;
++ code: string;
++ /**
++ * The HTTP status the failure was answered with, when there was one.
++ */
++ status?: number;
++ /**
++ * The W3C trace id of the request (or event) that failed.
++ */
++ trace_id?: string;
++ /**
++ * What failed, when the project can look it up with its own token: a job, an event, an AI run, a Media object. Never a subject.
++ */
++ ref?: string;
++ },
++ {
++ at: string;
++ code: string;
++ /**
++ * The HTTP status the failure was answered with, when there was one.
++ */
++ status?: number;
++ /**
++ * The W3C trace id of the request (or event) that failed.
++ */
++ trace_id?: string;
++ /**
++ * What failed, when the project can look it up with its own token: a job, an event, an AI run, a Media object. Never a subject.
++ */
++ ref?: string;
++ },
++ {
++ at: string;
++ code: string;
++ /**
++ * The HTTP status the failure was answered with, when there was one.
++ */
++ status?: number;
++ /**
++ * The W3C trace id of the request (or event) that failed.
++ */
++ trace_id?: string;
++ /**
++ * What failed, when the project can look it up with its own token: a job, an event, an AI run, a Media object. Never a subject.
++ */
++ ref?: string;
++ }
++ ]
++ | [
++ {
++ at: string;
++ code: string;
++ /**
++ * The HTTP status the failure was answered with, when there was one.
++ */
++ status?: number;
++ /**
++ * The W3C trace id of the request (or event) that failed.
++ */
++ trace_id?: string;
++ /**
++ * What failed, when the project can look it up with its own token: a job, an event, an AI run, a Media object. Never a subject.
++ */
++ ref?: string;
++ },
++ {
++ at: string;
++ code: string;
++ /**
++ * The HTTP status the failure was answered with, when there was one.
++ */
++ status?: number;
++ /**
++ * The W3C trace id of the request (or event) that failed.
++ */
++ trace_id?: string;
++ /**
++ * What failed, when the project can look it up with its own token: a job, an event, an AI run, a Media object. Never a subject.
++ */
++ ref?: string;
++ },
++ {
++ at: string;
++ code: string;
++ /**
++ * The HTTP status the failure was answered with, when there was one.
++ */
++ status?: number;
++ /**
++ * The W3C trace id of the request (or event) that failed.
++ */
++ trace_id?: string;
++ /**
++ * What failed, when the project can look it up with its own token: a job, an event, an AI run, a Media object. Never a subject.
++ */
++ ref?: string;
++ },
++ {
++ at: string;
++ code: string;
++ /**
++ * The HTTP status the failure was answered with, when there was one.
++ */
++ status?: number;
++ /**
++ * The W3C trace id of the request (or event) that failed.
++ */
++ trace_id?: string;
++ /**
++ * What failed, when the project can look it up with its own token: a job, an event, an AI run, a Media object. Never a subject.
++ */
++ ref?: string;
++ },
++ {
++ at: string;
++ code: string;
++ /**
++ * The HTTP status the failure was answered with, when there was one.
++ */
++ status?: number;
++ /**
++ * The W3C trace id of the request (or event) that failed.
++ */
++ trace_id?: string;
++ /**
++ * What failed, when the project can look it up with its own token: a job, an event, an AI run, a Media object. Never a subject.
++ */
++ ref?: string;
++ },
++ {
++ at: string;
++ code: string;
++ /**
++ * The HTTP status the failure was answered with, when there was one.
++ */
++ status?: number;
++ /**
++ * The W3C trace id of the request (or event) that failed.
++ */
++ trace_id?: string;
++ /**
++ * What failed, when the project can look it up with its own token: a job, an event, an AI run, a Media object. Never a subject.
++ */
++ ref?: string;
++ },
++ {
++ at: string;
++ code: string;
++ /**
++ * The HTTP status the failure was answered with, when there was one.
++ */
++ status?: number;
++ /**
++ * The W3C trace id of the request (or event) that failed.
++ */
++ trace_id?: string;
++ /**
++ * What failed, when the project can look it up with its own token: a job, an event, an AI run, a Media object. Never a subject.
++ */
++ ref?: string;
++ },
++ {
++ at: string;
++ code: string;
++ /**
++ * The HTTP status the failure was answered with, when there was one.
++ */
++ status?: number;
++ /**
++ * The W3C trace id of the request (or event) that failed.
++ */
++ trace_id?: string;
++ /**
++ * What failed, when the project can look it up with its own token: a job, an event, an AI run, a Media object. Never a subject.
++ */
++ ref?: string;
++ },
++ {
++ at: string;
++ code: string;
++ /**
++ * The HTTP status the failure was answered with, when there was one.
++ */
++ status?: number;
++ /**
++ * The W3C trace id of the request (or event) that failed.
++ */
++ trace_id?: string;
++ /**
++ * What failed, when the project can look it up with its own token: a job, an event, an AI run, a Media object. Never a subject.
++ */
++ ref?: string;
++ },
++ {
++ at: string;
++ code: string;
++ /**
++ * The HTTP status the failure was answered with, when there was one.
++ */
++ status?: number;
++ /**
++ * The W3C trace id of the request (or event) that failed.
++ */
++ trace_id?: string;
++ /**
++ * What failed, when the project can look it up with its own token: a job, an event, an AI run, a Media object. Never a subject.
++ */
++ ref?: string;
++ }
++ ];
++ /**
++ * 1 when absent. A producer that re-emits a window with corrected totals raises it.
++ */
++ revision?: number;
++}
++
/** [email protected] (owner: live) */
/**
* live.stream.started v1 (OpenVibe.Live server/events/stream-events.js envelopeFor, fired by server/db/database.js createStream). A streams row went live: WebRTC/JSMPEG from the dashboard, RTMP ingest, WHIP, or an OpenRestream session mirrored into Live. Written to Live's event_outbox in the transaction that inserts the row, so the event exists if and only if the stream did. Carries public channel facts only (the stream is listed publicly already); consumers such as Network's go-live notifications decide who hears about it. Never the stream key, the Live user id or the description. Envelope: subject { type: stream, id: <stream_id as a string>, revision: 1 }, visibility public, priority important, actor the streamer's user subject when Live knows it, else service:live.
ddiff --git a/manifests/capabilities/media.object.s3.json b/manifests/capabilities/media.object.s3.json
iindex 6a85798e..8d80b239 100644
---- a/manifests/capabilities/media.object.s3.json
++++ b/manifests/capabilities/media.object.s3.json
@@@ -4,7 +4,7 @@
"owner": "media",
"status": "active",
"visibility": "public",
-- "description": "OpenVibe.Media's S3 surface (ADR-031), path style at https://s3.openvibe.media/<zone name>/<key>: PutObject (one request, aws-chunked bodies included, Content-MD5 and x-amz-checksum-* checked), GetObject (ranges), HeadObject, DeleteObject, DeleteObjects, ListObjectsV2 and ListObjects (prefix, delimiter, pages), ListBuckets, HeadBucket, GetBucketLocation, and presigned GET and PUT (SigV4 query, 7 days at most). Everything else answers NotImplemented (multipart, copy, ACLs, policies, versioning; buckets are made and deleted only through OpenVibe.Zone). It is reached with a media.access-key@1 rather than a Network token: the key fixes the project and environment, so a bucket name names one zone of that environment, and a key scoped to zones reaches only those. A request is authorised as the project's app would be: the same quotas (the zone's and the environment's), the same objects as the native API, and Media's one deletion path (a held object is neither deleted nor overwritten). Responses carry a sandbox Content-Security-Policy.",
++ "description": "OpenVibe.Media's S3 surface (ADR-031), path style at https://s3.openvibe.media/<zone name>/<key>: PutObject (one request, aws-chunked bodies included, Content-MD5 and x-amz-checksum-* checked), GetObject (ranges), HeadObject, DeleteObject, DeleteObjects, ListObjectsV2 and ListObjects (prefix, delimiter, pages), ListBuckets, HeadBucket, GetBucketLocation, and presigned GET and PUT (SigV4 query, 7 days at most). multipart uploads (CreateMultipartUpload, UploadPart, CompleteMultipartUpload, AbortMultipartUpload, ListParts, ListMultipartUploads; every part but the last at least 5 MiB, parts of 256 MB and objects of 20 GB at most by default, 10000 parts, an upload expiring after a day). Everything else answers NotImplemented (copy, part copy, ACLs, policies, versioning; buckets are made and deleted only through OpenVibe.Zone). It is reached with a media.access-key@1 rather than a Network token: the key fixes the project and environment, so a bucket name names one zone of that environment, and a key scoped to zones reaches only those. A request is authorised as the project's app would be: the same quotas (the zone's and the environment's), the same objects as the native API, and Media's one deletion path (a held object is neither deleted nor overwritten). Responses carry a sandbox Content-Security-Policy.",
"permissions": [
"objects:read",
"objects:write"
@@@ -25,7 +25,13 @@
"PUT s3:/:zone/:key",
"GET s3:/:zone/:key",
"HEAD s3:/:zone/:key",
-- "DELETE s3:/:zone/:key"
++ "DELETE s3:/:zone/:key",
++ "POST s3:/:zone/:key?uploads",
++ "PUT s3:/:zone/:key?partNumber&uploadId",
++ "POST s3:/:zone/:key?uploadId",
++ "DELETE s3:/:zone/:key?uploadId",
++ "GET s3:/:zone/:key?uploadId",
++ "GET s3:/:zone?uploads"
],
"inputSchema": "common.no-body@1",
"outputSchema": "common.no-body@1"
ddiff --git a/manifests/services/media.json b/manifests/services/media.json
iindex d1906dc4..ab891125 100644
---- a/manifests/services/media.json
++++ b/manifests/services/media.json
@@@ -68,6 +68,7 @@
"media.replica.requested",
"media.storage.alert",
"media.storage.recovered",
++ "media.usage.recorded",
"media.vod.failed",
"media.vod.ready"
],
ddiff --git a/manifests/services/network.json b/manifests/services/network.json
iindex c6320438..adc0b0bd 100644
---- a/manifests/services/network.json
++++ b/manifests/services/network.json
@@@ -97,6 +97,7 @@
"live.moderation.action",
"live.stream.started",
"media.moderation.action",
++ "media.usage.recorded",
"news.moderation.action",
"reviews.moderation.action",
"services.moderation.action",
ddiff --git a/manifests/services/zone.json b/manifests/services/zone.json
iindex baea44d1..049298fa 100644
---- a/manifests/services/zone.json
++++ b/manifests/services/zone.json
@@@ -27,7 +27,9 @@
"zone.resource.control"
],
"eventsProduced": [],
-- "eventsConsumed": [],
++ "eventsConsumed": [
++ "media.usage.recorded"
++ ],
"namespacesOwned": [
"zone.*"
],
ddiff --git a/package.json b/package.json
iindex d09dda12..a6162d76 100644
---- a/package.json
++++ b/package.json
@@@ -1,6 +1,6 @@
{
"name": "openvibe-contracts",
-- "version": "0.174.0",
++ "version": "0.175.0",
"description": "Machine-readable contracts for the OpenVibe network: schemas, manifests, ids, error envelope, capability checks.",
"main": "index.js",
"types": "generated/typescript/index.d.ts",