openvibers/openvibe.contracts Commits

v0.58.0: host.deploy.activated@1, the release notification (WS-P task 9, ADR-016 amendment 1)

OP OpenVibers committed 26 Sept 2026 · 4988f1265d · 43 files, +443 −50

host.deploy.activated gets its payload contract (catalog visibility public, owner host, ADR-016). Two shapes, exactly one matches:
- A network service's release went live: OpenVibe.Host's operator plane (ovhost deploy/rollback, and ovhost announce for services deployed by their own scripts). Envelope subject { type: release, id: <service>:<release> }, visibility public, so signed-out browsers get it over Events realtime and openvibe-shared release-watch checks /release.json at once. Payload: service, release (the /release.json release id; the release manifest's own pattern), commit or null, origin (an http(s) origin) or null, deployed_at, optional components (kind and version only, at most 32) and rollback: true. Identifiers only.
- A Stage B tenant site's active deploy changed (what Host's API already emits): project_id, site_id, site, deploy_id, previous_deploy_id, rollback; subject deploy, visibility internal.

Fixtures for both shapes (release, Sites placeholder with a null commit, rollback with a null origin, tenant; invalid: non-hex release, an origin with a path, mixed shapes, rollback: false on a release, a bad component kind, a tenant without previous_deploy_id). test/run.js: the catalog entry is public and Host produces it, the shapes never mix, every release field is required (commit and origin nullable), no extra fields such as commits or notes, the release pattern is the release manifest's. The host manifest's notes name the operator-plane producer. ADR-016 amendment 1 records the event and the client behaviour (one anonymous EventSource per tab, service match, generations, 30 s coalescing with a 0-20 s jitter, hidden tabs close it, backoff, polling as the fallback). Generated output regenerated; compat vs v0.57.2: no breaking changes. The event type was already in eventsProduced, so nothing is renamed. Not tagged.

Changes

