openvibers/openvibe.contracts Commits

Contracts 0.136.0: no per-event sequence number on the Events consumer wire (#89)

OP OpenVibers committed 10 Oct 2026 · 9c8e1c7ee3 · 47 files, +137 −179

Plan T7, ADR-042 decision 7, the last step: no per-event sequence number on the consumer wire. Positions became opaque cursors in 0.132.0 (Events #56); the informational `seq` that stayed beside them goes now, with the "global order" promise.

**Why it is safe:**
- Every client dedupes by `event_id`: openvibe-sdk 0.42.0 realtime and Shared 3.0.1's bell and release watcher, deployed across the estate today.
- No receiver reads `seq`. Checked across every repository: delivery handlers only require `event`, and the SDK outbox kit merely records it.

**Changes:**
- `events.publish-result@1`: `{ event_id, cursor, duplicate }` for single and batch items. `seq` is gone and `cursor` is required.
- `events.read-result@1`: page items and single reads are `{ cursor, event }`; SSE messages carry `{ event }`.
- **Unchanged:** `gap` ranges (informational), and the operator delivery list and replay (`events.delivery-admin-*`), which still page by the hot store's position.
- Fixtures follow; ADR-042 records the step.

Events implements it next, then openvibe-sdk 0.43.0.

`node test/run.js`: 18,418 checks passed; compat vs v0.135.0: no breaking changes.

Changes

ddiff --git a/CHANGELOG.md b/CHANGELOG.md
iindex 53624deb..15c31987 100644
---- a/CHANGELOG.md
++++ b/CHANGELOG.md
@@@ -4,6 +4,20 @@ 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.136.0 — 2026-10-10
++
++**No per-event sequence number on the consumer wire** (ADR-042 decision 7, its last step; plan T7). Positions became
++opaque cursors in 0.132.0; the informational `seq` that stayed beside them goes now, with the "global order" promise.
++Every client dedupes by `event_id` (openvibe-sdk 0.42.0 realtime, Shared 3.0.1), and no receiver reads `seq`
++(checked across the estate).
++
++- `events.publish-result@1`: `{ event_id, cursor, duplicate }` (single and batch items); `seq` is gone and `cursor` is
++ required.
++- `events.read-result@1`: page items and single reads are `{ cursor, event }`. SSE messages carry `{ event }`.
++- Unchanged: `gap` ranges (`from_seq`, `to_seq`; informational), and the operator delivery list and replay
++ (`events.delivery-admin-*`), which still page by the hot store's position.
++- Fixtures follow; ADR-042 records the step.
++
## 0.135.0 — 2026-10-10
- **Events, AI and Search get `site` blocks** (name, icon, tagline, what, legal profile, position 31-33). All three
ddiff --git a/contracts/events/publish-result.v1.json b/contracts/events/publish-result.v1.json
iindex 9eb8d28f..a6219abb 100644
---- a/contracts/events/publish-result.v1.json
++++ b/contracts/events/publish-result.v1.json
@@@ -2,13 +2,13 @@
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://openvibe.network/contracts/events/publish-result.v1.json",
"title": "EventsPublishResult",
-- "description": "events.publish-result@1: the answer of POST /api/v1/events on OpenVibe.Events (events.event.publish for services, events.app.publish for developer apps). One envelope → { event_id, seq, duplicate, cursor? } (201 when stored, 200 when every event was a repeat); a batch { events: [...] } (at most 100, atomic) → { results } in the same order. Refusals are problem+json: 422 events.invalid_envelope / events.invalid_redaction, 403 events.source_mismatch / events.type_not_allowed / events.actor_mismatch, 413 events.payload_too_large / events.batch_too_large, 429 events.quota_exceeded (apps).",
++ "description": "events.publish-result@1: the answer of POST /api/v1/events on OpenVibe.Events (events.event.publish for services, events.app.publish for developer apps). One envelope → { event_id, cursor, duplicate } (201 when stored, 200 when every event was a repeat); a batch { events: [...] } (at most 100, atomic) → { results } in the same order. Refusals are problem+json: 422 events.invalid_envelope / events.invalid_redaction, 403 events.source_mismatch / events.type_not_allowed / events.actor_mismatch, 413 events.payload_too_large / events.batch_too_large, 429 events.quota_exceeded (apps).",
"anyOf": [
{
"type": "object",
"required": [
"event_id",
-- "seq",
++ "cursor",
"duplicate"
],
"properties": {
@@@ -16,19 +16,15 @@
"type": "string",
"pattern": "^evt_"
},
-- "seq": {
-- "type": "integer",
-- "minimum": 1
-- },
"duplicate": {
"type": "boolean",
-- "description": "true: this event_id was stored before; the stored seq is returned and nothing is stored twice."
++ "description": "true: this event_id was stored before; its stored position is returned and nothing is stored twice."
},
"cursor": {
"type": "string",
"minLength": 1,
"maxLength": 200,
-- "description": "Opaque position (ADR-042): hand it back as after= to read on from here, or as Last-Event-ID; never parse it. Returned beside seq for one release; seq then goes."
++ "description": "Opaque position (ADR-042): hand it back as after= to read on from here, or as Last-Event-ID; never parse it."
}
}
},
@@@ -46,7 +42,7 @@
"type": "object",
"required": [
"event_id",
-- "seq",
++ "cursor",
"duplicate"
],
"properties": {
@@@ -54,19 +50,15 @@
"type": "string",
"pattern": "^evt_"
},
-- "seq": {
-- "type": "integer",
-- "minimum": 1
-- },
"duplicate": {
"type": "boolean",
-- "description": "true: this event_id was stored before; the stored seq is returned and nothing is stored twice."
++ "description": "true: this event_id was stored before; its stored position is returned and nothing is stored twice."
},
"cursor": {
"type": "string",
"minLength": 1,
"maxLength": 200,
-- "description": "Opaque position (ADR-042): hand it back as after= to read on from here, or as Last-Event-ID; never parse it. Returned beside seq for one release; seq then goes."
++ "description": "Opaque position (ADR-042): hand it back as after= to read on from here, or as Last-Event-ID; never parse it."
}
}
}
ddiff --git a/contracts/events/read-result.v1.json b/contracts/events/read-result.v1.json
iindex 5e2005ee..7c0f2b8d 100644
---- a/contracts/events/read-result.v1.json
++++ b/contracts/events/read-result.v1.json
@@@ -2,7 +2,7 @@
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://openvibe.network/contracts/events/read-result.v1.json",
"title": "EventsReadResult",
-- "description": "events.read-result@1: answers of the pull API on OpenVibe.Events. GET /api/v1/events → { events: [{ seq, cursor, event }], next_cursor, latest_cursor, gap? } (keep next_cursor as the position and read on with after=: it moves past events that did not match; latest_cursor is the head, for a consumer that starts at now; without after= a page starts at the oldest retained event; gap { from_seq, to_seq } says events after the position were already pruned by retention); GET /api/v1/events/:event_id → { seq, cursor, event }; GET|PUT /api/v1/checkpoints → { consumer, topic, cursor, carrier, updated_at } (cursor, carrier and updated_at null when none is stored). GET /realtime/stream?topics= (events.event.read) is a Server-Sent Events feed whose messages carry the same { seq, event } with the cursor as the SSE id; it resumes from Last-Event-ID (or last_event_id=) when that is a cursor, and a gap message comes first when the cursor is older than retention. A position is only ever an opaque cursor (ADR-042 decision 7): the per-event seq is informational, and nothing accepts it as a position. An app sees only its project's events in its token's environment plus public first-party events.",
++ "description": "events.read-result@1: answers of the pull API on OpenVibe.Events. GET /api/v1/events → { events: [{ cursor, event }], next_cursor, latest_cursor, gap? } (keep next_cursor as the position and read on with after=: it moves past events that did not match; latest_cursor is the head, for a consumer that starts at now; without after= a page starts at the oldest retained event; gap { from_seq, to_seq } says events after the position were already pruned by retention); GET /api/v1/events/:event_id → { cursor, event }; GET|PUT /api/v1/checkpoints → { consumer, topic, cursor, carrier, updated_at } (cursor, carrier and updated_at null when none is stored). GET /realtime/stream?topics= (events.event.read) is a Server-Sent Events feed whose messages carry { event } with the cursor as the SSE id; it resumes from Last-Event-ID (or last_event_id=) when that is a cursor, and a gap message comes first when the cursor is older than retention. A position is only ever an opaque cursor (ADR-042 decision 7): there is no per-event sequence number and no global order; dedupe on event.event_id. An app sees only its project's events in its token's environment plus public first-party events.",
"anyOf": [
{
"type": "object",
@@@ -18,16 +18,10 @@
"items": {
"type": "object",
"required": [
-- "seq",
"cursor",
"event"
],
"properties": {
-- "seq": {
-- "type": "integer",
-- "minimum": 1,
-- "description": "Informational: the event's number in the hot store. Not a position."
-- },
"event": {
"$ref": "event-envelope.v1.json"
},
@@@ -72,16 +66,10 @@
{
"type": "object",
"required": [
-- "seq",
"cursor",
"event"
],
"properties": {
-- "seq": {
-- "type": "integer",
-- "minimum": 1,
-- "description": "Informational: the event's number in the hot store. Not a position."
-- },
"event": {
"$ref": "event-envelope.v1.json"
},
ddiff --git a/docs/adr/ADR-042-events-fabric.md b/docs/adr/ADR-042-events-fabric.md
iindex ad207279..ef075847 100644
---- a/docs/adr/ADR-042-events-fabric.md
++++ b/docs/adr/ADR-042-events-fabric.md
@@@ -56,8 +56,10 @@ cell-local carrier). Amends ADR-004: its "Kafka/NATS now: rejected" is supersede
*Positions done 2026-10-10 (Contracts 0.132.0, openvibe-sdk 0.42.0, Shared 3.0.1, Events):* every consumer reads by
cursor, and nothing accepts a number as a position any more: `after_seq` is a 400, pages carry no `next_after_seq` or
`latest_seq`, checkpoints store and return the opaque cursor, and a bare-number `Last-Event-ID` is not a position.
-- The per-event `seq` (pull items, publish results, SSE data, the delivery body and `X-OpenVibe-Seq`) remains as an
-- informational number; deleting it is the last step, and clients already dedupe by `event_id`.
++ *Done 2026-10-10 (Contracts 0.136.0, Events, openvibe-sdk 0.43.0):* the per-event `seq` is gone from pull items,
++ single reads, publish results, SSE data and the delivery body, and `X-OpenVibe-Seq` is no longer sent: there is no
++ global order on the wire, and clients dedupe by `event_id`. Only the operator routes (the delivery list and
++ replay `from_seq`) still page by the hot store's position, and `gap` ranges still count it, informationally.
8. **Three tiers.** hot = `events` (pruned at `retention.hot`); replay = `events_archive` in the same database (no
delivery rows, compressed payloads, pruned at `retention.replay`); archive = monthly NDJSON objects in object
storage, restored only by an operator job into `events_archive`. Pulls and scans span hot and replay with one
ddiff --git a/fixtures/events.publish-result/invalid/empty-cursor.json b/fixtures/events.publish-result/invalid/empty-cursor.json
iindex f7a8c5da..175615ae 100644
---- a/fixtures/events.publish-result/invalid/empty-cursor.json
++++ b/fixtures/events.publish-result/invalid/empty-cursor.json
@@@ -1,6 +1,5 @@
{
"event_id": "evt_01JAB2C3D4E5F6G7H8J9K0MNPQ",
-- "seq": 88213,
"duplicate": false,
"cursor": ""
}
ddiff --git a/fixtures/events.publish-result/invalid/no-duplicate-flag.json b/fixtures/events.publish-result/invalid/no-duplicate-flag.json
iindex 04c8b29a..5fd1e7ca 100644
---- a/fixtures/events.publish-result/invalid/no-duplicate-flag.json
++++ b/fixtures/events.publish-result/invalid/no-duplicate-flag.json
@@@ -1 +1,4 @@
--{ "event_id": "evt_01JAB2C3D4E5F6G7H8J9K0MNPQ", "seq": 0 }
++{
++ "event_id": "evt_01JAB2C3D4E5F6G7H8J9K0MNPQ",
++ "cursor": "c1.0.MA"
++}
ddiff --git a/fixtures/events.publish-result/valid/batch.json b/fixtures/events.publish-result/valid/batch.json
iindex 3281d02e..bd189fc0 100644
---- a/fixtures/events.publish-result/valid/batch.json
++++ b/fixtures/events.publish-result/valid/batch.json
@@@ -1 +1,14 @@
--{ "results": [ { "event_id": "evt_01JAB2C3D4E5F6G7H8J9K0MNPQ", "seq": 88213, "duplicate": false }, { "event_id": "evt_01JAB2C3D4E5F6G7H8J9K0MNPR", "seq": 70001, "duplicate": true } ] }
++{
++ "results": [
++ {
++ "event_id": "evt_01JAB2C3D4E5F6G7H8J9K0MNPQ",
++ "duplicate": false,
++ "cursor": "c1.0.ODgyMTM"
++ },
++ {
++ "event_id": "evt_01JAB2C3D4E5F6G7H8J9K0MNPR",
++ "duplicate": true,
++ "cursor": "c1.0.NzAwMDE"
++ }
++ ]
++}
ddiff --git a/fixtures/events.publish-result/valid/one.json b/fixtures/events.publish-result/valid/one.json
iindex b2f2344d..cafea5be 100644
---- a/fixtures/events.publish-result/valid/one.json
++++ b/fixtures/events.publish-result/valid/one.json
@@@ -1 +1,5 @@
--{ "event_id": "evt_01JAB2C3D4E5F6G7H8J9K0MNPQ", "seq": 88213, "duplicate": false }
++{
++ "event_id": "evt_01JAB2C3D4E5F6G7H8J9K0MNPQ",
++ "duplicate": false,
++ "cursor": "c1.0.ODgyMTM"
++}
ddiff --git a/fixtures/events.publish-result/valid/with-cursor.json b/fixtures/events.publish-result/valid/with-cursor.json
iindex 55d61f93..2e35186e 100644
---- a/fixtures/events.publish-result/valid/with-cursor.json
++++ b/fixtures/events.publish-result/valid/with-cursor.json
@@@ -1,6 +1,5 @@
{
"event_id": "evt_01JAB2C3D4E5F6G7H8J9K0MNPQ",
-- "seq": 88213,
"duplicate": false,
"cursor": "c1.e0.MTIzNDU"
}
ddiff --git a/fixtures/events.read-result/invalid/bad-envelope.json b/fixtures/events.read-result/invalid/bad-envelope.json
iindex e61b1bb2..f68567a1 100644
---- a/fixtures/events.read-result/invalid/bad-envelope.json
++++ b/fixtures/events.read-result/invalid/bad-envelope.json
@@@ -1,7 +1,6 @@
{
"events": [
{
-- "seq": 1,
"cursor": "c1.0.MQ",
"event": {
"event_type": "x"
ddiff --git a/fixtures/events.read-result/invalid/empty-latest-cursor.json b/fixtures/events.read-result/invalid/empty-latest-cursor.json
iindex dbd5da6a..f3567d0b 100644
---- a/fixtures/events.read-result/invalid/empty-latest-cursor.json
++++ b/fixtures/events.read-result/invalid/empty-latest-cursor.json
@@@ -1,7 +1,6 @@
{
"events": [
{
-- "seq": 88213,
"event": {
"event_id": "evt_01JAB2C3D4E5F6G7H8J9K0MNPR",
"event_type": "app.p01jab2c3d4e5f6g7h8j9k0mnpq.order.created",
ddiff --git a/fixtures/events.read-result/valid/page-with-cursor.json b/fixtures/events.read-result/valid/page-with-cursor.json
iindex dae94410..7d7ba682 100644
---- a/fixtures/events.read-result/valid/page-with-cursor.json
++++ b/fixtures/events.read-result/valid/page-with-cursor.json
@@@ -1,7 +1,6 @@
{
"events": [
{
-- "seq": 88213,
"event": {
"event_id": "evt_01JAB2C3D4E5F6G7H8J9K0MNPR",
"event_type": "app.p01jab2c3d4e5f6g7h8j9k0mnpq.order.created",
ddiff --git a/fixtures/events.read-result/valid/page-with-latest-cursor.json b/fixtures/events.read-result/valid/page-with-latest-cursor.json
iindex 7c6c435f..200c556e 100644
---- a/fixtures/events.read-result/valid/page-with-latest-cursor.json
++++ b/fixtures/events.read-result/valid/page-with-latest-cursor.json
@@@ -1,7 +1,6 @@
{
"events": [
{
-- "seq": 88213,
"event": {
"event_id": "evt_01JAB2C3D4E5F6G7H8J9K0MNPR",
"event_type": "app.p01jab2c3d4e5f6g7h8j9k0mnpq.order.created",
ddiff --git a/fixtures/events.read-result/valid/page.json b/fixtures/events.read-result/valid/page.json
iindex b7486a23..8357e5e8 100644
---- a/fixtures/events.read-result/valid/page.json
++++ b/fixtures/events.read-result/valid/page.json
@@@ -1,7 +1,6 @@
{
"events": [
{
-- "seq": 88213,
"event": {
"event_id": "evt_01JAB2C3D4E5F6G7H8J9K0MNPR",
"event_type": "app.p01jab2c3d4e5f6g7h8j9k0mnpq.order.created",
ddiff --git a/generated/json-schema/bundle.json b/generated/json-schema/bundle.json
iindex 769b7a56..2302412f 100644
---- a/generated/json-schema/bundle.json
++++ b/generated/json-schema/bundle.json
@@@ -5977,13 +5977,13 @@
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://openvibe.network/contracts/events/publish-result.v1.json",
"title": "EventsPublishResult",
-- "description": "events.publish-result@1: the answer of POST /api/v1/events on OpenVibe.Events (events.event.publish for services, events.app.publish for developer apps). One envelope → { event_id, seq, duplicate, cursor? } (201 when stored, 200 when every event was a repeat); a batch { events: [...] } (at most 100, atomic) → { results } in the same order. Refusals are problem+json: 422 events.invalid_envelope / events.invalid_redaction, 403 events.source_mismatch / events.type_not_allowed / events.actor_mismatch, 413 events.payload_too_large / events.batch_too_large, 429 events.quota_exceeded (apps).",
++ "description": "events.publish-result@1: the answer of POST /api/v1/events on OpenVibe.Events (events.event.publish for services, events.app.publish for developer apps). One envelope → { event_id, cursor, duplicate } (201 when stored, 200 when every event was a repeat); a batch { events: [...] } (at most 100, atomic) → { results } in the same order. Refusals are problem+json: 422 events.invalid_envelope / events.invalid_redaction, 403 events.source_mismatch / events.type_not_allowed / events.actor_mismatch, 413 events.payload_too_large / events.batch_too_large, 429 events.quota_exceeded (apps).",
"anyOf": [
{
"type": "object",
"required": [
"event_id",
-- "seq",
++ "cursor",
"duplicate"
],
"properties": {
@@@ -5991,19 +5991,15 @@
"type": "string",
"pattern": "^evt_"
},
-- "seq": {
-- "type": "integer",
-- "minimum": 1
-- },
"duplicate": {
"type": "boolean",
-- "description": "true: this event_id was stored before; the stored seq is returned and nothing is stored twice."
++ "description": "true: this event_id was stored before; its stored position is returned and nothing is stored twice."
},
"cursor": {
"type": "string",
"minLength": 1,
"maxLength": 200,
-- "description": "Opaque position (ADR-042): hand it back as after= to read on from here, or as Last-Event-ID; never parse it. Returned beside seq for one release; seq then goes."
++ "description": "Opaque position (ADR-042): hand it back as after= to read on from here, or as Last-Event-ID; never parse it."
}
}
},
@@@ -6021,7 +6017,7 @@
"type": "object",
"required": [
"event_id",
-- "seq",
++ "cursor",
"duplicate"
],
"properties": {
@@@ -6029,19 +6025,15 @@
"type": "string",
"pattern": "^evt_"
},
-- "seq": {
-- "type": "integer",
-- "minimum": 1
-- },
"duplicate": {
"type": "boolean",
-- "description": "true: this event_id was stored before; the stored seq is returned and nothing is stored twice."
++ "description": "true: this event_id was stored before; its stored position is returned and nothing is stored twice."
},
"cursor": {
"type": "string",
"minLength": 1,
"maxLength": 200,
-- "description": "Opaque position (ADR-042): hand it back as after= to read on from here, or as Last-Event-ID; never parse it. Returned beside seq for one release; seq then goes."
++ "description": "Opaque position (ADR-042): hand it back as after= to read on from here, or as Last-Event-ID; never parse it."
}
}
}
@@@ -6102,7 +6094,7 @@
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://openvibe.network/contracts/events/read-result.v1.json",
"title": "EventsReadResult",
-- "description": "events.read-result@1: answers of the pull API on OpenVibe.Events. GET /api/v1/events → { events: [{ seq, cursor, event }], next_cursor, latest_cursor, gap? } (keep next_cursor as the position and read on with after=: it moves past events that did not match; latest_cursor is the head, for a consumer that starts at now; without after= a page starts at the oldest retained event; gap { from_seq, to_seq } says events after the position were already pruned by retention); GET /api/v1/events/:event_id → { seq, cursor, event }; GET|PUT /api/v1/checkpoints → { consumer, topic, cursor, carrier, updated_at } (cursor, carrier and updated_at null when none is stored). GET /realtime/stream?topics= (events.event.read) is a Server-Sent Events feed whose messages carry the same { seq, event } with the cursor as the SSE id; it resumes from Last-Event-ID (or last_event_id=) when that is a cursor, and a gap message comes first when the cursor is older than retention. A position is only ever an opaque cursor (ADR-042 decision 7): the per-event seq is informational, and nothing accepts it as a position. An app sees only its project's events in its token's environment plus public first-party events.",
++ "description": "events.read-result@1: answers of the pull API on OpenVibe.Events. GET /api/v1/events → { events: [{ cursor, event }], next_cursor, latest_cursor, gap? } (keep next_cursor as the position and read on with after=: it moves past events that did not match; latest_cursor is the head, for a consumer that starts at now; without after= a page starts at the oldest retained event; gap { from_seq, to_seq } says events after the position were already pruned by retention); GET /api/v1/events/:event_id → { cursor, event }; GET|PUT /api/v1/checkpoints → { consumer, topic, cursor, carrier, updated_at } (cursor, carrier and updated_at null when none is stored). GET /realtime/stream?topics= (events.event.read) is a Server-Sent Events feed whose messages carry { event } with the cursor as the SSE id; it resumes from Last-Event-ID (or last_event_id=) when that is a cursor, and a gap message comes first when the cursor is older than retention. A position is only ever an opaque cursor (ADR-042 decision 7): there is no per-event sequence number and no global order; dedupe on event.event_id. An app sees only its project's events in its token's environment plus public first-party events.",
"anyOf": [
{
"type": "object",
@@@ -6118,16 +6110,10 @@
"items": {
"type": "object",
"required": [
-- "seq",
"cursor",
"event"
],
"properties": {
-- "seq": {
-- "type": "integer",
-- "minimum": 1,
-- "description": "Informational: the event's number in the hot store. Not a position."
-- },
"event": {
"$ref": "event-envelope.v1.json"
},
@@@ -6172,16 +6158,10 @@
{
"type": "object",
"required": [
-- "seq",
"cursor",
"event"
],
"properties": {
-- "seq": {
-- "type": "integer",
-- "minimum": 1,
-- "description": "Informational: the event's number in the hot store. Not a position."
-- },
"event": {
"$ref": "event-envelope.v1.json"
},
ddiff --git a/generated/openapi/actor.json b/generated/openapi/actor.json
iindex 78c8669e..33aa03d4 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.135.0",
-- "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.135.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.136.0",
++ "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.136.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 7a02ea6c..6fd6c60c 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.135.0",
-- "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.135.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.136.0",
++ "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.136.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 8fe77785..5eedc93d 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.135.0",
-- "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.135.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.136.0",
++ "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.136.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 6d147e80..ab1abc5d 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.135.0",
-- "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.135.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.136.0",
++ "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.136.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 5f0aaa29..6d9c8d7c 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.135.0",
-- "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.135.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.136.0",
++ "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.136.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 38072082..0b303112 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.135.0",
-- "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.135.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.136.0",
++ "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.136.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 491cdf98..b25aa57f 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.135.0",
-- "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.135.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.136.0",
++ "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.136.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 acb1149d..58e9d703 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.135.0",
-- "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.135.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.136.0",
++ "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.136.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 d028e0c0..c00daa3b 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.135.0",
-- "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.135.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.136.0",
++ "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.136.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 8a05d759..e245c267 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.135.0",
-- "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.135.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.136.0",
++ "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.136.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"
@@@ -1389,13 +1389,13 @@
},
"events.publish-result.v1": {
"title": "EventsPublishResult",
-- "description": "events.publish-result@1: the answer of POST /api/v1/events on OpenVibe.Events (events.event.publish for services, events.app.publish for developer apps). One envelope → { event_id, seq, duplicate, cursor? } (201 when stored, 200 when every event was a repeat); a batch { events: [...] } (at most 100, atomic) → { results } in the same order. Refusals are problem+json: 422 events.invalid_envelope / events.invalid_redaction, 403 events.source_mismatch / events.type_not_allowed / events.actor_mismatch, 413 events.payload_too_large / events.batch_too_large, 429 events.quota_exceeded (apps).",
++ "description": "events.publish-result@1: the answer of POST /api/v1/events on OpenVibe.Events (events.event.publish for services, events.app.publish for developer apps). One envelope → { event_id, cursor, duplicate } (201 when stored, 200 when every event was a repeat); a batch { events: [...] } (at most 100, atomic) → { results } in the same order. Refusals are problem+json: 422 events.invalid_envelope / events.invalid_redaction, 403 events.source_mismatch / events.type_not_allowed / events.actor_mismatch, 413 events.payload_too_large / events.batch_too_large, 429 events.quota_exceeded (apps).",
"anyOf": [
{
"type": "object",
"required": [
"event_id",
-- "seq",
++ "cursor",
"duplicate"
],
"properties": {
@@@ -1403,19 +1403,15 @@
"type": "string",
"pattern": "^evt_"
},
-- "seq": {
-- "type": "integer",
-- "minimum": 1
-- },
"duplicate": {
"type": "boolean",
-- "description": "true: this event_id was stored before; the stored seq is returned and nothing is stored twice."
++ "description": "true: this event_id was stored before; its stored position is returned and nothing is stored twice."
},
"cursor": {
"type": "string",
"minLength": 1,
"maxLength": 200,
-- "description": "Opaque position (ADR-042): hand it back as after= to read on from here, or as Last-Event-ID; never parse it. Returned beside seq for one release; seq then goes."
++ "description": "Opaque position (ADR-042): hand it back as after= to read on from here, or as Last-Event-ID; never parse it."
}
}
},
@@@ -1433,7 +1429,7 @@
"type": "object",
"required": [
"event_id",
-- "seq",
++ "cursor",
"duplicate"
],
"properties": {
@@@ -1441,19 +1437,15 @@
"type": "string",
"pattern": "^evt_"
},
-- "seq": {
-- "type": "integer",
-- "minimum": 1
-- },
"duplicate": {
"type": "boolean",
-- "description": "true: this event_id was stored before; the stored seq is returned and nothing is stored twice."
++ "description": "true: this event_id was stored before; its stored position is returned and nothing is stored twice."
},
"cursor": {
"type": "string",
"minLength": 1,
"maxLength": 200,
-- "description": "Opaque position (ADR-042): hand it back as after= to read on from here, or as Last-Event-ID; never parse it. Returned beside seq for one release; seq then goes."
++ "description": "Opaque position (ADR-042): hand it back as after= to read on from here, or as Last-Event-ID; never parse it."
}
}
}
@@@ -1500,7 +1492,7 @@
},
"events.read-result.v1": {
"title": "EventsReadResult",
-- "description": "events.read-result@1: answers of the pull API on OpenVibe.Events. GET /api/v1/events → { events: [{ seq, cursor, event }], next_cursor, latest_cursor, gap? } (keep next_cursor as the position and read on with after=: it moves past events that did not match; latest_cursor is the head, for a consumer that starts at now; without after= a page starts at the oldest retained event; gap { from_seq, to_seq } says events after the position were already pruned by retention); GET /api/v1/events/:event_id → { seq, cursor, event }; GET|PUT /api/v1/checkpoints → { consumer, topic, cursor, carrier, updated_at } (cursor, carrier and updated_at null when none is stored). GET /realtime/stream?topics= (events.event.read) is a Server-Sent Events feed whose messages carry the same { seq, event } with the cursor as the SSE id; it resumes from Last-Event-ID (or last_event_id=) when that is a cursor, and a gap message comes first when the cursor is older than retention. A position is only ever an opaque cursor (ADR-042 decision 7): the per-event seq is informational, and nothing accepts it as a position. An app sees only its project's events in its token's environment plus public first-party events.",
++ "description": "events.read-result@1: answers of the pull API on OpenVibe.Events. GET /api/v1/events → { events: [{ cursor, event }], next_cursor, latest_cursor, gap? } (keep next_cursor as the position and read on with after=: it moves past events that did not match; latest_cursor is the head, for a consumer that starts at now; without after= a page starts at the oldest retained event; gap { from_seq, to_seq } says events after the position were already pruned by retention); GET /api/v1/events/:event_id → { cursor, event }; GET|PUT /api/v1/checkpoints → { consumer, topic, cursor, carrier, updated_at } (cursor, carrier and updated_at null when none is stored). GET /realtime/stream?topics= (events.event.read) is a Server-Sent Events feed whose messages carry { event } with the cursor as the SSE id; it resumes from Last-Event-ID (or last_event_id=) when that is a cursor, and a gap message comes first when the cursor is older than retention. A position is only ever an opaque cursor (ADR-042 decision 7): there is no per-event sequence number and no global order; dedupe on event.event_id. An app sees only its project's events in its token's environment plus public first-party events.",
"anyOf": [
{
"type": "object",
@@@ -1516,16 +1508,10 @@
"items": {
"type": "object",
"required": [
-- "seq",
"cursor",
"event"
],
"properties": {
-- "seq": {
-- "type": "integer",
-- "minimum": 1,
-- "description": "Informational: the event's number in the hot store. Not a position."
-- },
"event": {
"$ref": "#/components/schemas/events.event-envelope.v1"
},
@@@ -1570,16 +1556,10 @@
{
"type": "object",
"required": [
-- "seq",
"cursor",
"event"
],
"properties": {
-- "seq": {
-- "type": "integer",
-- "minimum": 1,
-- "description": "Informational: the event's number in the hot store. Not a position."
-- },
"event": {
"$ref": "#/components/schemas/events.event-envelope.v1"
},
ddiff --git a/generated/openapi/food.json b/generated/openapi/food.json
iindex aab83969..510873d3 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.135.0",
-- "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.135.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.136.0",
++ "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.136.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 578279e2..82743275 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.135.0",
-- "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.135.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.136.0",
++ "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.136.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 cf61af7b..7852ab81 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.135.0",
-- "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.135.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.136.0",
++ "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.136.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 7b168590..c5670b34 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.135.0",
-- "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.135.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.136.0",
++ "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.136.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 12e7aaf6..52e6d8a0 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.135.0",
-- "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.135.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.136.0",
++ "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.136.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 31be7451..aa86644c 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.135.0",
-- "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.135.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.136.0",
++ "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.136.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/network.json b/generated/openapi/network.json
iindex 8725696f..b35e45df 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.135.0",
-- "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.135.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.136.0",
++ "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.136.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 14249c0e..40d2f44e 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.135.0",
-- "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.135.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.136.0",
++ "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.136.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 f24dc71e..8ddcca5e 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.135.0",
-- "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.135.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.136.0",
++ "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.136.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 b3c773fe..db5c4a15 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.135.0",
-- "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.135.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.136.0",
++ "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.136.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 a50ca4ca..d988d873 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.135.0",
-- "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.135.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.136.0",
++ "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.136.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 51eeeab5..96551ea2 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.135.0",
-- "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.135.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.136.0",
++ "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.136.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 412a46d6..bf4be8ca 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.135.0",
-- "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.135.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.136.0",
++ "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.136.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 12304e93..8b5cf5cc 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.135.0",
-- "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.135.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.136.0",
++ "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.136.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 9b9e9a11..ff9bbfbd 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.135.0",
-- "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.135.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.136.0",
++ "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.136.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 e5b49b3a..f120da85 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.135.0",
-- "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.135.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.136.0",
++ "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.136.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 32c44cf9..54badac4 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.135.0",
-- "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.135.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.136.0",
++ "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.136.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 0b48aa0f..d9d967a3 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.135.0",
-- "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.135.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.136.0",
++ "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.136.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 77a1b164..6dade3f6 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.135.0",
-- "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.135.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.136.0",
++ "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.136.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 1b1d831f..8f8fe289 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.135.0",
-- "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.135.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.136.0",
++ "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.136.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 278b8852..3bb52128 100644
---- a/generated/typescript/index.d.ts
++++ b/generated/typescript/index.d.ts
@@@ -11136,20 +11136,19 @@ export type EventsDeliveryAdminResult =
/** [email protected] (owner: events) */
/**
-- * events.publish-result@1: the answer of POST /api/v1/events on OpenVibe.Events (events.event.publish for services, events.app.publish for developer apps). One envelope → { event_id, seq, duplicate, cursor? } (201 when stored, 200 when every event was a repeat); a batch { events: [...] } (at most 100, atomic) → { results } in the same order. Refusals are problem+json: 422 events.invalid_envelope / events.invalid_redaction, 403 events.source_mismatch / events.type_not_allowed / events.actor_mismatch, 413 events.payload_too_large / events.batch_too_large, 429 events.quota_exceeded (apps).
++ * events.publish-result@1: the answer of POST /api/v1/events on OpenVibe.Events (events.event.publish for services, events.app.publish for developer apps). One envelope → { event_id, cursor, duplicate } (201 when stored, 200 when every event was a repeat); a batch { events: [...] } (at most 100, atomic) → { results } in the same order. Refusals are problem+json: 422 events.invalid_envelope / events.invalid_redaction, 403 events.source_mismatch / events.type_not_allowed / events.actor_mismatch, 413 events.payload_too_large / events.batch_too_large, 429 events.quota_exceeded (apps).
*/
export type EventsPublishResult =
| {
event_id: string;
-- seq: number;
/**
-- * true: this event_id was stored before; the stored seq is returned and nothing is stored twice.
++ * true: this event_id was stored before; its stored position is returned and nothing is stored twice.
*/
duplicate: boolean;
/**
-- * Opaque position (ADR-042): hand it back as after= to read on from here, or as Last-Event-ID; never parse it. Returned beside seq for one release; seq then goes.
++ * Opaque position (ADR-042): hand it back as after= to read on from here, or as Last-Event-ID; never parse it.
*/
-- cursor?: string;
++ cursor: string;
}
| {
/**
@@@ -11159,27 +11158,25 @@ export type EventsPublishResult =
results: [
{
event_id: string;
-- seq: number;
/**
-- * true: this event_id was stored before; the stored seq is returned and nothing is stored twice.
++ * true: this event_id was stored before; its stored position is returned and nothing is stored twice.
*/
duplicate: boolean;
/**
-- * Opaque position (ADR-042): hand it back as after= to read on from here, or as Last-Event-ID; never parse it. Returned beside seq for one release; seq then goes.
++ * Opaque position (ADR-042): hand it back as after= to read on from here, or as Last-Event-ID; never parse it.
*/
-- cursor?: string;
++ cursor: string;
},
...{
event_id: string;
-- seq: number;
/**
-- * true: this event_id was stored before; the stored seq is returned and nothing is stored twice.
++ * true: this event_id was stored before; its stored position is returned and nothing is stored twice.
*/
duplicate: boolean;
/**
-- * Opaque position (ADR-042): hand it back as after= to read on from here, or as Last-Event-ID; never parse it. Returned beside seq for one release; seq then goes.
++ * Opaque position (ADR-042): hand it back as after= to read on from here, or as Last-Event-ID; never parse it.
*/
-- cursor?: string;
++ cursor: string;
}[]
];
};
@@@ -11207,7 +11204,7 @@ export type EventsReadRequest =
/** [email protected] (owner: events) */
/**
-- * events.read-result@1: answers of the pull API on OpenVibe.Events. GET /api/v1/events → { events: [{ seq, cursor, event }], next_cursor, latest_cursor, gap? } (keep next_cursor as the position and read on with after=: it moves past events that did not match; latest_cursor is the head, for a consumer that starts at now; without after= a page starts at the oldest retained event; gap { from_seq, to_seq } says events after the position were already pruned by retention); GET /api/v1/events/:event_id → { seq, cursor, event }; GET|PUT /api/v1/checkpoints → { consumer, topic, cursor, carrier, updated_at } (cursor, carrier and updated_at null when none is stored). GET /realtime/stream?topics= (events.event.read) is a Server-Sent Events feed whose messages carry the same { seq, event } with the cursor as the SSE id; it resumes from Last-Event-ID (or last_event_id=) when that is a cursor, and a gap message comes first when the cursor is older than retention. A position is only ever an opaque cursor (ADR-042 decision 7): the per-event seq is informational, and nothing accepts it as a position. An app sees only its project's events in its token's environment plus public first-party events.
++ * events.read-result@1: answers of the pull API on OpenVibe.Events. GET /api/v1/events → { events: [{ cursor, event }], next_cursor, latest_cursor, gap? } (keep next_cursor as the position and read on with after=: it moves past events that did not match; latest_cursor is the head, for a consumer that starts at now; without after= a page starts at the oldest retained event; gap { from_seq, to_seq } says events after the position were already pruned by retention); GET /api/v1/events/:event_id → { cursor, event }; GET|PUT /api/v1/checkpoints → { consumer, topic, cursor, carrier, updated_at } (cursor, carrier and updated_at null when none is stored). GET /realtime/stream?topics= (events.event.read) is a Server-Sent Events feed whose messages carry { event } with the cursor as the SSE id; it resumes from Last-Event-ID (or last_event_id=) when that is a cursor, and a gap message comes first when the cursor is older than retention. A position is only ever an opaque cursor (ADR-042 decision 7): there is no per-event sequence number and no global order; dedupe on event.event_id. An app sees only its project's events in its token's environment plus public first-party events.
*/
export type EventsReadResult =
| {
@@@ -11215,10 +11212,6 @@ export type EventsReadResult =
* @maxItems 1000
*/
events: {
-- /**
-- * Informational: the event's number in the hot store. Not a position.
-- */
-- seq: number;
event: EventEnvelope;
/**
* Opaque position (ADR-042): hand it back as after= to read on from here, or as Last-Event-ID; never parse it.
@@@ -11239,10 +11232,6 @@ export type EventsReadResult =
latest_cursor: string;
}
| {
-- /**
-- * Informational: the event's number in the hot store. Not a position.
-- */
-- seq: number;
event: EventEnvelope;
/**
* Opaque position (ADR-042): hand it back as after= to read on from here, or as Last-Event-ID; never parse it.
ddiff --git a/package.json b/package.json
iindex f42b51d6..fb179a23 100644
---- a/package.json
++++ b/package.json
@@@ -1,6 +1,6 @@
{
"name": "openvibe-contracts",
-- "version": "0.135.0",
++ "version": "0.136.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",