openvibers/openvibe.contracts Commits
Contracts 0.136.0: no per-event sequence number on the Events consumer wire (#89)
Changes
@@@ -4,6 +4,20 @@ All notable changes to `openvibe-contracts`. Releases are git tags (`vX.Y.Z`) thfrom `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@@@ -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."}}}@@@ -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"},@@@ -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 bycursor, 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 (nodelivery rows, compressed payloads, pruned at `retention.replay`); archive = monthly NDJSON objects in objectstorage, restored only by an operator job into `events_archive`. Pulls and scans span hot and replay with one@@@ -1,6 +1,5 @@{"event_id": "evt_01JAB2C3D4E5F6G7H8J9K0MNPQ",-- "seq": 88213,"duplicate": false,"cursor": ""}@@@ -1 +1,4 @@--{ "event_id": "evt_01JAB2C3D4E5F6G7H8J9K0MNPQ", "seq": 0 }++{++ "event_id": "evt_01JAB2C3D4E5F6G7H8J9K0MNPQ",++ "cursor": "c1.0.MA"++}@@@ -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"++ }++ ]++}@@@ -1 +1,5 @@--{ "event_id": "evt_01JAB2C3D4E5F6G7H8J9K0MNPQ", "seq": 88213, "duplicate": false }++{++ "event_id": "evt_01JAB2C3D4E5F6G7H8J9K0MNPQ",++ "duplicate": false,++ "cursor": "c1.0.ODgyMTM"++}@@@ -1,6 +1,5 @@{"event_id": "evt_01JAB2C3D4E5F6G7H8J9K0MNPQ",-- "seq": 88213,"duplicate": false,"cursor": "c1.e0.MTIzNDU"}@@@ -1,7 +1,6 @@{"events": [{-- "seq": 1,"cursor": "c1.0.MQ","event": {"event_type": "x"@@@ -1,7 +1,6 @@{"events": [{-- "seq": 88213,"event": {"event_id": "evt_01JAB2C3D4E5F6G7H8J9K0MNPR","event_type": "app.p01jab2c3d4e5f6g7h8j9k0mnpq.order.created",@@@ -1,7 +1,6 @@{"events": [{-- "seq": 88213,"event": {"event_id": "evt_01JAB2C3D4E5F6G7H8J9K0MNPR","event_type": "app.p01jab2c3d4e5f6g7h8j9k0mnpq.order.created",@@@ -1,7 +1,6 @@{"events": [{-- "seq": 88213,"event": {"event_id": "evt_01JAB2C3D4E5F6G7H8J9K0MNPR","event_type": "app.p01jab2c3d4e5f6g7h8j9k0mnpq.order.created",@@@ -1,7 +1,6 @@{"events": [{-- "seq": 88213,"event": {"event_id": "evt_01JAB2C3D4E5F6G7H8J9K0MNPR","event_type": "app.p01jab2c3d4e5f6g7h8j9k0mnpq.order.created",@@@ -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"},@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"},@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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.@@@ -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",
@@ -4,6 +4,20 @@ All notable changes to `openvibe-contracts`. Releases are git tags (`vX.Y.Z`) th
@@ -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,
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`).
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
## 0.135.0 — 2026-10-10
- **Events, AI and Search get `site` blocks** (name, icon, tagline, what, legal profile, position 31-33). All three
- **Events, AI and Search get `site` blocks** (name, icon, tagline, what, legal profile, position 31-33). All three
@@ -2,13 +2,13 @@
@@ -2,13 +2,13 @@
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://openvibe.network/contracts/events/publish-result.v1.json",
"$id": "https://openvibe.network/contracts/events/publish-result.v1.json",
"title": "EventsPublishResult",
"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": [
"anyOf": [
{
{
"type": "object",
"type": "object",
"required": [
"required": [
"event_id",
"event_id",
- "seq",
+ "cursor",
"duplicate"
"duplicate"
],
],
"properties": {
"properties": {
@@ -16,19 +16,15 @@
@@ -16,19 +16,15 @@
"type": "string",
"type": "string",
"pattern": "^evt_"
"pattern": "^evt_"
},
},
- "seq": {
- "type": "integer",
- "minimum": 1
- },
"duplicate": {
"duplicate": {
"type": "boolean",
"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": {
"cursor": {
"type": "string",
"type": "string",
"minLength": 1,
"minLength": 1,
"maxLength": 200,
"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 @@
@@ -46,7 +42,7 @@
"type": "object",
"type": "object",
"required": [
"required": [
"event_id",
"event_id",
- "seq",
+ "cursor",
"duplicate"
"duplicate"
],
],
"properties": {
"properties": {
@@ -54,19 +50,15 @@
@@ -54,19 +50,15 @@
"type": "string",
"type": "string",
"pattern": "^evt_"
"pattern": "^evt_"
},
},
- "seq": {
- "type": "integer",
- "minimum": 1
- },
"duplicate": {
"duplicate": {
"type": "boolean",
"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": {
"cursor": {
"type": "string",
"type": "string",
"minLength": 1,
"minLength": 1,
"maxLength": 200,
"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."
}
}
}
}
}
}
@@ -2,7 +2,7 @@
@@ -2,7 +2,7 @@
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://openvibe.network/contracts/events/read-result.v1.json",
"$id": "https://openvibe.network/contracts/events/read-result.v1.json",
"title": "EventsReadResult",
"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": [
"anyOf": [
{
{
"type": "object",
"type": "object",
@@ -18,16 +18,10 @@
@@ -18,16 +18,10 @@
"items": {
"items": {
"type": "object",
"type": "object",
"required": [
"required": [
- "seq",
"cursor",
"cursor",
"event"
"event"
],
],
"properties": {
"properties": {
- "seq": {
- "type": "integer",
- "minimum": 1,
- "description": "Informational: the event's number in the hot store. Not a position."
- },
"event": {
"event": {
"$ref": "event-envelope.v1.json"
"$ref": "event-envelope.v1.json"
},
},
@@ -72,16 +66,10 @@
@@ -72,16 +66,10 @@
{
{
"type": "object",
"type": "object",
"required": [
"required": [
- "seq",
"cursor",
"cursor",
"event"
"event"
],
],
"properties": {
"properties": {
- "seq": {
- "type": "integer",
- "minimum": 1,
- "description": "Informational: the event's number in the hot store. Not a position."
- },
"event": {
"event": {
"$ref": "event-envelope.v1.json"
"$ref": "event-envelope.v1.json"
},
},
@@ -56,8 +56,10 @@ cell-local carrier). Amends ADR-004: its "Kafka/NATS now: rejected" is supersede
@@ -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
*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
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.
`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
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
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
storage, restored only by an operator job into `events_archive`. Pulls and scans span hot and replay with one
@@ -1,6 +1,5 @@
@@ -1,6 +1,5 @@
{
{
"event_id": "evt_01JAB2C3D4E5F6G7H8J9K0MNPQ",
"event_id": "evt_01JAB2C3D4E5F6G7H8J9K0MNPQ",
- "seq": 88213,
"duplicate": false,
"duplicate": false,
"cursor": ""
"cursor": ""
}
}
@@ -1 +1,4 @@
@@ -1 +1,4 @@
-{ "event_id": "evt_01JAB2C3D4E5F6G7H8J9K0MNPQ", "seq": 0 }
+{
+ "event_id": "evt_01JAB2C3D4E5F6G7H8J9K0MNPQ",
+ "cursor": "c1.0.MA"
+}
@@ -1 +1,14 @@
@@ -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"
+ }
+ ]
+}
@@ -1 +1,5 @@
@@ -1 +1,5 @@
-{ "event_id": "evt_01JAB2C3D4E5F6G7H8J9K0MNPQ", "seq": 88213, "duplicate": false }
+{
+ "event_id": "evt_01JAB2C3D4E5F6G7H8J9K0MNPQ",
+ "duplicate": false,
+ "cursor": "c1.0.ODgyMTM"
+}
@@ -1,6 +1,5 @@
@@ -1,6 +1,5 @@
{
{
"event_id": "evt_01JAB2C3D4E5F6G7H8J9K0MNPQ",
"event_id": "evt_01JAB2C3D4E5F6G7H8J9K0MNPQ",
- "seq": 88213,
"duplicate": false,
"duplicate": false,
"cursor": "c1.e0.MTIzNDU"
"cursor": "c1.e0.MTIzNDU"
}
}
@@ -1,7 +1,6 @@
@@ -1,7 +1,6 @@
{
{
"events": [
"events": [
{
{
- "seq": 1,
"cursor": "c1.0.MQ",
"cursor": "c1.0.MQ",
"event": {
"event": {
"event_type": "x"
"event_type": "x"
@@ -1,7 +1,6 @@
@@ -1,7 +1,6 @@
{
{
"events": [
"events": [
{
{
- "seq": 88213,
"event": {
"event": {
"event_id": "evt_01JAB2C3D4E5F6G7H8J9K0MNPR",
"event_id": "evt_01JAB2C3D4E5F6G7H8J9K0MNPR",
"event_type": "app.p01jab2c3d4e5f6g7h8j9k0mnpq.order.created",
"event_type": "app.p01jab2c3d4e5f6g7h8j9k0mnpq.order.created",
@@ -1,7 +1,6 @@
@@ -1,7 +1,6 @@
{
{
"events": [
"events": [
{
{
- "seq": 88213,
"event": {
"event": {
"event_id": "evt_01JAB2C3D4E5F6G7H8J9K0MNPR",
"event_id": "evt_01JAB2C3D4E5F6G7H8J9K0MNPR",
"event_type": "app.p01jab2c3d4e5f6g7h8j9k0mnpq.order.created",
"event_type": "app.p01jab2c3d4e5f6g7h8j9k0mnpq.order.created",
@@ -1,7 +1,6 @@
@@ -1,7 +1,6 @@
{
{
"events": [
"events": [
{
{
- "seq": 88213,
"event": {
"event": {
"event_id": "evt_01JAB2C3D4E5F6G7H8J9K0MNPR",
"event_id": "evt_01JAB2C3D4E5F6G7H8J9K0MNPR",
"event_type": "app.p01jab2c3d4e5f6g7h8j9k0mnpq.order.created",
"event_type": "app.p01jab2c3d4e5f6g7h8j9k0mnpq.order.created",
@@ -1,7 +1,6 @@
@@ -1,7 +1,6 @@
{
{
"events": [
"events": [
{
{
- "seq": 88213,
"event": {
"event": {
"event_id": "evt_01JAB2C3D4E5F6G7H8J9K0MNPR",
"event_id": "evt_01JAB2C3D4E5F6G7H8J9K0MNPR",
"event_type": "app.p01jab2c3d4e5f6g7h8j9k0mnpq.order.created",
"event_type": "app.p01jab2c3d4e5f6g7h8j9k0mnpq.order.created",
@@ -5977,13 +5977,13 @@
@@ -5977,13 +5977,13 @@
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://openvibe.network/contracts/events/publish-result.v1.json",
"$id": "https://openvibe.network/contracts/events/publish-result.v1.json",
"title": "EventsPublishResult",
"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": [
"anyOf": [
{
{
"type": "object",
"type": "object",
"required": [
"required": [
"event_id",
"event_id",
- "seq",
+ "cursor",
"duplicate"
"duplicate"
],
],
"properties": {
"properties": {
@@ -5991,19 +5991,15 @@
@@ -5991,19 +5991,15 @@
"type": "string",
"type": "string",
"pattern": "^evt_"
"pattern": "^evt_"
},
},
- "seq": {
- "type": "integer",
- "minimum": 1
- },
"duplicate": {
"duplicate": {
"type": "boolean",
"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": {
"cursor": {
"type": "string",
"type": "string",
"minLength": 1,
"minLength": 1,
"maxLength": 200,
"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 @@
@@ -6021,7 +6017,7 @@
"type": "object",
"type": "object",
"required": [
"required": [
"event_id",
"event_id",
- "seq",
+ "cursor",
"duplicate"
"duplicate"
],
],
"properties": {
"properties": {
@@ -6029,19 +6025,15 @@
@@ -6029,19 +6025,15 @@
"type": "string",
"type": "string",
"pattern": "^evt_"
"pattern": "^evt_"
},
},
- "seq": {
- "type": "integer",
- "minimum": 1
- },
"duplicate": {
"duplicate": {
"type": "boolean",
"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": {
"cursor": {
"type": "string",
"type": "string",
"minLength": 1,
"minLength": 1,
"maxLength": 200,
"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 @@
@@ -6102,7 +6094,7 @@
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://openvibe.network/contracts/events/read-result.v1.json",
"$id": "https://openvibe.network/contracts/events/read-result.v1.json",
"title": "EventsReadResult",
"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": [
"anyOf": [
{
{
"type": "object",
"type": "object",
@@ -6118,16 +6110,10 @@
@@ -6118,16 +6110,10 @@
"items": {
"items": {
"type": "object",
"type": "object",
"required": [
"required": [
- "seq",
"cursor",
"cursor",
"event"
"event"
],
],
"properties": {
"properties": {
- "seq": {
- "type": "integer",
- "minimum": 1,
- "description": "Informational: the event's number in the hot store. Not a position."
- },
"event": {
"event": {
"$ref": "event-envelope.v1.json"
"$ref": "event-envelope.v1.json"
},
},
@@ -6172,16 +6158,10 @@
@@ -6172,16 +6158,10 @@
{
{
"type": "object",
"type": "object",
"required": [
"required": [
- "seq",
"cursor",
"cursor",
"event"
"event"
],
],
"properties": {
"properties": {
- "seq": {
- "type": "integer",
- "minimum": 1,
- "description": "Informational: the event's number in the hot store. Not a position."
- },
"event": {
"event": {
"$ref": "event-envelope.v1.json"
"$ref": "event-envelope.v1.json"
},
},
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Actor API",
"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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.AI API",
"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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Billing API",
"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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Blog API",
"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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Bot API",
"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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Chat API",
"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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Community API",
"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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Coupons API",
"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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Deals API",
"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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Events API",
"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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -1389,13 +1389,13 @@
@@ -1389,13 +1389,13 @@
},
},
"events.publish-result.v1": {
"events.publish-result.v1": {
"title": "EventsPublishResult",
"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": [
"anyOf": [
{
{
"type": "object",
"type": "object",
"required": [
"required": [
"event_id",
"event_id",
- "seq",
+ "cursor",
"duplicate"
"duplicate"
],
],
"properties": {
"properties": {
@@ -1403,19 +1403,15 @@
@@ -1403,19 +1403,15 @@
"type": "string",
"type": "string",
"pattern": "^evt_"
"pattern": "^evt_"
},
},
- "seq": {
- "type": "integer",
- "minimum": 1
- },
"duplicate": {
"duplicate": {
"type": "boolean",
"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": {
"cursor": {
"type": "string",
"type": "string",
"minLength": 1,
"minLength": 1,
"maxLength": 200,
"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 @@
@@ -1433,7 +1429,7 @@
"type": "object",
"type": "object",
"required": [
"required": [
"event_id",
"event_id",
- "seq",
+ "cursor",
"duplicate"
"duplicate"
],
],
"properties": {
"properties": {
@@ -1441,19 +1437,15 @@
@@ -1441,19 +1437,15 @@
"type": "string",
"type": "string",
"pattern": "^evt_"
"pattern": "^evt_"
},
},
- "seq": {
- "type": "integer",
- "minimum": 1
- },
"duplicate": {
"duplicate": {
"type": "boolean",
"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": {
"cursor": {
"type": "string",
"type": "string",
"minLength": 1,
"minLength": 1,
"maxLength": 200,
"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 @@
@@ -1500,7 +1492,7 @@
},
},
"events.read-result.v1": {
"events.read-result.v1": {
"title": "EventsReadResult",
"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": [
"anyOf": [
{
{
"type": "object",
"type": "object",
@@ -1516,16 +1508,10 @@
@@ -1516,16 +1508,10 @@
"items": {
"items": {
"type": "object",
"type": "object",
"required": [
"required": [
- "seq",
"cursor",
"cursor",
"event"
"event"
],
],
"properties": {
"properties": {
- "seq": {
- "type": "integer",
- "minimum": 1,
- "description": "Informational: the event's number in the hot store. Not a position."
- },
"event": {
"event": {
"$ref": "#/components/schemas/events.event-envelope.v1"
"$ref": "#/components/schemas/events.event-envelope.v1"
},
},
@@ -1570,16 +1556,10 @@
@@ -1570,16 +1556,10 @@
{
{
"type": "object",
"type": "object",
"required": [
"required": [
- "seq",
"cursor",
"cursor",
"event"
"event"
],
],
"properties": {
"properties": {
- "seq": {
- "type": "integer",
- "minimum": 1,
- "description": "Informational: the event's number in the hot store. Not a position."
- },
"event": {
"event": {
"$ref": "#/components/schemas/events.event-envelope.v1"
"$ref": "#/components/schemas/events.event-envelope.v1"
},
},
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Food API",
"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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Games API",
"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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Host API",
"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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Inventory API",
"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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Live API",
"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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Media API",
"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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Network API",
"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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.News API",
"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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenRestream API",
"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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Reviews API",
"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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Run API",
"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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Search API",
"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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Services API",
"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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Sources API",
"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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Tips API",
"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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Tools API",
"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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Trade API",
"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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.VIP API",
"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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Watch API",
"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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Wiki API",
"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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -11136,20 +11136,19 @@ export type EventsDeliveryAdminResult =
@@ -11136,20 +11136,19 @@ export type EventsDeliveryAdminResult =
/** [email protected] (owner: events) */
/** [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 =
export type EventsPublishResult =
| {
| {
event_id: 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;
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 =
@@ -11159,27 +11158,25 @@ export type EventsPublishResult =
results: [
results: [
{
{
event_id: 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;
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;
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;
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 =
@@ -11207,7 +11204,7 @@ export type EventsReadRequest =
/** [email protected] (owner: events) */
/** [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 =
export type EventsReadResult =
| {
| {
@@ -11215,10 +11212,6 @@ export type EventsReadResult =
@@ -11215,10 +11212,6 @@ export type EventsReadResult =
* @maxItems 1000
* @maxItems 1000
*/
*/
events: {
events: {
- /**
- * Informational: the event's number in the hot store. Not a position.
- */
- seq: number;
event: EventEnvelope;
event: EventEnvelope;
/**
/**
* Opaque position (ADR-042): hand it back as after= to read on from here, or as Last-Event-ID; never parse it.
* 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 =
@@ -11239,10 +11232,6 @@ export type EventsReadResult =
latest_cursor: string;
latest_cursor: string;
}
}
| {
| {
- /**
- * Informational: the event's number in the hot store. Not a position.
- */
- seq: number;
event: EventEnvelope;
event: EventEnvelope;
/**
/**
* Opaque position (ADR-042): hand it back as after= to read on from here, or as Last-Event-ID; never parse it.
* Opaque position (ADR-042): hand it back as after= to read on from here, or as Last-Event-ID; never parse it.
@@ -1,6 +1,6 @@
@@ -1,6 +1,6 @@
{
{
"name": "openvibe-contracts",
"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.",
"description": "Machine-readable contracts for the OpenVibe network: schemas, manifests, ids, error envelope, capability checks.",
"main": "index.js",
"main": "index.js",
"types": "generated/typescript/index.d.ts",
"types": "generated/typescript/index.d.ts",