ddiff --git a/CHANGELOG.md b/CHANGELOG.md
iindex 646196b7..2eb010ea 100644
---- a/CHANGELOG.md
++++ b/CHANGELOG.md
@@@ -4,6 +4,14 @@ 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.58.0 — 2026-09-26
++
++**Release notifications** (roadmap WS-P task 9, ADR-016 amendment 1). `host.deploy.activated` gets its payload contract, `host.deploy.activated@1` (catalog visibility public). The type has two shapes, and exactly one matches:
++- **A network service's release went live.** OpenVibe.Host's operator plane publishes it (`ovhost deploy|rollback`, and `ovhost announce` for services deployed by their own scripts). The envelope has subject `{ type: release, id: <service>:<release> }` and visibility public, so signed-out browsers get it over Events realtime and openvibe-shared release-watch checks `/release.json` at once. The payload is `service`, `release` (the `/release.json` release id, the release manifest's pattern), `commit` (or null), `origin` (or null), `deployed_at`, and optionally `components` (kind and version only) and `rollback: true`. Identifiers only.
++- **A Stage B tenant site's active deploy changed.** This is what Host's API already emitted: `project_id`, `site_id`, `site`, `deploy_id`, `previous_deploy_id`, `rollback`. It has subject `deploy` and visibility internal.
++
++It has fixtures for both shapes (mixing them fails), and the host manifest's notes name the operator-plane producer. The event type was already in the host manifest's `eventsProduced`, so nothing is renamed. Additive.
++
## 0.57.2 — 2026-09-26
**Three decisions** (documentation only): ADR-029 account merge (WS-B task 5), ADR-030 follow graph (WS-E task 4), ADR-031 S3-compatible surface for Media (WS-N task 8). Each is accepted with its acceptance tests; the implementations follow in Network, Live and Media.
ddiff --git a/contracts/catalog.json b/contracts/catalog.json
iindex 32fe804a..dcd6ccb7 100644
---- a/contracts/catalog.json
++++ b/contracts/catalog.json
@@@ -4577,6 +4577,16 @@
"compatibility": "backward",
"status": "active"
},
++ {
++ "id": "host.deploy.activated",
++ "version": "1.0.0",
++ "owner": "host",
++ "schema": "events/payloads/host.deploy.activated.v1.json",
++ "visibility": "public",
++ "compatibility": "backward",
++ "status": "active",
++ "adr": "ADR-016"
++ },
{
"id": "host.site-manage-result",
"version": "1.0.0",
ddiff --git a/contracts/events/payloads/host.deploy.activated.v1.json b/contracts/events/payloads/host.deploy.activated.v1.json
nnew file mode 100644
iindex 00000000..891f6618
---- /dev/null
++++ b/contracts/events/payloads/host.deploy.activated.v1.json
@@@ -0,0 +1,52 @@
++{
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/events/payloads/host.deploy.activated.v1.json",
++ "title": "HostDeployActivatedPayload",
++ "description": "host.deploy.activated v1. A deploy became the one that serves. Two producers inside OpenVibe.Host, told apart by the envelope subject and by the payload's fields (exactly one shape matches). (1) A network service's release went live (roadmap WS-P task 9, ADR-016): the operator plane, lib/announce.js, after `ovhost deploy|rollback <service>` went live and for `ovhost announce <service>` (services deployed by their own scripts: Live, Tools, Sites, OpenRe, Games). Envelope: subject { type: release, id: <service>:<release> }, visibility public (signed-out browsers get it over Events realtime), priority low, actor service:host. Open tabs whose /release.json names `service` check it when `release` is not the one they run; the event carries identifiers only, never what changed. At most one per service and release unless an operator forces it; a retry reuses the event_id. (2) A Stage B tenant site's active deploy changed: server/domain/deploys.js, in the transaction that moves the pointer. Envelope: subject { type: deploy, id: <deploy id> }, visibility internal (never streamed to browsers), actor the person or app that switched it.",
++ "type": "object",
++ "oneOf": [
++ {
++ "description": "A network service's release went live (subject release, visibility public).",
++ "type": "object",
++ "required": ["service", "release", "commit", "origin", "deployed_at"],
++ "additionalProperties": false,
++ "properties": {
++ "service": { "type": "string", "pattern": "^[a-z][a-z0-9-]{1,39}$", "description": "The service id the pages' /release.json names (registry.release-manifest@1 `service`): live, tools, or a Sites placeholder's id such as news." },
++ "release": { "type": "string", "pattern": "^[0-9a-f]{7,40}$", "description": "The release id that service's /release.json reports now (registry.release-manifest@1 `release`). A client compares it with the release it runs, treating a hex prefix of the other as the same release." },
++ "commit": { "type": ["string", "null"], "pattern": "^[0-9a-f]{7,40}$", "description": "The deployed commit when it is known and `release` is its prefix, or what the operator passed; null otherwise (a Sites placeholder's release is a page hash)." },
++ "origin": { "type": ["string", "null"], "format": "uri", "pattern": "^https?://[^/?#]+$", "description": "The public origin the release serves (https://openvibe.live): the inventory's origin or the service manifest's publicOrigin; null when neither is known." },
++ "deployed_at": { "type": "string", "format": "date-time", "description": "When Host announced it (UTC); after `ovhost deploy`, just after the service answered ready." },
++ "components": {
++ "type": "object",
++ "description": "Optional. The component versions /release.json reported (registry.release-manifest 1.1.0 `components`, kind and version only).",
++ "maxProperties": 32,
++ "propertyNames": { "pattern": "^[a-z][a-z0-9-]{0,39}$" },
++ "additionalProperties": {
++ "type": "object",
++ "required": ["kind", "version"],
++ "additionalProperties": false,
++ "properties": {
++ "kind": { "enum": ["style", "content", "script", "server"] },
++ "version": { "type": "string", "pattern": "^[0-9A-Za-z._+-]{1,64}$" }
++ }
++ }
++ },
++ "rollback": { "const": true, "description": "Present after `ovhost rollback`: the release is an older one." }
++ }
++ },
++ {
++ "description": "A Stage B tenant site's active deploy changed (subject deploy, visibility internal).",
++ "type": "object",
++ "required": ["project_id", "site_id", "site", "deploy_id", "previous_deploy_id", "rollback"],
++ "additionalProperties": false,
++ "properties": {
++ "project_id": { "type": "string", "pattern": "^prj_[0-9A-HJKMNP-TV-Z]{26}$" },
++ "site_id": { "type": "string", "pattern": "^site_[0-9A-HJKMNP-TV-Z]{26}$" },
++ "site": { "type": "string", "pattern": "^[a-z0-9](?:[a-z0-9]|-(?=[a-z0-9])){2,39}$", "description": "The site's name (<site>.openvibe.host)." },
++ "deploy_id": { "type": "string", "pattern": "^dpl_[0-9A-HJKMNP-TV-Z]{26}$" },
++ "previous_deploy_id": { "type": ["string", "null"], "pattern": "^dpl_[0-9A-HJKMNP-TV-Z]{26}$", "description": "The deploy that served before; null for the site's first activation." },
++ "rollback": { "type": "boolean", "description": "true when the switch was a rollback." }
++ }
++ }
++ ]
++}
ddiff --git a/docs/adr/ADR-016-active-client-updates.md b/docs/adr/ADR-016-active-client-updates.md
iindex a1902615..feea2928 100644
---- a/docs/adr/ADR-016-active-client-updates.md
++++ b/docs/adr/ADR-016-active-client-updates.md
@@@ -37,3 +37,31 @@ The manifest is advisory; removing it returns clients to today's behaviour.
- A client one release behind keeps working for 24 hours after a deploy.
- A deploy during an upload, call or stream does not interrupt it.
- An outdated tab prompts and does not reload while the user is typing.
++
++## Amendment 1 (2026-09-26): release notifications over the Events realtime plane
++
++Roadmap WS-P task 9.
++
++- **Event.** When a network service's release goes live, OpenVibe.Host publishes `host.deploy.activated`
++ with subject `{ type: release, id: <service>:<release> }` and visibility public. The payload contract
++ is `host.deploy.activated@1`: `service`, `release`, `commit`, `origin`, `deployed_at`, and optionally
++ `components` and `rollback`. It carries identifiers only; what changed stays in `/release.json`.
++ - **Sent by:** `ovhost deploy|rollback` after a release went live, and `ovhost announce <service>` for
++ services deployed by their own scripts.
++ - **Frequency:** one event per service and release.
++ - **Delivery:** best effort, and never fails a deploy. Polling is the fallback.
++ - **Stage B:** tenant activations share the type, with subject `deploy` and visibility internal.
++- **Client.** openvibe-shared `release-watch.js` (1.17.0) opens one anonymous EventSource per tab on
++ `topics=host.deploy.activated`.
++ - It acts only on events whose `payload.service` is the page's service.
++ - It ignores the release it already runs or already knows (a hex prefix counts as the same release),
++ and ignores repeats of an event id.
++ - It collapses bursts: at most one check per 30 s, after a random 0–20 s delay so tabs do not all
++ fetch at once. The check is the usual `/release.json` path: the release window, the update plan and
++ the safety rules are unchanged.
++ - The stream is public, so a change of account changes nothing and never opens a second stream.
++ - A tab hidden for 5 minutes closes its stream; hidden tabs are covered by the poll and the check on
++ becoming visible. Errors back off, from 30 s to 15 minutes, and after repeated failures the tab keeps
++ only the poll.
++- **Rollback.** Stop announcing (`--no-announce`, or remove the credentials): tabs fall back to polling,
++ as before.
ddiff --git a/fixtures/host.deploy.activated/invalid/component-bad-kind.json b/fixtures/host.deploy.activated/invalid/component-bad-kind.json
nnew file mode 100644
iindex 00000000..8f7a2498
---- /dev/null
++++ b/fixtures/host.deploy.activated/invalid/component-bad-kind.json
@@@ -0,0 +1,8 @@
++{
++ "service": "live",
++ "release": "d4e849f2",
++ "commit": null,
++ "origin": null,
++ "deployed_at": "2026-09-26T08:00:05.000Z",
++ "components": { "shell": { "kind": "binary", "version": "1" } }
++}
ddiff --git a/fixtures/host.deploy.activated/invalid/mixed-shapes.json b/fixtures/host.deploy.activated/invalid/mixed-shapes.json
nnew file mode 100644
iindex 00000000..28253eae
---- /dev/null
++++ b/fixtures/host.deploy.activated/invalid/mixed-shapes.json
@@@ -0,0 +1,8 @@
++{
++ "service": "live",
++ "release": "d4e849f2",
++ "commit": null,
++ "origin": "https://openvibe.live",
++ "deployed_at": "2026-09-26T08:00:05.000Z",
++ "site_id": "site_01JAB2C3D4E5F6G7H8J9K0MNPR"
++}
ddiff --git a/fixtures/host.deploy.activated/invalid/origin-with-path.json b/fixtures/host.deploy.activated/invalid/origin-with-path.json
nnew file mode 100644
iindex 00000000..e625d69f
---- /dev/null
++++ b/fixtures/host.deploy.activated/invalid/origin-with-path.json
@@@ -0,0 +1,7 @@
++{
++ "service": "live",
++ "release": "d4e849f2",
++ "commit": null,
++ "origin": "https://openvibe.live/updates",
++ "deployed_at": "2026-09-26T08:00:05.000Z"
++}
ddiff --git a/fixtures/host.deploy.activated/invalid/release-not-hex.json b/fixtures/host.deploy.activated/invalid/release-not-hex.json
nnew file mode 100644
iindex 00000000..60fff612
---- /dev/null
++++ b/fixtures/host.deploy.activated/invalid/release-not-hex.json
@@@ -0,0 +1,7 @@
++{
++ "service": "live",
++ "release": "v1.2.3",
++ "commit": null,
++ "origin": "https://openvibe.live",
++ "deployed_at": "2026-09-26T08:00:05.000Z"
++}
ddiff --git a/fixtures/host.deploy.activated/invalid/release-rollback-false.json b/fixtures/host.deploy.activated/invalid/release-rollback-false.json
nnew file mode 100644
iindex 00000000..4a787a7e
---- /dev/null
++++ b/fixtures/host.deploy.activated/invalid/release-rollback-false.json
@@@ -0,0 +1,8 @@
++{
++ "service": "live",
++ "release": "d4e849f2",
++ "commit": null,
++ "origin": null,
++ "deployed_at": "2026-09-26T08:00:05.000Z",
++ "rollback": false
++}
ddiff --git a/fixtures/host.deploy.activated/invalid/tenant-no-previous.json b/fixtures/host.deploy.activated/invalid/tenant-no-previous.json
nnew file mode 100644
iindex 00000000..aa65831d
---- /dev/null
++++ b/fixtures/host.deploy.activated/invalid/tenant-no-previous.json
@@@ -0,0 +1,7 @@
++{
++ "project_id": "prj_01JAB2C3D4E5F6G7H8J9K0MNPQ",
++ "site_id": "site_01JAB2C3D4E5F6G7H8J9K0MNPR",
++ "site": "my-site",
++ "deploy_id": "dpl_01JAB2C3D4E5F6G7H8J9K0MNPS",
++ "rollback": false
++}
ddiff --git a/fixtures/host.deploy.activated/valid/live-release.json b/fixtures/host.deploy.activated/valid/live-release.json
nnew file mode 100644
iindex 00000000..90ef01df
---- /dev/null
++++ b/fixtures/host.deploy.activated/valid/live-release.json
@@@ -0,0 +1,11 @@
++{
++ "service": "live",
++ "release": "d4e849f2",
++ "commit": "d4e849f2a1b3c5d7e9f0a2b4c6d8e0f1a3b5c7d9",
++ "origin": "https://openvibe.live",
++ "deployed_at": "2026-09-26T08:00:05.000Z",
++ "components": {
++ "shell": { "kind": "script", "version": "3f2a9c1b7d4e" },
++ "server": { "kind": "server", "version": "a1b2c3d4e5f6" }
++ }
++}
ddiff --git a/fixtures/host.deploy.activated/valid/rollback-no-origin.json b/fixtures/host.deploy.activated/valid/rollback-no-origin.json
nnew file mode 100644
iindex 00000000..57b2d637
---- /dev/null
++++ b/fixtures/host.deploy.activated/valid/rollback-no-origin.json
@@@ -0,0 +1,8 @@
++{
++ "service": "tools",
++ "release": "858845c0e1d2",
++ "commit": "858845c0e1d2f3a4b5c6d7e8f9a0b1c2d3e4f5a6",
++ "origin": null,
++ "deployed_at": "2026-09-26T08:02:00.000Z",
++ "rollback": true
++}
ddiff --git a/fixtures/host.deploy.activated/valid/sites-placeholder.json b/fixtures/host.deploy.activated/valid/sites-placeholder.json
nnew file mode 100644
iindex 00000000..5fd094e4
---- /dev/null
++++ b/fixtures/host.deploy.activated/valid/sites-placeholder.json
@@@ -0,0 +1,7 @@
++{
++ "service": "news",
++ "release": "56eb30198d36",
++ "commit": null,
++ "origin": "https://openvibe.news",
++ "deployed_at": "2026-09-26T08:01:00.000Z"
++}
ddiff --git a/fixtures/host.deploy.activated/valid/tenant-site.json b/fixtures/host.deploy.activated/valid/tenant-site.json
nnew file mode 100644
iindex 00000000..5a433ac7
---- /dev/null
++++ b/fixtures/host.deploy.activated/valid/tenant-site.json
@@@ -0,0 +1,8 @@
++{
++ "project_id": "prj_01JAB2C3D4E5F6G7H8J9K0MNPQ",
++ "site_id": "site_01JAB2C3D4E5F6G7H8J9K0MNPR",
++ "site": "my-site",
++ "deploy_id": "dpl_01JAB2C3D4E5F6G7H8J9K0MNPS",
++ "previous_deploy_id": null,
++ "rollback": false
++}
ddiff --git a/generated/json-schema/bundle.json b/generated/json-schema/bundle.json
iindex ee9ffe0f..d5f2ca13 100644
---- a/generated/json-schema/bundle.json
++++ b/generated/json-schema/bundle.json
@@@ -51545,6 +51545,144 @@
]
}
},
++ "host.deploy.activated": {
++ "version": "1.0.0",
++ "owner": "host",
++ "status": "active",
++ "schema": {
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/events/payloads/host.deploy.activated.v1.json",
++ "title": "HostDeployActivatedPayload",
++ "description": "host.deploy.activated v1. A deploy became the one that serves. Two producers inside OpenVibe.Host, told apart by the envelope subject and by the payload's fields (exactly one shape matches). (1) A network service's release went live (roadmap WS-P task 9, ADR-016): the operator plane, lib/announce.js, after `ovhost deploy|rollback <service>` went live and for `ovhost announce <service>` (services deployed by their own scripts: Live, Tools, Sites, OpenRe, Games). Envelope: subject { type: release, id: <service>:<release> }, visibility public (signed-out browsers get it over Events realtime), priority low, actor service:host. Open tabs whose /release.json names `service` check it when `release` is not the one they run; the event carries identifiers only, never what changed. At most one per service and release unless an operator forces it; a retry reuses the event_id. (2) A Stage B tenant site's active deploy changed: server/domain/deploys.js, in the transaction that moves the pointer. Envelope: subject { type: deploy, id: <deploy id> }, visibility internal (never streamed to browsers), actor the person or app that switched it.",
++ "type": "object",
++ "oneOf": [
++ {
++ "description": "A network service's release went live (subject release, visibility public).",
++ "type": "object",
++ "required": [
++ "service",
++ "release",
++ "commit",
++ "origin",
++ "deployed_at"
++ ],
++ "additionalProperties": false,
++ "properties": {
++ "service": {
++ "type": "string",
++ "pattern": "^[a-z][a-z0-9-]{1,39}$",
++ "description": "The service id the pages' /release.json names (registry.release-manifest@1 `service`): live, tools, or a Sites placeholder's id such as news."
++ },
++ "release": {
++ "type": "string",
++ "pattern": "^[0-9a-f]{7,40}$",
++ "description": "The release id that service's /release.json reports now (registry.release-manifest@1 `release`). A client compares it with the release it runs, treating a hex prefix of the other as the same release."
++ },
++ "commit": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "pattern": "^[0-9a-f]{7,40}$",
++ "description": "The deployed commit when it is known and `release` is its prefix, or what the operator passed; null otherwise (a Sites placeholder's release is a page hash)."
++ },
++ "origin": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "format": "uri",
++ "pattern": "^https?://[^/?#]+$",
++ "description": "The public origin the release serves (https://openvibe.live): the inventory's origin or the service manifest's publicOrigin; null when neither is known."
++ },
++ "deployed_at": {
++ "type": "string",
++ "format": "date-time",
++ "description": "When Host announced it (UTC); after `ovhost deploy`, just after the service answered ready."
++ },
++ "components": {
++ "type": "object",
++ "description": "Optional. The component versions /release.json reported (registry.release-manifest 1.1.0 `components`, kind and version only).",
++ "maxProperties": 32,
++ "propertyNames": {
++ "pattern": "^[a-z][a-z0-9-]{0,39}$"
++ },
++ "additionalProperties": {
++ "type": "object",
++ "required": [
++ "kind",
++ "version"
++ ],
++ "additionalProperties": false,
++ "properties": {
++ "kind": {
++ "enum": [
++ "style",
++ "content",
++ "script",
++ "server"
++ ]
++ },
++ "version": {
++ "type": "string",
++ "pattern": "^[0-9A-Za-z._+-]{1,64}$"
++ }
++ }
++ }
++ },
++ "rollback": {
++ "const": true,
++ "description": "Present after `ovhost rollback`: the release is an older one."
++ }
++ }
++ },
++ {
++ "description": "A Stage B tenant site's active deploy changed (subject deploy, visibility internal).",
++ "type": "object",
++ "required": [
++ "project_id",
++ "site_id",
++ "site",
++ "deploy_id",
++ "previous_deploy_id",
++ "rollback"
++ ],
++ "additionalProperties": false,
++ "properties": {
++ "project_id": {
++ "type": "string",
++ "pattern": "^prj_[0-9A-HJKMNP-TV-Z]{26}$"
++ },
++ "site_id": {
++ "type": "string",
++ "pattern": "^site_[0-9A-HJKMNP-TV-Z]{26}$"
++ },
++ "site": {
++ "type": "string",
++ "pattern": "^[a-z0-9](?:[a-z0-9]|-(?=[a-z0-9])){2,39}$",
++ "description": "The site's name (<site>.openvibe.host)."
++ },
++ "deploy_id": {
++ "type": "string",
++ "pattern": "^dpl_[0-9A-HJKMNP-TV-Z]{26}$"
++ },
++ "previous_deploy_id": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "pattern": "^dpl_[0-9A-HJKMNP-TV-Z]{26}$",
++ "description": "The deploy that served before; null for the site's first activation."
++ },
++ "rollback": {
++ "type": "boolean",
++ "description": "true when the switch was a rollback."
++ }
++ }
++ }
++ ]
++ }
++ },
"host.site-manage-result": {
"version": "1.0.0",
"owner": "host",
ddiff --git a/generated/openapi/ai.json b/generated/openapi/ai.json
iindex 7a045996..cfaf012c 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.57.2",
-- "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.57.2): each operation lists the capabilities it performs; a token for 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.58.0",
++ "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.58.0): each operation lists the capabilities it performs; a token for 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 d7538f19..245214c0 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.57.2",
-- "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.57.2): each operation lists the capabilities it performs; a token for 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.58.0",
++ "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.58.0): each operation lists the capabilities it performs; a token for 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 b9ab499e..49a9cce6 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.57.2",
-- "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.57.2): each operation lists the capabilities it performs; a token for 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.58.0",
++ "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.58.0): each operation lists the capabilities it performs; a token for 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 681bab7a..d9ae0bb6 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.57.2",
-- "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.57.2): each operation lists the capabilities it performs; a token for 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.58.0",
++ "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.58.0): each operation lists the capabilities it performs; a token for 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 c0a0da09..ab719dba 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.57.2",
-- "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.57.2): each operation lists the capabilities it performs; a token for 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.58.0",
++ "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.58.0): each operation lists the capabilities it performs; a token for 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 63a58f26..df0caf37 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.57.2",
-- "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.57.2): each operation lists the capabilities it performs; a token for 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.58.0",
++ "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.58.0): each operation lists the capabilities it performs; a token for 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 8dd2dfcd..e84d3418 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.57.2",
-- "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.57.2): each operation lists the capabilities it performs; a token for 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.58.0",
++ "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.58.0): each operation lists the capabilities it performs; a token for 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 bb839ca8..aeba2c56 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.57.2",
-- "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.57.2): each operation lists the capabilities it performs; a token for 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.58.0",
++ "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.58.0): each operation lists the capabilities it performs; a token for 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 24baf7a4..9c16a0fa 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.57.2",
-- "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.57.2): each operation lists the capabilities it performs; a token for 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.58.0",
++ "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.58.0): each operation lists the capabilities it performs; a token for 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 14fa5b6a..69aa36e2 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.57.2",
-- "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.57.2): each operation lists the capabilities it performs; a token for 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.58.0",
++ "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.58.0): each operation lists the capabilities it performs; a token for 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 ba362a37..4db7df18 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.57.2",
-- "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.57.2): each operation lists the capabilities it performs; a token for 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.58.0",
++ "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.58.0): each operation lists the capabilities it performs; a token for 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 7e1da6ec..1862e2c7 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.57.2",
-- "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.57.2): each operation lists the capabilities it performs; a token for 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.58.0",
++ "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.58.0): each operation lists the capabilities it performs; a token for 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 baf9bc68..d3141c28 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.57.2",
-- "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.57.2): each operation lists the capabilities it performs; a token for 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.58.0",
++ "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.58.0): each operation lists the capabilities it performs; a token for 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 d759b83b..734e9acd 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.57.2",
-- "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.57.2): each operation lists the capabilities it performs; a token for 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.58.0",
++ "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.58.0): each operation lists the capabilities it performs; a token for 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 87efb9b0..03293c06 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.57.2",
-- "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.57.2): each operation lists the capabilities it performs; a token for 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.58.0",
++ "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.58.0): each operation lists the capabilities it performs; a token for 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 bf7d21db..fb8a7e9a 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": "OpenRe.Stream API",
-- "version": "0.57.2",
-- "description": "Routes of OpenRe.Stream as the OpenVibe contracts describe them (openvibe-contracts 0.57.2): each operation lists the capabilities it performs; a token for 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.58.0",
++ "description": "Routes of OpenRe.Stream as the OpenVibe contracts describe them (openvibe-contracts 0.58.0): each operation lists the capabilities it performs; a token for 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 05de01f0..2b854813 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.57.2",
-- "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.57.2): each operation lists the capabilities it performs; a token for 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.58.0",
++ "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.58.0): each operation lists the capabilities it performs; a token for 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 c1fa4a1c..a45a8f3d 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.57.2",
-- "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.57.2): each operation lists the capabilities it performs; a token for 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.58.0",
++ "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.58.0): each operation lists the capabilities it performs; a token for 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 0a4ac6b0..2a21f2fe 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.57.2",
-- "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.57.2): each operation lists the capabilities it performs; a token for 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.58.0",
++ "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.58.0): each operation lists the capabilities it performs; a token for 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 fa05e150..2e42fe62 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.57.2",
-- "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.57.2): each operation lists the capabilities it performs; a token for 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.58.0",
++ "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.58.0): each operation lists the capabilities it performs; a token for 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 6425e01b..6085f004 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.57.2",
-- "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.57.2): each operation lists the capabilities it performs; a token for 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.58.0",
++ "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.58.0): each operation lists the capabilities it performs; a token for 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 39940b80..2aa693cc 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.57.2",
-- "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.57.2): each operation lists the capabilities it performs; a token for 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.58.0",
++ "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.58.0): each operation lists the capabilities it performs; a token for 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 a47e6dab..99b4df76 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.57.2",
-- "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.57.2): each operation lists the capabilities it performs; a token for 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.58.0",
++ "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.58.0): each operation lists the capabilities it performs; a token for 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 a8dc15c5..1a39bc84 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.57.2",
-- "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.57.2): each operation lists the capabilities it performs; a token for 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.58.0",
++ "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.58.0): each operation lists the capabilities it performs; a token for 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 6beccb5d..1eb5f801 100644
---- a/generated/typescript/index.d.ts
++++ b/generated/typescript/index.d.ts
@@@ -41887,6 +41887,66 @@ export type HostSiteManageRequest =
}
| NoBody;
++/** [email protected] (owner: host) */
++/**
++ * host.deploy.activated v1. A deploy became the one that serves. Two producers inside OpenVibe.Host, told apart by the envelope subject and by the payload's fields (exactly one shape matches). (1) A network service's release went live (roadmap WS-P task 9, ADR-016): the operator plane, lib/announce.js, after `ovhost deploy|rollback <service>` went live and for `ovhost announce <service>` (services deployed by their own scripts: Live, Tools, Sites, OpenRe, Games). Envelope: subject { type: release, id: <service>:<release> }, visibility public (signed-out browsers get it over Events realtime), priority low, actor service:host. Open tabs whose /release.json names `service` check it when `release` is not the one they run; the event carries identifiers only, never what changed. At most one per service and release unless an operator forces it; a retry reuses the event_id. (2) A Stage B tenant site's active deploy changed: server/domain/deploys.js, in the transaction that moves the pointer. Envelope: subject { type: deploy, id: <deploy id> }, visibility internal (never streamed to browsers), actor the person or app that switched it.
++ */
++export type HostDeployActivatedPayload =
++ | {
++ /**
++ * The service id the pages' /release.json names (registry.release-manifest@1 `service`): live, tools, or a Sites placeholder's id such as news.
++ */
++ service: string;
++ /**
++ * The release id that service's /release.json reports now (registry.release-manifest@1 `release`). A client compares it with the release it runs, treating a hex prefix of the other as the same release.
++ */
++ release: string;
++ /**
++ * The deployed commit when it is known and `release` is its prefix, or what the operator passed; null otherwise (a Sites placeholder's release is a page hash).
++ */
++ commit: string | null;
++ /**
++ * The public origin the release serves (https://openvibe.live): the inventory's origin or the service manifest's publicOrigin; null when neither is known.
++ */
++ origin: string | null;
++ /**
++ * When Host announced it (UTC); after `ovhost deploy`, just after the service answered ready.
++ */
++ deployed_at: string;
++ /**
++ * Optional. The component versions /release.json reported (registry.release-manifest 1.1.0 `components`, kind and version only).
++ */
++ components?: {
++ [k: string]:
++ | {
++ kind: "style" | "content" | "script" | "server";
++ version: string;
++ }
++ | undefined;
++ };
++ /**
++ * Present after `ovhost rollback`: the release is an older one.
++ */
++ rollback?: true;
++ }
++ | {
++ project_id: string;
++ site_id: string;
++ /**
++ * The site's name (<site>.openvibe.host).
++ */
++ site: string;
++ deploy_id: string;
++ /**
++ * The deploy that served before; null for the site's first activation.
++ */
++ previous_deploy_id: string | null;
++ /**
++ * true when the switch was a rollback.
++ */
++ rollback: boolean;
++ };
++
/** [email protected] (owner: host) */
/**
* host.site-manage-result@1: answers of host.site.manage on OpenVibe.Host. GET /api/v1/projects → { projects } (the caller's projects with their role). POST /api/v1/projects → 201 { project } (with quota and usage). GET /api/v1/projects/:id → { project, sites, members }. GET and PUT /api/v1/projects/:id/quota → { quota, usage }. PUT and DELETE /api/v1/projects/:id/members/:principal → { members }. GET /api/v1/projects/:id/sites → { sites }. POST /api/v1/projects/:id/sites → 201 { site }. GET /api/v1/sites/:id → { site, domains }. DELETE /api/v1/projects/:id and /sites/:id → { deleted: true } (serving stops at once; the objects are removed). DELETE /api/v1/deploys/:id → { deleted: true, objects_removed }. POST …/takedown → 201 { takedown }; DELETE …/takedown → { lifted: true }.
ddiff --git a/manifests/services/host.json b/manifests/services/host.json
iindex 2fa4bf27..f71e9568 100644
---- a/manifests/services/host.json
++++ b/manifests/services/host.json
@@@ -94,5 +94,5 @@
]
}
},
-- "notes": "Stage A: the ovhost operator CLI (no server). Stage B: the Host API service on port 4910 (unit openvibe-host.service, state /var/lib/openvibe-host-api): tenant projects keyed by project id (prj_, network_project_id once Network has projects, ADR-014), static sites served by Host header at <site>.openvibe.host (a registrable domain separate from every other OpenVibe domain) and on TXT-verified custom domains, immutable content-addressed deploys with rollback, quotas enforced here, upload logs. Consumes OpenVibe.Network (SSO, JWKS, client-credentials) and publishes through OpenVibe.Events (events.event.publish). Stage C (sandboxed user code) is not started."
++ "notes": "Stage A: the ovhost operator CLI (no server). Stage B: the Host API service on port 4910 (unit openvibe-host.service, state /var/lib/openvibe-host-api): tenant projects keyed by project id (prj_, network_project_id once Network has projects, ADR-014), static sites served by Host header at <site>.openvibe.host (a registrable domain separate from every other OpenVibe domain) and on TXT-verified custom domains, immutable content-addressed deploys with rollback, quotas enforced here, upload logs. Consumes OpenVibe.Network (SSO, JWKS, client-credentials) and publishes through OpenVibe.Events (events.event.publish). The ovhost CLI publishes host.deploy.activated too, with subject release and visibility public, when a network service's release goes live (ovhost deploy/rollback/announce; release notifications, WS-P task 9); Stage B's tenant activations are subject deploy, visibility internal. Stage C (sandboxed user code) is not started."
}
ddiff --git a/package.json b/package.json
iindex 06e81a3e..7713534b 100644
---- a/package.json
++++ b/package.json
@@@ -1,6 +1,6 @@
{
"name": "openvibe-contracts",
-- "version": "0.57.2",
++ "version": "0.58.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",
ddiff --git a/test/run.js b/test/run.js
iindex 9900f0ae..dadc111d 100644
---- a/test/run.js
++++ b/test/run.js
@@@ -722,6 +722,24 @@ await assert.rejects(failing.getToken(), /401: invalid_client/);
ok(!M({ ...base, text: 'the post' }) && !M({ ...base, target: { ...base.target, title: 'Hi' } }), 'it never carries the content');
}
++// ── Release notifications (WS-P task 9, ADR-016): host.deploy.activated, two shapes, one public ──
++// A network service's release (subject release, visibility public: browsers get it over Events
++// realtime) and a tenant site's activation (subject deploy, visibility internal). Exactly one shape
++// matches; the release shape carries identifiers only.
++{
++ const H = (p) => contracts.validate('host.deploy.activated@1', p).valid;
++ const cat = contracts.catalog.find(c => c.id === 'host.deploy.activated');
++ ok(cat && cat.owner === 'host' && cat.visibility === 'public' && services.get('host').eventsProduced.includes('host.deploy.activated'), 'host.deploy.activated is a public Host event');
++ const rel = { service: 'live', release: 'd4e849f2', commit: null, origin: 'https://openvibe.live', deployed_at: '2026-09-26T08:00:05.000Z' };
++ const ten = JSON.parse(fs.readFileSync(path.join(ROOT, 'fixtures/host.deploy.activated/valid/tenant-site.json'), 'utf8'));
++ ok(H(rel) && H(ten), 'a service release and a tenant activation are both host.deploy.activated@1');
++ ok(!H({ ...rel, ...ten }), 'the two shapes never mix');
++ for (const k of ['service', 'release', 'commit', 'origin', 'deployed_at']) ok(!H({ ...rel, [k]: undefined }), `a service release needs ${k} (commit and origin may be null)`);
++ for (const extra of [{ commits: [] }, { notes: 'x' }, { url: 'https://openvibe.live/updates' }]) ok(!H({ ...rel, ...extra }), `a service release carries identifiers only (${Object.keys(extra)[0]})`);
++ ok(H({ ...rel, release: 'd4e849f2a1b3c5d7e9f0a2b4c6d8e0f1a3b5c7d9' }) && !H({ ...rel, release: 'd4e84' }), 'a release is 7 to 40 hex, as registry.release-manifest@1 says');
++ ok(contracts.schema('registry.release-manifest').properties.release.pattern === contracts.schema('host.deploy.activated').oneOf[0].properties.release.pattern, 'the release pattern is the release manifest\'s');
++}
++
// ── Capability schemas (WS-C task 4): a ratchet over compatibility/capability-schema-gaps.json ──
execFileSync(process.execPath, [path.join(__dirname, 'capability-schemas.test.js')], { stdio: 'inherit' });