openvibers/openvibe.contracts Commits

0.230.0: OpenVibe.Today is live at openvibe.today (the Today room v1: schedules, Remind, calendar feeds, the brief; today.event.scheduled|updated|cancelled) (#238)

OP OpenVibers committed 16 days ago · 9e57a6a8c1 · 58 files, +1039 −75

Changes

ddiff --git a/CHANGELOG.md b/CHANGELOG.md
iindex 3a263aa9..d4d515cd 100644
---- a/CHANGELOG.md
++++ b/CHANGELOG.md
@@@ -4,6 +4,20 @@ All notable changes to `openvibe-contracts`. Releases are git tags (`vX.Y.Z`) th
from `https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/<tag>`. Before v0.30.0,
the notes were in the tag and commit messages (`git tag -n1`).
++## 0.230.0 — 2026-10-28
++
++- **OpenVibe.Today** (`today`, live at openvibe.today, port 5100, database `ov_today`; plan 2026-10-28 §5.3, the Today
++ room). v1 is the network's calendar authority:
++ - stream and event schedules;
++ - reminders sent as Network notifications;
++ - calendar feeds: a channel's public one and a person's private one (RFC 5545);
++ - the daily brief.
++
++ It publishes `today.event.scheduled`, `today.event.updated` and `today.event.cancelled` (new payload contracts,
++ first-party) from an outbox. It consumes `live.stream.started` and `live.stream.ended` to move a stream live and
++ then ended. The site block (Today, icon `today`, position 40, legal profile `account`) puts it in News & answers.
++ `today.*` is its namespace.
++
## 0.229.0 — 2026-10-28
- **The Action Center** (plan 2026-10-28 §3.10, NOTIF-5): one list of a person's agent work on every site.
ddiff --git a/contracts/catalog.json b/contracts/catalog.json
iindex 24384157..bac4c24a 100644
---- a/contracts/catalog.json
++++ b/contracts/catalog.json
@@@ -7622,6 +7622,33 @@
"visibility": "public",
"compatibility": "backward",
"status": "active"
++ },
++ {
++ "id": "today.event.scheduled",
++ "version": "1.0.0",
++ "owner": "today",
++ "schema": "events/payloads/today.event.scheduled.v1.json",
++ "visibility": "first-party",
++ "compatibility": "backward",
++ "status": "active"
++ },
++ {
++ "id": "today.event.updated",
++ "version": "1.0.0",
++ "owner": "today",
++ "schema": "events/payloads/today.event.updated.v1.json",
++ "visibility": "first-party",
++ "compatibility": "backward",
++ "status": "active"
++ },
++ {
++ "id": "today.event.cancelled",
++ "version": "1.0.0",
++ "owner": "today",
++ "schema": "events/payloads/today.event.cancelled.v1.json",
++ "visibility": "first-party",
++ "compatibility": "backward",
++ "status": "active"
}
]
}
ddiff --git a/contracts/events/payloads/today.event.cancelled.v1.json b/contracts/events/payloads/today.event.cancelled.v1.json
nnew file mode 100644
iindex 00000000..01cffa7d
---- /dev/null
++++ b/contracts/events/payloads/today.event.cancelled.v1.json
@@@ -0,0 +1,93 @@
++{
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/events/payloads/today.event.cancelled.v1.json",
++ "title": "TodayEventCancelledPayload",
++ "description": "today.event.cancelled v1 (OpenVibe.Today server/events/store.js, written to its outbox in the same transaction as the change and published once per evt_ id). Its owner cancelled it: calendars that subscribe drop it (STATUS:CANCELLED), and OpenVibe.Network clears the followers' notices. Envelope: source today, subject and actor { type: user, id: <owner usr_> }, visibility internal, priority important. OpenVibe.Network tells a streamer's followers about a scheduled public or followers-only stream (STREAM_SCHEDULED) and clears those notices on cancel (server/notifications/events-consumer.js).",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "event_id",
++ "kind",
++ "channel",
++ "title",
++ "starts_at",
++ "ends_at",
++ "tz",
++ "status",
++ "visibility",
++ "url",
++ "seq"
++ ],
++ "properties": {
++ "event_id": {
++ "type": "string",
++ "pattern": "^tev_[0-9A-HJKMNP-TV-Z]{20}$",
++ "description": "Today's id for the calendar entry (not the envelope's evt_ id)."
++ },
++ "kind": {
++ "enum": [
++ "stream",
++ "event"
++ ]
++ },
++ "channel": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "maxLength": 64,
++ "description": "The owner's Live username for a stream; null for an event."
++ },
++ "title": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 120
++ },
++ "starts_at": {
++ "type": "string",
++ "format": "date-time"
++ },
++ "ends_at": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "format": "date-time"
++ },
++ "tz": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 64,
++ "description": "The IANA zone it was scheduled in."
++ },
++ "status": {
++ "enum": [
++ "scheduled",
++ "live",
++ "done",
++ "cancelled"
++ ]
++ },
++ "visibility": {
++ "enum": [
++ "public",
++ "followers"
++ ]
++ },
++ "url": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "format": "uri",
++ "pattern": "^https://",
++ "maxLength": 2048,
++ "description": "Where it happens (a stream: its Live channel page)."
++ },
++ "seq": {
++ "type": "integer",
++ "minimum": 0,
++ "description": "The calendar SEQUENCE: up by one with every change."
++ }
++ }
++}
ddiff --git a/contracts/events/payloads/today.event.scheduled.v1.json b/contracts/events/payloads/today.event.scheduled.v1.json
nnew file mode 100644
iindex 00000000..3bcaad02
---- /dev/null
++++ b/contracts/events/payloads/today.event.scheduled.v1.json
@@@ -0,0 +1,93 @@
++{
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/events/payloads/today.event.scheduled.v1.json",
++ "title": "TodayEventScheduledPayload",
++ "description": "today.event.scheduled v1 (OpenVibe.Today server/events/store.js, written to its outbox in the same transaction as the change and published once per evt_ id). A person put a stream or an event on OpenVibe.Today's calendar (POST /api/v1/events or the schedule form). Envelope: source today, subject and actor { type: user, id: <owner usr_> }, visibility internal, priority important. OpenVibe.Network tells a streamer's followers about a scheduled public or followers-only stream (STREAM_SCHEDULED) and clears those notices on cancel (server/notifications/events-consumer.js).",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "event_id",
++ "kind",
++ "channel",
++ "title",
++ "starts_at",
++ "ends_at",
++ "tz",
++ "status",
++ "visibility",
++ "url",
++ "seq"
++ ],
++ "properties": {
++ "event_id": {
++ "type": "string",
++ "pattern": "^tev_[0-9A-HJKMNP-TV-Z]{20}$",
++ "description": "Today's id for the calendar entry (not the envelope's evt_ id)."
++ },
++ "kind": {
++ "enum": [
++ "stream",
++ "event"
++ ]
++ },
++ "channel": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "maxLength": 64,
++ "description": "The owner's Live username for a stream; null for an event."
++ },
++ "title": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 120
++ },
++ "starts_at": {
++ "type": "string",
++ "format": "date-time"
++ },
++ "ends_at": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "format": "date-time"
++ },
++ "tz": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 64,
++ "description": "The IANA zone it was scheduled in."
++ },
++ "status": {
++ "enum": [
++ "scheduled",
++ "live",
++ "done",
++ "cancelled"
++ ]
++ },
++ "visibility": {
++ "enum": [
++ "public",
++ "followers"
++ ]
++ },
++ "url": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "format": "uri",
++ "pattern": "^https://",
++ "maxLength": 2048,
++ "description": "Where it happens (a stream: its Live channel page)."
++ },
++ "seq": {
++ "type": "integer",
++ "minimum": 0,
++ "description": "The calendar SEQUENCE: up by one with every change."
++ }
++ }
++}
ddiff --git a/contracts/events/payloads/today.event.updated.v1.json b/contracts/events/payloads/today.event.updated.v1.json
nnew file mode 100644
iindex 00000000..e4d5114b
---- /dev/null
++++ b/contracts/events/payloads/today.event.updated.v1.json
@@@ -0,0 +1,93 @@
++{
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/events/payloads/today.event.updated.v1.json",
++ "title": "TodayEventUpdatedPayload",
++ "description": "today.event.updated v1 (OpenVibe.Today server/events/store.js, written to its outbox in the same transaction as the change and published once per evt_ id). Its title, times, zone, description or visibility changed (seq went up), or it went live or ended (live.stream.started / ended). Envelope: source today, subject and actor { type: user, id: <owner usr_> }, visibility internal, priority important. OpenVibe.Network tells a streamer's followers about a scheduled public or followers-only stream (STREAM_SCHEDULED) and clears those notices on cancel (server/notifications/events-consumer.js).",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "event_id",
++ "kind",
++ "channel",
++ "title",
++ "starts_at",
++ "ends_at",
++ "tz",
++ "status",
++ "visibility",
++ "url",
++ "seq"
++ ],
++ "properties": {
++ "event_id": {
++ "type": "string",
++ "pattern": "^tev_[0-9A-HJKMNP-TV-Z]{20}$",
++ "description": "Today's id for the calendar entry (not the envelope's evt_ id)."
++ },
++ "kind": {
++ "enum": [
++ "stream",
++ "event"
++ ]
++ },
++ "channel": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "maxLength": 64,
++ "description": "The owner's Live username for a stream; null for an event."
++ },
++ "title": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 120
++ },
++ "starts_at": {
++ "type": "string",
++ "format": "date-time"
++ },
++ "ends_at": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "format": "date-time"
++ },
++ "tz": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 64,
++ "description": "The IANA zone it was scheduled in."
++ },
++ "status": {
++ "enum": [
++ "scheduled",
++ "live",
++ "done",
++ "cancelled"
++ ]
++ },
++ "visibility": {
++ "enum": [
++ "public",
++ "followers"
++ ]
++ },
++ "url": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "format": "uri",
++ "pattern": "^https://",
++ "maxLength": 2048,
++ "description": "Where it happens (a stream: its Live channel page)."
++ },
++ "seq": {
++ "type": "integer",
++ "minimum": 0,
++ "description": "The calendar SEQUENCE: up by one with every change."
++ }
++ }
++}
ddiff --git a/fixtures/today.event.cancelled/invalid/evt-id.json b/fixtures/today.event.cancelled/invalid/evt-id.json
nnew file mode 100644
iindex 00000000..d86c467d
---- /dev/null
++++ b/fixtures/today.event.cancelled/invalid/evt-id.json
@@@ -0,0 +1,13 @@
++{
++ "event_id": "evt_01JAB2C3D4E5F6G7H8J9K0MNPQ",
++ "kind": "stream",
++ "channel": "carol",
++ "title": "Robot build, part 2",
++ "starts_at": "2026-10-30T03:00:00.000Z",
++ "ends_at": "2026-10-30T05:00:00.000Z",
++ "tz": "America/Los_Angeles",
++ "status": "cancelled",
++ "visibility": "public",
++ "url": "https://openvibe.live/@carol",
++ "seq": 1
++}
ddiff --git a/fixtures/today.event.cancelled/invalid/owner-in-payload.json b/fixtures/today.event.cancelled/invalid/owner-in-payload.json
nnew file mode 100644
iindex 00000000..774f99b1
---- /dev/null
++++ b/fixtures/today.event.cancelled/invalid/owner-in-payload.json
@@@ -0,0 +1,14 @@
++{
++ "event_id": "tev_01JAB2C3D4E5F6G7H8J9",
++ "kind": "stream",
++ "channel": "carol",
++ "title": "Robot build, part 2",
++ "starts_at": "2026-10-30T03:00:00.000Z",
++ "ends_at": "2026-10-30T05:00:00.000Z",
++ "tz": "America/Los_Angeles",
++ "status": "cancelled",
++ "visibility": "public",
++ "url": "https://openvibe.live/@carol",
++ "seq": 1,
++ "owner_subject": "usr_01JAB2C3D4E5F6G7H8J9K0MNPQ"
++}
ddiff --git a/fixtures/today.event.cancelled/valid/event.json b/fixtures/today.event.cancelled/valid/event.json
nnew file mode 100644
iindex 00000000..1af315f3
---- /dev/null
++++ b/fixtures/today.event.cancelled/valid/event.json
@@@ -0,0 +1,13 @@
++{
++ "event_id": "tev_01JAB2C3D4E5F6G7H8J9",
++ "kind": "event",
++ "channel": null,
++ "title": "Robot build, part 2",
++ "starts_at": "2026-10-30T03:00:00.000Z",
++ "ends_at": null,
++ "tz": "America/Los_Angeles",
++ "status": "cancelled",
++ "visibility": "public",
++ "url": null,
++ "seq": 1
++}
ddiff --git a/fixtures/today.event.cancelled/valid/stream.json b/fixtures/today.event.cancelled/valid/stream.json
nnew file mode 100644
iindex 00000000..3ac2c1ed
---- /dev/null
++++ b/fixtures/today.event.cancelled/valid/stream.json
@@@ -0,0 +1,13 @@
++{
++ "event_id": "tev_01JAB2C3D4E5F6G7H8J9",
++ "kind": "stream",
++ "channel": "carol",
++ "title": "Robot build, part 2",
++ "starts_at": "2026-10-30T03:00:00.000Z",
++ "ends_at": "2026-10-30T05:00:00.000Z",
++ "tz": "America/Los_Angeles",
++ "status": "cancelled",
++ "visibility": "public",
++ "url": "https://openvibe.live/@carol",
++ "seq": 1
++}
ddiff --git a/fixtures/today.event.scheduled/invalid/evt-id.json b/fixtures/today.event.scheduled/invalid/evt-id.json
nnew file mode 100644
iindex 00000000..8129b544
---- /dev/null
++++ b/fixtures/today.event.scheduled/invalid/evt-id.json
@@@ -0,0 +1,13 @@
++{
++ "event_id": "evt_01JAB2C3D4E5F6G7H8J9K0MNPQ",
++ "kind": "stream",
++ "channel": "carol",
++ "title": "Robot build, part 2",
++ "starts_at": "2026-10-30T03:00:00.000Z",
++ "ends_at": "2026-10-30T05:00:00.000Z",
++ "tz": "America/Los_Angeles",
++ "status": "scheduled",
++ "visibility": "public",
++ "url": "https://openvibe.live/@carol",
++ "seq": 0
++}
ddiff --git a/fixtures/today.event.scheduled/invalid/owner-in-payload.json b/fixtures/today.event.scheduled/invalid/owner-in-payload.json
nnew file mode 100644
iindex 00000000..cf173582
---- /dev/null
++++ b/fixtures/today.event.scheduled/invalid/owner-in-payload.json
@@@ -0,0 +1,14 @@
++{
++ "event_id": "tev_01JAB2C3D4E5F6G7H8J9",
++ "kind": "stream",
++ "channel": "carol",
++ "title": "Robot build, part 2",
++ "starts_at": "2026-10-30T03:00:00.000Z",
++ "ends_at": "2026-10-30T05:00:00.000Z",
++ "tz": "America/Los_Angeles",
++ "status": "scheduled",
++ "visibility": "public",
++ "url": "https://openvibe.live/@carol",
++ "seq": 0,
++ "owner_subject": "usr_01JAB2C3D4E5F6G7H8J9K0MNPQ"
++}
ddiff --git a/fixtures/today.event.scheduled/valid/event.json b/fixtures/today.event.scheduled/valid/event.json
nnew file mode 100644
iindex 00000000..8a604b30
---- /dev/null
++++ b/fixtures/today.event.scheduled/valid/event.json
@@@ -0,0 +1,13 @@
++{
++ "event_id": "tev_01JAB2C3D4E5F6G7H8J9",
++ "kind": "event",
++ "channel": null,
++ "title": "Robot build, part 2",
++ "starts_at": "2026-10-30T03:00:00.000Z",
++ "ends_at": null,
++ "tz": "America/Los_Angeles",
++ "status": "scheduled",
++ "visibility": "public",
++ "url": null,
++ "seq": 0
++}
ddiff --git a/fixtures/today.event.scheduled/valid/stream.json b/fixtures/today.event.scheduled/valid/stream.json
nnew file mode 100644
iindex 00000000..23ecd0df
---- /dev/null
++++ b/fixtures/today.event.scheduled/valid/stream.json
@@@ -0,0 +1,13 @@
++{
++ "event_id": "tev_01JAB2C3D4E5F6G7H8J9",
++ "kind": "stream",
++ "channel": "carol",
++ "title": "Robot build, part 2",
++ "starts_at": "2026-10-30T03:00:00.000Z",
++ "ends_at": "2026-10-30T05:00:00.000Z",
++ "tz": "America/Los_Angeles",
++ "status": "scheduled",
++ "visibility": "public",
++ "url": "https://openvibe.live/@carol",
++ "seq": 0
++}
ddiff --git a/fixtures/today.event.updated/invalid/evt-id.json b/fixtures/today.event.updated/invalid/evt-id.json
nnew file mode 100644
iindex 00000000..1e866380
---- /dev/null
++++ b/fixtures/today.event.updated/invalid/evt-id.json
@@@ -0,0 +1,13 @@
++{
++ "event_id": "evt_01JAB2C3D4E5F6G7H8J9K0MNPQ",
++ "kind": "stream",
++ "channel": "carol",
++ "title": "Robot build, part 2",
++ "starts_at": "2026-10-30T03:00:00.000Z",
++ "ends_at": "2026-10-30T05:00:00.000Z",
++ "tz": "America/Los_Angeles",
++ "status": "scheduled",
++ "visibility": "public",
++ "url": "https://openvibe.live/@carol",
++ "seq": 1
++}
ddiff --git a/fixtures/today.event.updated/invalid/owner-in-payload.json b/fixtures/today.event.updated/invalid/owner-in-payload.json
nnew file mode 100644
iindex 00000000..8443e804
---- /dev/null
++++ b/fixtures/today.event.updated/invalid/owner-in-payload.json
@@@ -0,0 +1,14 @@
++{
++ "event_id": "tev_01JAB2C3D4E5F6G7H8J9",
++ "kind": "stream",
++ "channel": "carol",
++ "title": "Robot build, part 2",
++ "starts_at": "2026-10-30T03:00:00.000Z",
++ "ends_at": "2026-10-30T05:00:00.000Z",
++ "tz": "America/Los_Angeles",
++ "status": "scheduled",
++ "visibility": "public",
++ "url": "https://openvibe.live/@carol",
++ "seq": 1,
++ "owner_subject": "usr_01JAB2C3D4E5F6G7H8J9K0MNPQ"
++}
ddiff --git a/fixtures/today.event.updated/valid/event.json b/fixtures/today.event.updated/valid/event.json
nnew file mode 100644
iindex 00000000..8f9ca0fc
---- /dev/null
++++ b/fixtures/today.event.updated/valid/event.json
@@@ -0,0 +1,13 @@
++{
++ "event_id": "tev_01JAB2C3D4E5F6G7H8J9",
++ "kind": "event",
++ "channel": null,
++ "title": "Robot build, part 2",
++ "starts_at": "2026-10-30T03:00:00.000Z",
++ "ends_at": null,
++ "tz": "America/Los_Angeles",
++ "status": "scheduled",
++ "visibility": "public",
++ "url": null,
++ "seq": 1
++}
ddiff --git a/fixtures/today.event.updated/valid/stream.json b/fixtures/today.event.updated/valid/stream.json
nnew file mode 100644
iindex 00000000..eba7efe9
---- /dev/null
++++ b/fixtures/today.event.updated/valid/stream.json
@@@ -0,0 +1,13 @@
++{
++ "event_id": "tev_01JAB2C3D4E5F6G7H8J9",
++ "kind": "stream",
++ "channel": "carol",
++ "title": "Robot build, part 2",
++ "starts_at": "2026-10-30T03:00:00.000Z",
++ "ends_at": "2026-10-30T05:00:00.000Z",
++ "tz": "America/Los_Angeles",
++ "status": "scheduled",
++ "visibility": "public",
++ "url": "https://openvibe.live/@carol",
++ "seq": 1
++}
ddiff --git a/generated/json-schema/bundle.json b/generated/json-schema/bundle.json
iindex 2a92b23e..1909149e 100644
---- a/generated/json-schema/bundle.json
++++ b/generated/json-schema/bundle.json
@@@ -85580,6 +85580,300 @@
}
}
}
++ },
++ "today.event.scheduled": {
++ "version": "1.0.0",
++ "owner": "today",
++ "status": "active",
++ "schema": {
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/events/payloads/today.event.scheduled.v1.json",
++ "title": "TodayEventScheduledPayload",
++ "description": "today.event.scheduled v1 (OpenVibe.Today server/events/store.js, written to its outbox in the same transaction as the change and published once per evt_ id). A person put a stream or an event on OpenVibe.Today's calendar (POST /api/v1/events or the schedule form). Envelope: source today, subject and actor { type: user, id: <owner usr_> }, visibility internal, priority important. OpenVibe.Network tells a streamer's followers about a scheduled public or followers-only stream (STREAM_SCHEDULED) and clears those notices on cancel (server/notifications/events-consumer.js).",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "event_id",
++ "kind",
++ "channel",
++ "title",
++ "starts_at",
++ "ends_at",
++ "tz",
++ "status",
++ "visibility",
++ "url",
++ "seq"
++ ],
++ "properties": {
++ "event_id": {
++ "type": "string",
++ "pattern": "^tev_[0-9A-HJKMNP-TV-Z]{20}$",
++ "description": "Today's id for the calendar entry (not the envelope's evt_ id)."
++ },
++ "kind": {
++ "enum": [
++ "stream",
++ "event"
++ ]
++ },
++ "channel": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "maxLength": 64,
++ "description": "The owner's Live username for a stream; null for an event."
++ },
++ "title": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 120
++ },
++ "starts_at": {
++ "type": "string",
++ "format": "date-time"
++ },
++ "ends_at": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "format": "date-time"
++ },
++ "tz": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 64,
++ "description": "The IANA zone it was scheduled in."
++ },
++ "status": {
++ "enum": [
++ "scheduled",
++ "live",
++ "done",
++ "cancelled"
++ ]
++ },
++ "visibility": {
++ "enum": [
++ "public",
++ "followers"
++ ]
++ },
++ "url": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "format": "uri",
++ "pattern": "^https://",
++ "maxLength": 2048,
++ "description": "Where it happens (a stream: its Live channel page)."
++ },
++ "seq": {
++ "type": "integer",
++ "minimum": 0,
++ "description": "The calendar SEQUENCE: up by one with every change."
++ }
++ }
++ }
++ },
++ "today.event.updated": {
++ "version": "1.0.0",
++ "owner": "today",
++ "status": "active",
++ "schema": {
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/events/payloads/today.event.updated.v1.json",
++ "title": "TodayEventUpdatedPayload",
++ "description": "today.event.updated v1 (OpenVibe.Today server/events/store.js, written to its outbox in the same transaction as the change and published once per evt_ id). Its title, times, zone, description or visibility changed (seq went up), or it went live or ended (live.stream.started / ended). Envelope: source today, subject and actor { type: user, id: <owner usr_> }, visibility internal, priority important. OpenVibe.Network tells a streamer's followers about a scheduled public or followers-only stream (STREAM_SCHEDULED) and clears those notices on cancel (server/notifications/events-consumer.js).",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "event_id",
++ "kind",
++ "channel",
++ "title",
++ "starts_at",
++ "ends_at",
++ "tz",
++ "status",
++ "visibility",
++ "url",
++ "seq"
++ ],
++ "properties": {
++ "event_id": {
++ "type": "string",
++ "pattern": "^tev_[0-9A-HJKMNP-TV-Z]{20}$",
++ "description": "Today's id for the calendar entry (not the envelope's evt_ id)."
++ },
++ "kind": {
++ "enum": [
++ "stream",
++ "event"
++ ]
++ },
++ "channel": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "maxLength": 64,
++ "description": "The owner's Live username for a stream; null for an event."
++ },
++ "title": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 120
++ },
++ "starts_at": {
++ "type": "string",
++ "format": "date-time"
++ },
++ "ends_at": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "format": "date-time"
++ },
++ "tz": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 64,
++ "description": "The IANA zone it was scheduled in."
++ },
++ "status": {
++ "enum": [
++ "scheduled",
++ "live",
++ "done",
++ "cancelled"
++ ]
++ },
++ "visibility": {
++ "enum": [
++ "public",
++ "followers"
++ ]
++ },
++ "url": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "format": "uri",
++ "pattern": "^https://",
++ "maxLength": 2048,
++ "description": "Where it happens (a stream: its Live channel page)."
++ },
++ "seq": {
++ "type": "integer",
++ "minimum": 0,
++ "description": "The calendar SEQUENCE: up by one with every change."
++ }
++ }
++ }
++ },
++ "today.event.cancelled": {
++ "version": "1.0.0",
++ "owner": "today",
++ "status": "active",
++ "schema": {
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/events/payloads/today.event.cancelled.v1.json",
++ "title": "TodayEventCancelledPayload",
++ "description": "today.event.cancelled v1 (OpenVibe.Today server/events/store.js, written to its outbox in the same transaction as the change and published once per evt_ id). Its owner cancelled it: calendars that subscribe drop it (STATUS:CANCELLED), and OpenVibe.Network clears the followers' notices. Envelope: source today, subject and actor { type: user, id: <owner usr_> }, visibility internal, priority important. OpenVibe.Network tells a streamer's followers about a scheduled public or followers-only stream (STREAM_SCHEDULED) and clears those notices on cancel (server/notifications/events-consumer.js).",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "event_id",
++ "kind",
++ "channel",
++ "title",
++ "starts_at",
++ "ends_at",
++ "tz",
++ "status",
++ "visibility",
++ "url",
++ "seq"
++ ],
++ "properties": {
++ "event_id": {
++ "type": "string",
++ "pattern": "^tev_[0-9A-HJKMNP-TV-Z]{20}$",
++ "description": "Today's id for the calendar entry (not the envelope's evt_ id)."
++ },
++ "kind": {
++ "enum": [
++ "stream",
++ "event"
++ ]
++ },
++ "channel": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "maxLength": 64,
++ "description": "The owner's Live username for a stream; null for an event."
++ },
++ "title": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 120
++ },
++ "starts_at": {
++ "type": "string",
++ "format": "date-time"
++ },
++ "ends_at": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "format": "date-time"
++ },
++ "tz": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 64,
++ "description": "The IANA zone it was scheduled in."
++ },
++ "status": {
++ "enum": [
++ "scheduled",
++ "live",
++ "done",
++ "cancelled"
++ ]
++ },
++ "visibility": {
++ "enum": [
++ "public",
++ "followers"
++ ]
++ },
++ "url": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "format": "uri",
++ "pattern": "^https://",
++ "maxLength": 2048,
++ "description": "Where it happens (a stream: its Live channel page)."
++ },
++ "seq": {
++ "type": "integer",
++ "minimum": 0,
++ "description": "The calendar SEQUENCE: up by one with every change."
++ }
++ }
++ }
}
}
}
ddiff --git a/generated/openapi/actor.json b/generated/openapi/actor.json
iindex e2898113..1dbd31c1 100644
---- a/generated/openapi/actor.json
++++ b/generated/openapi/actor.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Actor API",
-- "version": "0.229.0",
-- "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.229.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.230.0",
++ "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.230.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/ai.json b/generated/openapi/ai.json
iindex a5be1366..77e63dd9 100644
---- a/generated/openapi/ai.json
++++ b/generated/openapi/ai.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.AI API",
-- "version": "0.229.0",
-- "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.229.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.230.0",
++ "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.230.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/billing.json b/generated/openapi/billing.json
iindex 7ecc69a9..55cdfa98 100644
---- a/generated/openapi/billing.json
++++ b/generated/openapi/billing.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Billing API",
-- "version": "0.229.0",
-- "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.229.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.230.0",
++ "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.230.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/blog.json b/generated/openapi/blog.json
iindex 21efc479..c507735f 100644
---- a/generated/openapi/blog.json
++++ b/generated/openapi/blog.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Blog API",
-- "version": "0.229.0",
-- "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.229.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.230.0",
++ "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.230.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/bot.json b/generated/openapi/bot.json
iindex 13c5af89..aa5cad3d 100644
---- a/generated/openapi/bot.json
++++ b/generated/openapi/bot.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Bot API",
-- "version": "0.229.0",
-- "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.229.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.230.0",
++ "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.230.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/chat.json b/generated/openapi/chat.json
iindex 83d3fbb0..02e577ad 100644
---- a/generated/openapi/chat.json
++++ b/generated/openapi/chat.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Chat API",
-- "version": "0.229.0",
-- "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.229.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.230.0",
++ "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.230.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/codes.json b/generated/openapi/codes.json
iindex 665c1389..6c6dd66e 100644
---- a/generated/openapi/codes.json
++++ b/generated/openapi/codes.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Codes API",
-- "version": "0.229.0",
-- "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.229.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.230.0",
++ "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.230.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/community.json b/generated/openapi/community.json
iindex 91a61288..bbac5c1b 100644
---- a/generated/openapi/community.json
++++ b/generated/openapi/community.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Community API",
-- "version": "0.229.0",
-- "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.229.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.230.0",
++ "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.230.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/coupons.json b/generated/openapi/coupons.json
iindex fd9f0f1d..5603afa8 100644
---- a/generated/openapi/coupons.json
++++ b/generated/openapi/coupons.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Coupons API",
-- "version": "0.229.0",
-- "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.229.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.230.0",
++ "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.230.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/deals.json b/generated/openapi/deals.json
iindex 7b83af88..8af61650 100644
---- a/generated/openapi/deals.json
++++ b/generated/openapi/deals.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Deals API",
-- "version": "0.229.0",
-- "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.229.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.230.0",
++ "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.230.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/events.json b/generated/openapi/events.json
iindex f9c7c36a..18988071 100644
---- a/generated/openapi/events.json
++++ b/generated/openapi/events.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Events API",
-- "version": "0.229.0",
-- "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.229.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.230.0",
++ "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.230.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/food.json b/generated/openapi/food.json
iindex 484fe8bf..d766e0fa 100644
---- a/generated/openapi/food.json
++++ b/generated/openapi/food.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Food API",
-- "version": "0.229.0",
-- "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.229.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.230.0",
++ "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.230.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/games.json b/generated/openapi/games.json
iindex 1566322b..742db7a8 100644
---- a/generated/openapi/games.json
++++ b/generated/openapi/games.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Games API",
-- "version": "0.229.0",
-- "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.229.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.230.0",
++ "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.230.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/host.json b/generated/openapi/host.json
iindex 962d840c..8734553b 100644
---- a/generated/openapi/host.json
++++ b/generated/openapi/host.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Host API",
-- "version": "0.229.0",
-- "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.229.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.230.0",
++ "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.230.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/inventory.json b/generated/openapi/inventory.json
iindex 38f9b590..cdb849b7 100644
---- a/generated/openapi/inventory.json
++++ b/generated/openapi/inventory.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Inventory API",
-- "version": "0.229.0",
-- "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.229.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.230.0",
++ "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.230.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/live.json b/generated/openapi/live.json
iindex ebc31064..e2e275d5 100644
---- a/generated/openapi/live.json
++++ b/generated/openapi/live.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Live API",
-- "version": "0.229.0",
-- "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.229.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.230.0",
++ "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.230.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/media-hub.json b/generated/openapi/media-hub.json
iindex 49da22df..2d7d69d5 100644
---- a/generated/openapi/media-hub.json
++++ b/generated/openapi/media-hub.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.MediaHub API",
-- "version": "0.229.0",
-- "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.229.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.230.0",
++ "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.230.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/media.json b/generated/openapi/media.json
iindex 715fa2d1..20c2ad5a 100644
---- a/generated/openapi/media.json
++++ b/generated/openapi/media.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Media API",
-- "version": "0.229.0",
-- "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.229.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.230.0",
++ "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.230.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/network.json b/generated/openapi/network.json
iindex 9b8b317c..76298714 100644
---- a/generated/openapi/network.json
++++ b/generated/openapi/network.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Network API",
-- "version": "0.229.0",
-- "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.229.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.230.0",
++ "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.230.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/news.json b/generated/openapi/news.json
iindex 3b768bee..4b296ffe 100644
---- a/generated/openapi/news.json
++++ b/generated/openapi/news.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.News API",
-- "version": "0.229.0",
-- "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.229.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.230.0",
++ "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.230.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/openre.json b/generated/openapi/openre.json
iindex 2dac1200..4233ac2d 100644
---- a/generated/openapi/openre.json
++++ b/generated/openapi/openre.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenRestream API",
-- "version": "0.229.0",
-- "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.229.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.230.0",
++ "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.230.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/play.json b/generated/openapi/play.json
iindex 6944d83b..b9244d35 100644
---- a/generated/openapi/play.json
++++ b/generated/openapi/play.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Play API",
-- "version": "0.229.0",
-- "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.229.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.230.0",
++ "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.230.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/quest.json b/generated/openapi/quest.json
iindex 586021f1..b65caae7 100644
---- a/generated/openapi/quest.json
++++ b/generated/openapi/quest.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Quest API",
-- "version": "0.229.0",
-- "description": "Routes of OpenVibe.Quest as the OpenVibe contracts describe them (openvibe-contracts 0.229.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.230.0",
++ "description": "Routes of OpenVibe.Quest as the OpenVibe contracts describe them (openvibe-contracts 0.230.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/reviews.json b/generated/openapi/reviews.json
iindex 6e9280f2..aa44e9f5 100644
---- a/generated/openapi/reviews.json
++++ b/generated/openapi/reviews.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Reviews API",
-- "version": "0.229.0",
-- "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.229.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.230.0",
++ "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.230.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/run.json b/generated/openapi/run.json
iindex 27446714..c2f4dde0 100644
---- a/generated/openapi/run.json
++++ b/generated/openapi/run.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Run API",
-- "version": "0.229.0",
-- "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.229.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.230.0",
++ "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.230.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/search.json b/generated/openapi/search.json
iindex 1e1d699c..2d5210f7 100644
---- a/generated/openapi/search.json
++++ b/generated/openapi/search.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Search API",
-- "version": "0.229.0",
-- "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.229.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.230.0",
++ "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.230.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/services.json b/generated/openapi/services.json
iindex 1d7ee203..219f9d02 100644
---- a/generated/openapi/services.json
++++ b/generated/openapi/services.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Services API",
-- "version": "0.229.0",
-- "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.229.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.230.0",
++ "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.230.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/sources.json b/generated/openapi/sources.json
iindex 80ca26cf..ec5248b5 100644
---- a/generated/openapi/sources.json
++++ b/generated/openapi/sources.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Sources API",
-- "version": "0.229.0",
-- "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.229.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.230.0",
++ "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.230.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/space.json b/generated/openapi/space.json
iindex c3d5ae5a..3f51ec2c 100644
---- a/generated/openapi/space.json
++++ b/generated/openapi/space.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Space API",
-- "version": "0.229.0",
-- "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.229.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.230.0",
++ "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.230.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/tips.json b/generated/openapi/tips.json
iindex 1354a11f..12836632 100644
---- a/generated/openapi/tips.json
++++ b/generated/openapi/tips.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Tips API",
-- "version": "0.229.0",
-- "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.229.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.230.0",
++ "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.230.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/tools.json b/generated/openapi/tools.json
iindex da9176c1..eee5c2d1 100644
---- a/generated/openapi/tools.json
++++ b/generated/openapi/tools.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Tools API",
-- "version": "0.229.0",
-- "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.229.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.230.0",
++ "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.230.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/trade.json b/generated/openapi/trade.json
iindex a5dce2c5..ff1a16c6 100644
---- a/generated/openapi/trade.json
++++ b/generated/openapi/trade.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Trade API",
-- "version": "0.229.0",
-- "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.229.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.230.0",
++ "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.230.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/vip.json b/generated/openapi/vip.json
iindex 75e77caf..30a90d97 100644
---- a/generated/openapi/vip.json
++++ b/generated/openapi/vip.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.VIP API",
-- "version": "0.229.0",
-- "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.229.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.230.0",
++ "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.230.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/watch.json b/generated/openapi/watch.json
iindex eab55cbb..626b1ea1 100644
---- a/generated/openapi/watch.json
++++ b/generated/openapi/watch.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Watch API",
-- "version": "0.229.0",
-- "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.229.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.230.0",
++ "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.230.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/wiki.json b/generated/openapi/wiki.json
iindex 42fb5568..1d8e264d 100644
---- a/generated/openapi/wiki.json
++++ b/generated/openapi/wiki.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Wiki API",
-- "version": "0.229.0",
-- "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.229.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.230.0",
++ "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.230.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/work.json b/generated/openapi/work.json
iindex e6520f9b..bd33b0c1 100644
---- a/generated/openapi/work.json
++++ b/generated/openapi/work.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Work API",
-- "version": "0.229.0",
-- "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.229.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.230.0",
++ "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.230.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/zone.json b/generated/openapi/zone.json
iindex 26f9b853..4ed476bb 100644
---- a/generated/openapi/zone.json
++++ b/generated/openapi/zone.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Zone API",
-- "version": "0.229.0",
-- "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.229.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.230.0",
++ "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.230.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/typescript/index.d.ts b/generated/typescript/index.d.ts
iindex 1ecae17b..cd16eb19 100644
---- a/generated/typescript/index.d.ts
++++ b/generated/typescript/index.d.ts
@@@ -212534,3 +212534,102 @@ export interface MeActionsResult {
partial: boolean;
generated_at: string;
}
++
++/** [email protected] (owner: today) */
++/**
++ * today.event.scheduled v1 (OpenVibe.Today server/events/store.js, written to its outbox in the same transaction as the change and published once per evt_ id). A person put a stream or an event on OpenVibe.Today's calendar (POST /api/v1/events or the schedule form). Envelope: source today, subject and actor { type: user, id: <owner usr_> }, visibility internal, priority important. OpenVibe.Network tells a streamer's followers about a scheduled public or followers-only stream (STREAM_SCHEDULED) and clears those notices on cancel (server/notifications/events-consumer.js).
++ */
++export interface TodayEventScheduledPayload {
++ /**
++ * Today's id for the calendar entry (not the envelope's evt_ id).
++ */
++ event_id: string;
++ kind: "stream" | "event";
++ /**
++ * The owner's Live username for a stream; null for an event.
++ */
++ channel: string | null;
++ title: string;
++ starts_at: string;
++ ends_at: string | null;
++ /**
++ * The IANA zone it was scheduled in.
++ */
++ tz: string;
++ status: "scheduled" | "live" | "done" | "cancelled";
++ visibility: "public" | "followers";
++ /**
++ * Where it happens (a stream: its Live channel page).
++ */
++ url: string | null;
++ /**
++ * The calendar SEQUENCE: up by one with every change.
++ */
++ seq: number;
++}
++
++/** [email protected] (owner: today) */
++/**
++ * today.event.updated v1 (OpenVibe.Today server/events/store.js, written to its outbox in the same transaction as the change and published once per evt_ id). Its title, times, zone, description or visibility changed (seq went up), or it went live or ended (live.stream.started / ended). Envelope: source today, subject and actor { type: user, id: <owner usr_> }, visibility internal, priority important. OpenVibe.Network tells a streamer's followers about a scheduled public or followers-only stream (STREAM_SCHEDULED) and clears those notices on cancel (server/notifications/events-consumer.js).
++ */
++export interface TodayEventUpdatedPayload {
++ /**
++ * Today's id for the calendar entry (not the envelope's evt_ id).
++ */
++ event_id: string;
++ kind: "stream" | "event";
++ /**
++ * The owner's Live username for a stream; null for an event.
++ */
++ channel: string | null;
++ title: string;
++ starts_at: string;
++ ends_at: string | null;
++ /**
++ * The IANA zone it was scheduled in.
++ */
++ tz: string;
++ status: "scheduled" | "live" | "done" | "cancelled";
++ visibility: "public" | "followers";
++ /**
++ * Where it happens (a stream: its Live channel page).
++ */
++ url: string | null;
++ /**
++ * The calendar SEQUENCE: up by one with every change.
++ */
++ seq: number;
++}
++
++/** [email protected] (owner: today) */
++/**
++ * today.event.cancelled v1 (OpenVibe.Today server/events/store.js, written to its outbox in the same transaction as the change and published once per evt_ id). Its owner cancelled it: calendars that subscribe drop it (STATUS:CANCELLED), and OpenVibe.Network clears the followers' notices. Envelope: source today, subject and actor { type: user, id: <owner usr_> }, visibility internal, priority important. OpenVibe.Network tells a streamer's followers about a scheduled public or followers-only stream (STREAM_SCHEDULED) and clears those notices on cancel (server/notifications/events-consumer.js).
++ */
++export interface TodayEventCancelledPayload {
++ /**
++ * Today's id for the calendar entry (not the envelope's evt_ id).
++ */
++ event_id: string;
++ kind: "stream" | "event";
++ /**
++ * The owner's Live username for a stream; null for an event.
++ */
++ channel: string | null;
++ title: string;
++ starts_at: string;
++ ends_at: string | null;
++ /**
++ * The IANA zone it was scheduled in.
++ */
++ tz: string;
++ status: "scheduled" | "live" | "done" | "cancelled";
++ visibility: "public" | "followers";
++ /**
++ * Where it happens (a stream: its Live channel page).
++ */
++ url: string | null;
++ /**
++ * The calendar SEQUENCE: up by one with every change.
++ */
++ seq: number;
++}
ddiff --git a/manifests/services/today.json b/manifests/services/today.json
nnew file mode 100644
iindex 00000000..65e40c49
---- /dev/null
++++ b/manifests/services/today.json
@@@ -0,0 +1,92 @@
++{
++ "version": "0.1.0",
++ "contractRanges": {
++ "openvibe-contracts": ">=0.225.0 <1.0.0"
++ },
++ "id": "today",
++ "name": "OpenVibe.Today",
++ "status": "alpha",
++ "repository": "OpenVibers/OpenVibe.Today",
++ "domains": [
++ "openvibe.today"
++ ],
++ "publicOrigin": "https://openvibe.today",
++ "exposure": {
++ "state": "live",
++ "publicSite": "service"
++ },
++ "capabilities": [],
++ "eventsProduced": [
++ "today.event.scheduled",
++ "today.event.updated",
++ "today.event.cancelled"
++ ],
++ "eventsConsumed": [
++ "live.stream.started",
++ "live.stream.ended",
++ "network.account.export_requested",
++ "network.account.deleted"
++ ],
++ "namespacesOwned": [
++ "today.*"
++ ],
++ "lifecycle": {
++ "liveness": {
++ "endpoint": "/api/health",
++ "means": "the process is up and answers HTTP; it checks nothing else"
++ },
++ "shutdown": {
++ "signal": "SIGTERM",
++ "deadlineSeconds": 10,
++ "drains": [
++ "HTTP server closed",
++ "the outbox publisher and the reminder and brief jobs stopped",
++ "PostgreSQL pool closed"
++ ]
++ },
++ "startupRecovery": {
++ "resumes": [
++ {
++ "kind": "outbox",
++ "what": "today_outbox rows not yet published are sent again under their fixed evt_ ids (Events keeps one per id)"
++ },
++ {
++ "kind": "jobs",
++ "what": "reminders due while it was down are sent on the first pass (claimed by UPDATE … WHERE sent_at IS NULL, never twice); the brief job builds a missing day"
++ },
++ {
++ "kind": "consumer",
++ "what": "OpenVibe.Events redelivers live.stream.* and the account events pending during the stop; today_processed applies each once"
++ }
++ ]
++ },
++ "rollback": {
++ "conditions": [
++ "automatic: ovhost deploy puts the previous sha back and restarts again when the ready URL does not answer 2xx within ready.timeoutSeconds after the restart (exit 3)",
++ "manual: ovhost rollback <service> --to <sha>"
++ ],
++ "window": "automatic only while ovhost waits for readiness after the restart; manual afterwards, as long as no blocker applies",
++ "blockers": {
++ "none": "migration 0001 only creates Today's own tables; an earlier release has none to read"
++ }
++ },
++ "contracts": {
++ "range": ">=0.225.0 <1.0.0"
++ },
++ "leases": {
++ "none": "no claims: one process serves the site"
++ }
++ },
++ "notes": "Port 5100, unit openvibe-today.service, PostgreSQL database ov_today. The Today room (plan 2026-10-28 §5.3): the network's time bus and calendar authority. v1 owns schedules (streams and events), reminders (sent as Network notifications through network.notifications.push), calendar feeds (RFC 5545: a channel's public feed and a person's private one) and the daily brief. It publishes today.event.* from an outbox and moves a stream live and ended from live.stream.started / ended. OAuth client `today` (sign-in), Network follows for the agenda.",
++ "health": "/api/health",
++ "ready": "/api/ready",
++ "internalOrigin": "http://127.0.0.1:5100",
++ "site": {
++ "name": "Today",
++ "icon": "today",
++ "tagline": "Everything happening for you, today",
++ "what": "Stream schedules, reminders that find you on any OpenVibe site, calendar feeds for your own calendar app, and a morning brief, all in one place.",
++ "legalProfile": "account",
++ "position": 40
++ }
++}
ddiff --git a/package.json b/package.json
iindex 50e65480..71664486 100644
---- a/package.json
++++ b/package.json
@@@ -1,6 +1,6 @@
{
"name": "openvibe-contracts",
-- "version": "0.229.0",
++ "version": "0.230.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",