openvibers/openvibe.contracts Commits

Agent Streams S4: the state with the voice, and the machine TTS capability (#311)

OP OpenVibers committed 7 days ago · 42153aadd1 · 62 files, +873 −98

* Agent Streams S4: the state with the voice, and the machine TTS capability

The desk reads the lines the agent said with its state poll, so the state carries them: live.agent-stream-state@2
adds LINES (the lines, each with its id, so the desk asks for the ones after the last id it spoke) and VOICE (the
mode, the personality, the voice, the mute and the pause message). The v2 shape is additive, so a v1 reader keeps
working.

The chat.tts.speak capability is the desk's way to ask Chat for the sound of a line, with the request and result
schemas it answers.

* Agent Streams S4: the state contract carries the captions address

Live hands out the WebVTT of the recording and says where it lives, so the state now carries
captions_url. The state contract forbids unknown fields, so the v2 contract gains the field (it is
optional, and the fixture shows it) and the generated bundle follows.

* 0.301.0: the S4 state, the chat TTS schemas and capability (0.300.0 is S3's)

Changes

ddiff --git a/CHANGELOG.md b/CHANGELOG.md
iindex 94261f82..eab941e8 100644
---- a/CHANGELOG.md
++++ b/CHANGELOG.md
@@@ -1,5 +1,12 @@
# Changelog
++## 0.301.0 — 2026-11-06
++
++- Add `live.agent-stream-state@2` (Agent Streams S4): the state the desk polls gains the voice (`mode` watch or narrated, the `voice`, the `personality` calm, hype, dry or roast, `muted`, `paused` with its reason), the newest `lines` to speak, and `captions_url` (the stream's WebVTT). `@1` is unchanged.
++- Add `chat.tts-speak-request@1` and `chat.tts-speak-result@1`: the body and answer of `POST /api/agent-voice/speak` on OpenVibe.Chat (one line of at most 220 characters, an optional voice or the person's own; the audio, its MIME type and rate).
++- Add the capability `chat.tts.speak`: a machine (a node token acting for its owner, `on_behalf_of`) asks Chat to speak a line in that person's chosen voice, never another person's. Chat's manifest names it.
++- Additive: nothing that exists changes. Fixtures cover a missing text, a line over 220 characters, a missing audio and a wrong MIME type.
++
## 0.300.0 — 2026-11-06
- Add `report.session@1`: the report of one agent session, whatever ran it — a Codes task, an Actor task, a desk session or a session on a person's own machine (the Agent Streams plan, S3). It carries the id (`rps_<ULID>`), the owner (`usr_…`), the source (`codes`, `actor`, `desk` or `node`), the task (title ≤ 200 characters, the task's ref and its link back), the start and end, the worked seconds, the outcome (`done`, `stopped` or `failed`, with `stopped_because` in plain words when it did not finish), the summary (≤ 600 characters), the timeline (the steps, the same shape as `live.agent-stream-step@1`), the outputs (`pr`, `file`, `page`, `deploy`, `clip` or `vod`), the proof (the tests, the screenshots' media ids and the review's verdict), the cost and the models, up to five highlights, the agent stream it streamed on and the visibility (`private`, `unlisted` or `public`). The raw transcript, secrets and code are never in a report: the source service keeps the transcript for the owner, the house redactor runs over every text field before anything is stored, and a pull request is a link (its content shows only when the repository is public).
ddiff --git a/contracts/catalog.json b/contracts/catalog.json
iindex 0d71702a..f1ddc494 100644
---- a/contracts/catalog.json
++++ b/contracts/catalog.json
@@@ -9439,6 +9439,15 @@
"compatibility": "backward",
"status": "active"
},
++ {
++ "id": "live.agent-stream-state",
++ "version": "2.0.0",
++ "owner": "live",
++ "schema": "live/agent-stream-state.v2.json",
++ "visibility": "first-party",
++ "compatibility": "backward",
++ "status": "active"
++ },
{
"id": "live.agent-stream-curtain-request",
"version": "1.0.0",
@@@ -9501,6 +9510,24 @@
"visibility": "first-party",
"compatibility": "backward",
"status": "active"
++ },
++ {
++ "id": "chat.tts-speak-request",
++ "version": "1.0.0",
++ "owner": "chat",
++ "schema": "chat/tts-speak-request.v1.json",
++ "visibility": "first-party",
++ "compatibility": "backward",
++ "status": "active"
++ },
++ {
++ "id": "chat.tts-speak-result",
++ "version": "1.0.0",
++ "owner": "chat",
++ "schema": "chat/tts-speak-result.v1.json",
++ "visibility": "first-party",
++ "compatibility": "backward",
++ "status": "active"
}
]
}
ddiff --git a/contracts/chat/tts-speak-request.v1.json b/contracts/chat/tts-speak-request.v1.json
nnew file mode 100644
iindex 00000000..51042874
---- /dev/null
++++ b/contracts/chat/tts-speak-request.v1.json
@@@ -0,0 +1,25 @@
++{
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/chat/tts-speak-request.v1.json",
++ "title": "ChatTTSSpeakRequest",
++ "description": "chat.tts-speak-request@1: the body of POST /api/agent-voice/speak (Agent Streams S4). The desk asks Chat for the sound of one line the agent said. TEXT is the line (at most 220 characters). VOICE is a Chat voice id, or absent for the site default. OWN asks for the person own voice, and only the person themself may ask for it.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "text"
++ ],
++ "properties": {
++ "text": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 220
++ },
++ "voice": {
++ "type": "string",
++ "maxLength": 64
++ },
++ "own": {
++ "type": "boolean"
++ }
++ }
++}
ddiff --git a/contracts/chat/tts-speak-result.v1.json b/contracts/chat/tts-speak-result.v1.json
nnew file mode 100644
iindex 00000000..3924a9c6
---- /dev/null
++++ b/contracts/chat/tts-speak-result.v1.json
@@@ -0,0 +1,38 @@
++{
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/chat/tts-speak-result.v1.json",
++ "title": "ChatTTSSpeakResult",
++ "description": "chat.tts-speak-result@1: the answer of POST /api/agent-voice/speak (Agent Streams S4). AUDIO is the sound of the line (base64), MIME_TYPE what it is, and RATE the sample rate the desk decodes it to (the stream track is 48 kHz).",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "audio",
++ "mime_type"
++ ],
++ "properties": {
++ "audio": {
++ "type": "string",
++ "description": "The audio, base64."
++ },
++ "mime_type": {
++ "type": "string",
++ "enum": [
++ "audio/mpeg",
++ "audio/wav",
++ "audio/ogg",
++ "audio/webm"
++ ]
++ },
++ "rate": {
++ "type": "integer",
++ "minimum": 1
++ },
++ "voice_id": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "maxLength": 64
++ }
++ }
++}
ddiff --git a/contracts/live/agent-stream-state.v2.json b/contracts/live/agent-stream-state.v2.json
nnew file mode 100644
iindex 00000000..1e540d19
---- /dev/null
++++ b/contracts/live/agent-stream-state.v2.json
@@@ -0,0 +1,190 @@
++{
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/live/agent-stream-state.v2.json",
++ "title": "LiveAgentStreamState",
++ "description": "live.agent-stream-state@2 (the Agent Streams plan, S4): what the desk reads every ten seconds, GET /api/streams/agent/:id/state on OpenVibe.Live (with the publish ticket). VIEWERS is how many people watch. ENCODE says whether Live wants video: it is true while anyone watches or the stream is public, and while it is false the desk stops encoding and sends a snapshot every five seconds (PUT /api/streams/agent/:id/frame, JPEG or WebP, at most 200 KB, with the ticket). CURTAIN is the desk privacy screen (the reason is the owner only). ENDS_AT is when the stream ends. LINES are the lines the agent said, oldest first, each with its id: the desk asks for the lines after the last id it spoke (the ?after parameter) and speaks them in the person own voice. VOICE is the voice the agent speaks in (the mode, the personality, the voice, the mute and, when the person allowance ran out, the pause message). The v2 shape adds LINES and VOICE to the v1 shape (both optional, so a v1 reader keeps working); the v1 fields keep their meaning. CAPTIONS_URL is where the recording captions live: the WebVTT a VOD player can attach as a text track.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "viewers",
++ "encode",
++ "curtain",
++ "ends_at"
++ ],
++ "properties": {
++ "viewers": {
++ "type": "integer",
++ "minimum": 0
++ },
++ "encode": {
++ "type": "boolean"
++ },
++ "curtain": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "up"
++ ],
++ "properties": {
++ "up": {
++ "type": "boolean"
++ },
++ "since": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "format": "date-time"
++ },
++ "reason": {
++ "enum": [
++ "password_field",
++ "secret_file",
++ "env_print",
++ "manual",
++ "site",
++ "detector"
++ ],
++ "description": "Why the curtain is up. The owner view only; a viewer never sees it. The password_field reason is the one that silences the agent voice: a line spoken over a password field would put words where a secret is."
++ }
++ }
++ },
++ "ends_at": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "format": "date-time"
++ },
++ "lines": {
++ "type": "array",
++ "description": "The lines the agent said, oldest first. The desk asks for the lines after the last id it spoke.",
++ "items": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "id",
++ "at",
++ "text",
++ "kind"
++ ],
++ "properties": {
++ "id": {
++ "type": "integer",
++ "description": "The line id: the desk cursor."
++ },
++ "at": {
++ "type": "string",
++ "format": "date-time"
++ },
++ "text": {
++ "type": "string",
++ "maxLength": 220,
++ "description": "The line, at most 220 characters. It passed the house text filters before it was written."
++ },
++ "kind": {
++ "enum": [
++ "step",
++ "failure",
++ "result",
++ "idle"
++ ],
++ "description": "What the line is about: a step that started, a step that failed, a result that landed, or an idle line."
++ },
++ "personality": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "enum": [
++ "calm",
++ "hype",
++ "dry",
++ "roast",
++ null
++ ]
++ },
++ "voice": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "maxLength": 64,
++ "description": "The Chat voice the line is to be spoken in."
++ }
++ }
++ }
++ },
++ "voice": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "mode",
++ "personality",
++ "muted"
++ ],
++ "properties": {
++ "mode": {
++ "enum": [
++ "watch",
++ "narrated"
++ ],
++ "description": "Watch is the quiet mode; narrated is the one where the agent says what it is doing."
++ },
++ "personality": {
++ "enum": [
++ "calm",
++ "hype",
++ "dry",
++ "roast"
++ ]
++ },
++ "voice": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "maxLength": 64,
++ "description": "The Chat voice the agent speaks in. Null is the site default."
++ },
++ "muted": {
++ "type": "boolean",
++ "description": "The kill switch: the owner or a channel moderator. It takes effect on the desk at once."
++ },
++ "own": {
++ "type": "boolean",
++ "description": "The agent speaks in the person own cloned voice. Only with the person own consent."
++ },
++ "own_consent_at": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "format": "date-time",
++ "description": "When the person consented to their own cloned voice. The owner view only."
++ },
++ "paused": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "description": "Why the voice is paused, or null: allowance_spent when the person allowance ran out."
++ },
++ "message": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "description": "What the owner is told about the pause, for example voice paused: allowance spent."
++ }
++ }
++ },
++ "captions_url": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "description": "Where the recording captions live: the WebVTT a VOD player can attach as a text track. The voice itself is mixed into the stream before the recording, so the recording keeps the voice; the captions are the track beside it."
++ }
++ }
++}
ddiff --git a/fixtures/chat.tts-speak-request/invalid/no-text.json b/fixtures/chat.tts-speak-request/invalid/no-text.json
nnew file mode 100644
iindex 00000000..d577de58
---- /dev/null
++++ b/fixtures/chat.tts-speak-request/invalid/no-text.json
@@@ -0,0 +1,3 @@
++{
++ "voice": "gary"
++}
ddiff --git a/fixtures/chat.tts-speak-request/invalid/too-long.json b/fixtures/chat.tts-speak-request/invalid/too-long.json
nnew file mode 100644
iindex 00000000..5989f8e3
---- /dev/null
++++ b/fixtures/chat.tts-speak-request/invalid/too-long.json
@@@ -0,0 +1,3 @@
++{
++ "text": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
++}
ddiff --git a/fixtures/chat.tts-speak-request/valid/a-line.json b/fixtures/chat.tts-speak-request/valid/a-line.json
nnew file mode 100644
iindex 00000000..a4c6a8c1
---- /dev/null
++++ b/fixtures/chat.tts-speak-request/valid/a-line.json
@@@ -0,0 +1,3 @@
++{
++ "text": "The checkout tests are green."
++}
ddiff --git a/fixtures/chat.tts-speak-request/valid/with-voice.json b/fixtures/chat.tts-speak-request/valid/with-voice.json
nnew file mode 100644
iindex 00000000..46d0eb4b
---- /dev/null
++++ b/fixtures/chat.tts-speak-request/valid/with-voice.json
@@@ -0,0 +1,5 @@
++{
++ "text": "The checkout tests are green.",
++ "voice": "gary",
++ "own": false
++}
ddiff --git a/fixtures/chat.tts-speak-result/invalid/bad-mime.json b/fixtures/chat.tts-speak-result/invalid/bad-mime.json
nnew file mode 100644
iindex 00000000..c7bc5316
---- /dev/null
++++ b/fixtures/chat.tts-speak-result/invalid/bad-mime.json
@@@ -0,0 +1,4 @@
++{
++ "audio": "SUQzAw==",
++ "mime_type": "audio/flac"
++}
ddiff --git a/fixtures/chat.tts-speak-result/invalid/no-audio.json b/fixtures/chat.tts-speak-result/invalid/no-audio.json
nnew file mode 100644
iindex 00000000..f1b233f7
---- /dev/null
++++ b/fixtures/chat.tts-speak-result/invalid/no-audio.json
@@@ -0,0 +1,3 @@
++{
++ "mime_type": "audio/mpeg"
++}
ddiff --git a/fixtures/chat.tts-speak-result/valid/audio.json b/fixtures/chat.tts-speak-result/valid/audio.json
nnew file mode 100644
iindex 00000000..22707fae
---- /dev/null
++++ b/fixtures/chat.tts-speak-result/valid/audio.json
@@@ -0,0 +1,6 @@
++{
++ "audio": "SUQzAw==",
++ "mime_type": "audio/mpeg",
++ "rate": 48000,
++ "voice_id": "gary"
++}
ddiff --git a/fixtures/live.agent-stream-state/valid/with-voice.json b/fixtures/live.agent-stream-state/valid/with-voice.json
nnew file mode 100644
iindex 00000000..b5877267
---- /dev/null
++++ b/fixtures/live.agent-stream-state/valid/with-voice.json
@@@ -0,0 +1,30 @@
++{
++ "viewers": 3,
++ "encode": true,
++ "curtain": {
++ "up": false,
++ "since": null
++ },
++ "ends_at": "2026-11-06T18:00:00.000Z",
++ "captions_url": "https://openvibe.live/api/streams/agent/ai_123456/captions.vtt",
++ "lines": [
++ {
++ "id": 1,
++ "at": "2026-11-06T17:00:00.000Z",
++ "text": "The checkout tests are green.",
++ "kind": "result",
++ "personality": "calm",
++ "voice": "gary"
++ }
++ ],
++ "voice": {
++ "mode": "narrated",
++ "personality": "calm",
++ "voice": "gary",
++ "muted": false,
++ "own": false,
++ "own_consent_at": null,
++ "paused": null,
++ "message": null
++ }
++}
ddiff --git a/generated/json-schema/bundle.json b/generated/json-schema/bundle.json
iindex 733893e8..1e0d2d4e 100644
---- a/generated/json-schema/bundle.json
++++ b/generated/json-schema/bundle.json
@@@ -103624,7 +103624,7 @@
}
}
},
-- "live.agent-stream-state": {
++ "live.agent-stream-state@1": {
"version": "1.0.0",
"owner": "live",
"status": "active",
@@@ -103689,6 +103689,201 @@
}
}
},
++ "live.agent-stream-state@2": {
++ "version": "2.0.0",
++ "owner": "live",
++ "status": "active",
++ "schema": {
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/live/agent-stream-state.v2.json",
++ "title": "LiveAgentStreamState",
++ "description": "live.agent-stream-state@2 (the Agent Streams plan, S4): what the desk reads every ten seconds, GET /api/streams/agent/:id/state on OpenVibe.Live (with the publish ticket). VIEWERS is how many people watch. ENCODE says whether Live wants video: it is true while anyone watches or the stream is public, and while it is false the desk stops encoding and sends a snapshot every five seconds (PUT /api/streams/agent/:id/frame, JPEG or WebP, at most 200 KB, with the ticket). CURTAIN is the desk privacy screen (the reason is the owner only). ENDS_AT is when the stream ends. LINES are the lines the agent said, oldest first, each with its id: the desk asks for the lines after the last id it spoke (the ?after parameter) and speaks them in the person own voice. VOICE is the voice the agent speaks in (the mode, the personality, the voice, the mute and, when the person allowance ran out, the pause message). The v2 shape adds LINES and VOICE to the v1 shape (both optional, so a v1 reader keeps working); the v1 fields keep their meaning. CAPTIONS_URL is where the recording captions live: the WebVTT a VOD player can attach as a text track.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "viewers",
++ "encode",
++ "curtain",
++ "ends_at"
++ ],
++ "properties": {
++ "viewers": {
++ "type": "integer",
++ "minimum": 0
++ },
++ "encode": {
++ "type": "boolean"
++ },
++ "curtain": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "up"
++ ],
++ "properties": {
++ "up": {
++ "type": "boolean"
++ },
++ "since": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "format": "date-time"
++ },
++ "reason": {
++ "enum": [
++ "password_field",
++ "secret_file",
++ "env_print",
++ "manual",
++ "site",
++ "detector"
++ ],
++ "description": "Why the curtain is up. The owner view only; a viewer never sees it. The password_field reason is the one that silences the agent voice: a line spoken over a password field would put words where a secret is."
++ }
++ }
++ },
++ "ends_at": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "format": "date-time"
++ },
++ "lines": {
++ "type": "array",
++ "description": "The lines the agent said, oldest first. The desk asks for the lines after the last id it spoke.",
++ "items": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "id",
++ "at",
++ "text",
++ "kind"
++ ],
++ "properties": {
++ "id": {
++ "type": "integer",
++ "description": "The line id: the desk cursor."
++ },
++ "at": {
++ "type": "string",
++ "format": "date-time"
++ },
++ "text": {
++ "type": "string",
++ "maxLength": 220,
++ "description": "The line, at most 220 characters. It passed the house text filters before it was written."
++ },
++ "kind": {
++ "enum": [
++ "step",
++ "failure",
++ "result",
++ "idle"
++ ],
++ "description": "What the line is about: a step that started, a step that failed, a result that landed, or an idle line."
++ },
++ "personality": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "enum": [
++ "calm",
++ "hype",
++ "dry",
++ "roast",
++ null
++ ]
++ },
++ "voice": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "maxLength": 64,
++ "description": "The Chat voice the line is to be spoken in."
++ }
++ }
++ }
++ },
++ "voice": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "mode",
++ "personality",
++ "muted"
++ ],
++ "properties": {
++ "mode": {
++ "enum": [
++ "watch",
++ "narrated"
++ ],
++ "description": "Watch is the quiet mode; narrated is the one where the agent says what it is doing."
++ },
++ "personality": {
++ "enum": [
++ "calm",
++ "hype",
++ "dry",
++ "roast"
++ ]
++ },
++ "voice": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "maxLength": 64,
++ "description": "The Chat voice the agent speaks in. Null is the site default."
++ },
++ "muted": {
++ "type": "boolean",
++ "description": "The kill switch: the owner or a channel moderator. It takes effect on the desk at once."
++ },
++ "own": {
++ "type": "boolean",
++ "description": "The agent speaks in the person own cloned voice. Only with the person own consent."
++ },
++ "own_consent_at": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "format": "date-time",
++ "description": "When the person consented to their own cloned voice. The owner view only."
++ },
++ "paused": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "description": "Why the voice is paused, or null: allowance_spent when the person allowance ran out."
++ },
++ "message": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "description": "What the owner is told about the pause, for example voice paused: allowance spent."
++ }
++ }
++ },
++ "captions_url": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "description": "Where the recording captions live: the WebVTT a VOD player can attach as a text track. The voice itself is mixed into the stream before the recording, so the recording keeps the voice; the captions are the track beside it."
++ }
++ }
++ }
++ },
"live.agent-stream-curtain-request": {
"version": "1.0.0",
"owner": "live",
@@@ -104649,6 +104844,79 @@
}
}
}
++ },
++ "chat.tts-speak-request": {
++ "version": "1.0.0",
++ "owner": "chat",
++ "status": "active",
++ "schema": {
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/chat/tts-speak-request.v1.json",
++ "title": "ChatTTSSpeakRequest",
++ "description": "chat.tts-speak-request@1: the body of POST /api/agent-voice/speak (Agent Streams S4). The desk asks Chat for the sound of one line the agent said. TEXT is the line (at most 220 characters). VOICE is a Chat voice id, or absent for the site default. OWN asks for the person own voice, and only the person themself may ask for it.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "text"
++ ],
++ "properties": {
++ "text": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 220
++ },
++ "voice": {
++ "type": "string",
++ "maxLength": 64
++ },
++ "own": {
++ "type": "boolean"
++ }
++ }
++ }
++ },
++ "chat.tts-speak-result": {
++ "version": "1.0.0",
++ "owner": "chat",
++ "status": "active",
++ "schema": {
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/chat/tts-speak-result.v1.json",
++ "title": "ChatTTSSpeakResult",
++ "description": "chat.tts-speak-result@1: the answer of POST /api/agent-voice/speak (Agent Streams S4). AUDIO is the sound of the line (base64), MIME_TYPE what it is, and RATE the sample rate the desk decodes it to (the stream track is 48 kHz).",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "audio",
++ "mime_type"
++ ],
++ "properties": {
++ "audio": {
++ "type": "string",
++ "description": "The audio, base64."
++ },
++ "mime_type": {
++ "type": "string",
++ "enum": [
++ "audio/mpeg",
++ "audio/wav",
++ "audio/ogg",
++ "audio/webm"
++ ]
++ },
++ "rate": {
++ "type": "integer",
++ "minimum": 1
++ },
++ "voice_id": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "maxLength": 64
++ }
++ }
++ }
}
}
}
ddiff --git a/generated/openapi/actor.json b/generated/openapi/actor.json
iindex 7ca1d1d7..7458a8ed 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.300.0",
-- "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.300.0): each operation lists the capabilities it performs; a token for 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.301.0",
++ "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.301.0): each operation lists the capabilities it performs; a token for 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 6953ad2a..62b42b3e 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.300.0",
-- "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.300.0): each operation lists the capabilities it performs; a token for 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.301.0",
++ "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.301.0): each operation lists the capabilities it performs; a token for 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/bench.json b/generated/openapi/bench.json
iindex 4b04a017..1a808636 100644
---- a/generated/openapi/bench.json
++++ b/generated/openapi/bench.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Bench API",
-- "version": "0.300.0",
-- "description": "Routes of OpenVibe.Bench as the OpenVibe contracts describe them (openvibe-contracts 0.300.0): each operation lists the capabilities it performs; a token for 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.301.0",
++ "description": "Routes of OpenVibe.Bench as the OpenVibe contracts describe them (openvibe-contracts 0.301.0): each operation lists the capabilities it performs; a token for 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 7dc5395d..28534a14 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.300.0",
-- "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.300.0): each operation lists the capabilities it performs; a token for 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.301.0",
++ "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.301.0): each operation lists the capabilities it performs; a token for 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 079d09d1..c66b14d5 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.300.0",
-- "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.300.0): each operation lists the capabilities it performs; a token for 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.301.0",
++ "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.301.0): each operation lists the capabilities it performs; a token for 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 7f1a5cdb..f3535ab6 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.300.0",
-- "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.300.0): each operation lists the capabilities it performs; a token for 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.301.0",
++ "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.301.0): each operation lists the capabilities it performs; a token for 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 e04c5df1..8e60460d 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.300.0",
-- "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.300.0): each operation lists the capabilities it performs; a token for 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.301.0",
++ "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.301.0): each operation lists the capabilities it performs; a token for 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"
@@@ -16,6 +16,62 @@
}
],
"paths": {
++ "/api/agent-voice/speak": {
++ "post": {
++ "operationId": "post_api_agent_voice_speak",
++ "summary": "Ask OpenVibe.Chat for the sound of one line, in the person own voice and on the person allowance (the Agent Streams plan, S4).",
++ "description": "**chat.tts.speak** (first-party): Ask OpenVibe.Chat for the sound of one line, in the person own voice and on the person allowance (the Agent Streams plan, S4). The caller presents a service token for audience openvibe.chat that names the person it acts for (a node token on_behalf_of), so the voice is that person and never another. The text is one line (220 characters at most). The answer is the audio (base64) with its type; the desk mixes it into the stream Opus track. A person own cloned voice is asked for by name and only by that person.",
++ "tags": [
++ "chat.tts"
++ ],
++ "x-openvibe-capabilities": [
++ "chat.tts.speak"
++ ],
++ "x-openvibe-visibility": [
++ "first-party"
++ ],
++ "x-openvibe-quota-class": "internal-write",
++ "security": [
++ {
++ "openvibeToken": [
++ "chat.tts.speak"
++ ]
++ }
++ ],
++ "requestBody": {
++ "required": false,
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/chat.tts-speak-request.v1"
++ }
++ }
++ }
++ },
++ "responses": {
++ "2XX": {
++ "description": "Success",
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/chat.tts-speak-result.v1"
++ }
++ }
++ }
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ }
++ },
"/api/chat/inboxes": {
"get": {
"operationId": "get_api_chat_inboxes",
@@@ -8270,6 +8326,65 @@
}
]
},
++ "chat.tts-speak-request.v1": {
++ "title": "ChatTTSSpeakRequest",
++ "description": "chat.tts-speak-request@1: the body of POST /api/agent-voice/speak (Agent Streams S4). The desk asks Chat for the sound of one line the agent said. TEXT is the line (at most 220 characters). VOICE is a Chat voice id, or absent for the site default. OWN asks for the person own voice, and only the person themself may ask for it.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "text"
++ ],
++ "properties": {
++ "text": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 220
++ },
++ "voice": {
++ "type": "string",
++ "maxLength": 64
++ },
++ "own": {
++ "type": "boolean"
++ }
++ }
++ },
++ "chat.tts-speak-result.v1": {
++ "title": "ChatTTSSpeakResult",
++ "description": "chat.tts-speak-result@1: the answer of POST /api/agent-voice/speak (Agent Streams S4). AUDIO is the sound of the line (base64), MIME_TYPE what it is, and RATE the sample rate the desk decodes it to (the stream track is 48 kHz).",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "audio",
++ "mime_type"
++ ],
++ "properties": {
++ "audio": {
++ "type": "string",
++ "description": "The audio, base64."
++ },
++ "mime_type": {
++ "type": "string",
++ "enum": [
++ "audio/mpeg",
++ "audio/wav",
++ "audio/ogg",
++ "audio/webm"
++ ]
++ },
++ "rate": {
++ "type": "integer",
++ "minimum": 1
++ },
++ "voice_id": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "maxLength": 64
++ }
++ }
++ },
"chat.vibe-ask-request.v1": {
"title": "ChatVibeAskRequest",
"description": "chat.vibe-ask-request@1: a first-party service asks Vibe, OpenVibe's assistant, on a person's behalf (Vibe by voice: OpenVibe.Bot passes what the person said after their machine's call word). Chat keeps it in the person's own Vibe chats, one chat per source (\"Voice on <machine>\"), and answers with Vibe's reply, which counts against the person's daily allowance like any of their Vibe answers. POST /internal/chat/vibe/ask, capability chat.vibe.ask, loopback only.",
ddiff --git a/generated/openapi/codes.json b/generated/openapi/codes.json
iindex 35c62b9e..6daf385b 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.300.0",
-- "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.300.0): each operation lists the capabilities it performs; a token for 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.301.0",
++ "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.301.0): each operation lists the capabilities it performs; a token for 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 6d7b389f..764e82d4 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.300.0",
-- "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.300.0): each operation lists the capabilities it performs; a token for 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.301.0",
++ "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.301.0): each operation lists the capabilities it performs; a token for 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 46624748..a81f5e8f 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.300.0",
-- "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.300.0): each operation lists the capabilities it performs; a token for 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.301.0",
++ "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.301.0): each operation lists the capabilities it performs; a token for 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 9c2a167e..d17bf32a 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.300.0",
-- "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.300.0): each operation lists the capabilities it performs; a token for 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.301.0",
++ "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.301.0): each operation lists the capabilities it performs; a token for 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/domains.json b/generated/openapi/domains.json
iindex b2f74560..471a1302 100644
---- a/generated/openapi/domains.json
++++ b/generated/openapi/domains.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Domains API",
-- "version": "0.300.0",
-- "description": "Routes of OpenVibe.Domains as the OpenVibe contracts describe them (openvibe-contracts 0.300.0): each operation lists the capabilities it performs; a token for 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.301.0",
++ "description": "Routes of OpenVibe.Domains as the OpenVibe contracts describe them (openvibe-contracts 0.301.0): each operation lists the capabilities it performs; a token for 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 44a5ba0d..8c38e3fd 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.300.0",
-- "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.300.0): each operation lists the capabilities it performs; a token for 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.301.0",
++ "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.301.0): each operation lists the capabilities it performs; a token for 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 68c7489d..770984fb 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.300.0",
-- "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.300.0): each operation lists the capabilities it performs; a token for 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.301.0",
++ "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.301.0): each operation lists the capabilities it performs; a token for 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 348ce62d..a0b98f85 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.300.0",
-- "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.300.0): each operation lists the capabilities it performs; a token for 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.301.0",
++ "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.301.0): each operation lists the capabilities it performs; a token for 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 4874f59d..db2aafcc 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.300.0",
-- "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.300.0): each operation lists the capabilities it performs; a token for 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.301.0",
++ "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.301.0): each operation lists the capabilities it performs; a token for 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/index.json b/generated/openapi/index.json
iindex 7523e825..70461f57 100644
---- a/generated/openapi/index.json
++++ b/generated/openapi/index.json
@@@ -47,8 +47,8 @@
"service": "chat",
"name": "OpenVibe.Chat",
"origin": "https://openvibe.chat",
-- "operations": 54,
-- "capabilities": 19
++ "operations": 55,
++ "capabilities": 20
},
{
"service": "codes",
ddiff --git a/generated/openapi/inventory.json b/generated/openapi/inventory.json
iindex ed2d99d9..ab2a49b0 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.300.0",
-- "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.300.0): each operation lists the capabilities it performs; a token for 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.301.0",
++ "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.301.0): each operation lists the capabilities it performs; a token for 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 ac89f685..6fb74b0d 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.300.0",
-- "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.300.0): each operation lists the capabilities it performs; a token for 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.301.0",
++ "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.301.0): each operation lists the capabilities it performs; a token for 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 b01c8602..dbe50410 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.300.0",
-- "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.300.0): each operation lists the capabilities it performs; a token for 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.301.0",
++ "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.301.0): each operation lists the capabilities it performs; a token for 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 e952ddd7..8c1bb222 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.300.0",
-- "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.300.0): each operation lists the capabilities it performs; a token for 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.301.0",
++ "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.301.0): each operation lists the capabilities it performs; a token for 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 6da4190d..ff5d5326 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.300.0",
-- "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.300.0): each operation lists the capabilities it performs; a token for 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.301.0",
++ "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.301.0): each operation lists the capabilities it performs; a token for 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 f89b05ab..0a8c45c7 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.300.0",
-- "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.300.0): each operation lists the capabilities it performs; a token for 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.301.0",
++ "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.301.0): each operation lists the capabilities it performs; a token for 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 3294e5b3..cdc13ec4 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.300.0",
-- "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.300.0): each operation lists the capabilities it performs; a token for 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.301.0",
++ "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.301.0): each operation lists the capabilities it performs; a token for 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 490578db..ac8555bb 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.300.0",
-- "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.300.0): each operation lists the capabilities it performs; a token for 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.301.0",
++ "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.301.0): each operation lists the capabilities it performs; a token for 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 fafa5a0e..02268bee 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.300.0",
-- "description": "Routes of OpenVibe.Quest as the OpenVibe contracts describe them (openvibe-contracts 0.300.0): each operation lists the capabilities it performs; a token for 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.301.0",
++ "description": "Routes of OpenVibe.Quest as the OpenVibe contracts describe them (openvibe-contracts 0.301.0): each operation lists the capabilities it performs; a token for 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/report.json b/generated/openapi/report.json
iindex 54e76715..8ebd09ea 100644
---- a/generated/openapi/report.json
++++ b/generated/openapi/report.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Report API",
-- "version": "0.300.0",
-- "description": "Routes of OpenVibe.Report as the OpenVibe contracts describe them (openvibe-contracts 0.300.0): each operation lists the capabilities it performs; a token for 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.301.0",
++ "description": "Routes of OpenVibe.Report as the OpenVibe contracts describe them (openvibe-contracts 0.301.0): each operation lists the capabilities it performs; a token for 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 3346ec66..ac15a89c 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.300.0",
-- "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.300.0): each operation lists the capabilities it performs; a token for 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.301.0",
++ "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.301.0): each operation lists the capabilities it performs; a token for 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 285e8d28..0e3715fa 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.300.0",
-- "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.300.0): each operation lists the capabilities it performs; a token for 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.301.0",
++ "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.301.0): each operation lists the capabilities it performs; a token for 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 3b3527da..c830d7c2 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.300.0",
-- "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.300.0): each operation lists the capabilities it performs; a token for 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.301.0",
++ "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.301.0): each operation lists the capabilities it performs; a token for 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 93a996c2..f36d2d98 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.300.0",
-- "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.300.0): each operation lists the capabilities it performs; a token for 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.301.0",
++ "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.301.0): each operation lists the capabilities it performs; a token for 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 2811001d..2b0b626c 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.300.0",
-- "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.300.0): each operation lists the capabilities it performs; a token for 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.301.0",
++ "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.301.0): each operation lists the capabilities it performs; a token for 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 1d2a0e60..2e01815f 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.300.0",
-- "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.300.0): each operation lists the capabilities it performs; a token for 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.301.0",
++ "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.301.0): each operation lists the capabilities it performs; a token for 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 a17b5268..191f4e80 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.300.0",
-- "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.300.0): each operation lists the capabilities it performs; a token for 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.301.0",
++ "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.301.0): each operation lists the capabilities it performs; a token for 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/today.json b/generated/openapi/today.json
iindex 5803da47..3fe5dcf4 100644
---- a/generated/openapi/today.json
++++ b/generated/openapi/today.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Today API",
-- "version": "0.300.0",
-- "description": "Routes of OpenVibe.Today as the OpenVibe contracts describe them (openvibe-contracts 0.300.0): each operation lists the capabilities it performs; a token for 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.301.0",
++ "description": "Routes of OpenVibe.Today as the OpenVibe contracts describe them (openvibe-contracts 0.301.0): each operation lists the capabilities it performs; a token for 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 63b98870..99cb5106 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.300.0",
-- "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.300.0): each operation lists the capabilities it performs; a token for 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.301.0",
++ "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.301.0): each operation lists the capabilities it performs; a token for 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 82c55aff..10efbbfa 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.300.0",
-- "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.300.0): each operation lists the capabilities it performs; a token for 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.301.0",
++ "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.301.0): each operation lists the capabilities it performs; a token for 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 18520e54..5ba6e86d 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.300.0",
-- "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.300.0): each operation lists the capabilities it performs; a token for 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.301.0",
++ "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.301.0): each operation lists the capabilities it performs; a token for 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/vision.json b/generated/openapi/vision.json
iindex b93f5ad4..90c6e442 100644
---- a/generated/openapi/vision.json
++++ b/generated/openapi/vision.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Vision API",
-- "version": "0.300.0",
-- "description": "Routes of OpenVibe.Vision as the OpenVibe contracts describe them (openvibe-contracts 0.300.0): each operation lists the capabilities it performs; a token for 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.301.0",
++ "description": "Routes of OpenVibe.Vision as the OpenVibe contracts describe them (openvibe-contracts 0.301.0): each operation lists the capabilities it performs; a token for 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 8a010fa0..29d6f620 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.300.0",
-- "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.300.0): each operation lists the capabilities it performs; a token for 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.301.0",
++ "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.301.0): each operation lists the capabilities it performs; a token for 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 d006e236..b0295894 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.300.0",
-- "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.300.0): each operation lists the capabilities it performs; a token for 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.301.0",
++ "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.301.0): each operation lists the capabilities it performs; a token for 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 7e708d98..b49e10ee 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.300.0",
-- "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.300.0): each operation lists the capabilities it performs; a token for 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.301.0",
++ "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.301.0): each operation lists the capabilities it performs; a token for 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 cb237d9e..4e9faa26 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.300.0",
-- "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.300.0): each operation lists the capabilities it performs; a token for 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.301.0",
++ "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.301.0): each operation lists the capabilities it performs; a token for 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 b61d142f..e66a4157 100644
---- a/generated/typescript/index.d.ts
++++ b/generated/typescript/index.d.ts
@@@ -292373,6 +292373,8 @@ export interface LiveAgentStreamState {
ends_at: string | null;
}
++/** [email protected] (owner: live) */
++
/** [email protected] (owner: live) */
/**
* live.agent-stream-curtain-request@1 (the Agent Streams plan, S1): the body of POST /api/streams/agent/:id/curtain on OpenVibe.Live (capability live.agent_stream.publish): the desk reports that its privacy screen went up or came down. While the curtain is up Live pauses every viewer's consumer (mediasoup consumer.pause()), so a desk that failed to blank still shows nothing. Viewers see 'Private screen' and never why. The curtain comes down only from the desk, after its detectors report clear for two seconds, or from the owner's own button; a detector that fails or is unsure puts it up and never down.
@@@ -292673,3 +292675,27 @@ export interface ReportSessionWriteResult {
*/
created: boolean;
}
++
++/** [email protected] (owner: chat) */
++/**
++ * chat.tts-speak-request@1: the body of POST /api/agent-voice/speak (Agent Streams S4). The desk asks Chat for the sound of one line the agent said. TEXT is the line (at most 220 characters). VOICE is a Chat voice id, or absent for the site default. OWN asks for the person own voice, and only the person themself may ask for it.
++ */
++export interface ChatTTSSpeakRequest {
++ text: string;
++ voice?: string;
++ own?: boolean;
++}
++
++/** [email protected] (owner: chat) */
++/**
++ * chat.tts-speak-result@1: the answer of POST /api/agent-voice/speak (Agent Streams S4). AUDIO is the sound of the line (base64), MIME_TYPE what it is, and RATE the sample rate the desk decodes it to (the stream track is 48 kHz).
++ */
++export interface ChatTTSSpeakResult {
++ /**
++ * The audio, base64.
++ */
++ audio: string;
++ mime_type: "audio/mpeg" | "audio/wav" | "audio/ogg" | "audio/webm";
++ rate?: number;
++ voice_id?: string | null;
++}
ddiff --git a/manifests/capabilities/chat.tts.speak.json b/manifests/capabilities/chat.tts.speak.json
nnew file mode 100644
iindex 00000000..c9ebcbc3
---- /dev/null
++++ b/manifests/capabilities/chat.tts.speak.json
@@@ -0,0 +1,21 @@
++{
++ "id": "chat.tts.speak",
++ "version": "1.0",
++ "owner": "chat",
++ "status": "active",
++ "visibility": "first-party",
++ "description": "Ask OpenVibe.Chat for the sound of one line, in the person own voice and on the person allowance (the Agent Streams plan, S4). The caller presents a service token for audience openvibe.chat that names the person it acts for (a node token on_behalf_of), so the voice is that person and never another. The text is one line (220 characters at most). The answer is the audio (base64) with its type; the desk mixes it into the stream Opus track. A person own cloned voice is asked for by name and only by that person.",
++ "permissions": [
++ "chat:tts"
++ ],
++ "resourceConstraints": [
++ "owner"
++ ],
++ "quotaClass": "internal-write",
++ "events": [],
++ "implementedBy": [
++ "POST /api/agent-voice/speak"
++ ],
++ "inputSchema": "chat.tts-speak-request@1",
++ "outputSchema": "chat.tts-speak-result@1"
++}
ddiff --git a/manifests/services/chat.json b/manifests/services/chat.json
iindex fb3306e4..3b6473d6 100644
---- a/manifests/services/chat.json
++++ b/manifests/services/chat.json
@@@ -12,25 +12,26 @@
],
"publicOrigin": "https://openvibe.chat",
"capabilities": [
++ "chat.analysis.read",
"chat.cache.invalidate",
"chat.event.publish",
++ "chat.inbox.manage",
++ "chat.inbox.read",
++ "chat.inbox.reply",
"chat.live_bridge.write",
"chat.message.send",
-- "chat.analysis.read",
"chat.messages.read",
"chat.moderation.queue.read",
"chat.moderation.read",
"chat.moderation.write",
"chat.presence.read",
++ "chat.resource.control",
++ "chat.resource.read",
"chat.sounds.read",
"chat.sounds.write",
"chat.stats.read",
"chat.ticket.write",
-- "chat.resource.read",
-- "chat.resource.control",
-- "chat.inbox.read",
-- "chat.inbox.reply",
-- "chat.inbox.manage",
++ "chat.tts.speak",
"chat.vibe.ask",
"chat.vibe.deliver"
],
@@@ -88,7 +89,7 @@
},
{
"kind": "consumer",
-- "what": "OpenVibe.Events redelivers the events of Chat's subscriptions (network.block.changed, network.user.token_valid_after, live.release.deployed, …) that were pending during the stop (at least once, deduped by event_id)"
++ "what": "OpenVibe.Events redelivers the events of Chat's subscriptions (network.block.changed, network.user.token_valid_after, live.release.deployed, \u2026) that were pending during the stop (at least once, deduped by event_id)"
}
]
},
@@@ -99,7 +100,7 @@
],
"window": "automatic only while ovhost waits for readiness after the restart (30 s in host.example.json); manual afterwards, as long as no blocker applies",
"blockers": {
-- "none": "the schema code only adds (CREATE … IF NOT EXISTS, ADD COLUMN; no DROP, RENAME or table rebuild), which an older release ignores"
++ "none": "the schema code only adds (CREATE \u2026 IF NOT EXISTS, ADD COLUMN; no DROP, RENAME or table rebuild), which an older release ignores"
}
},
"contracts": {
ddiff --git a/package-lock.json b/package-lock.json
iindex f23bbbc0..fb0a6990 100644
---- a/package-lock.json
++++ b/package-lock.json
@@@ -1,12 +1,12 @@
{
"name": "openvibe-contracts",
-- "version": "0.299.0",
++ "version": "0.301.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "openvibe-contracts",
-- "version": "0.299.0",
++ "version": "0.301.0",
"license": "AGPL-3.0-only",
"dependencies": {
"ajv": "^8.17.1",
ddiff --git a/package.json b/package.json
iindex 03a86957..5a023435 100644
---- a/package.json
++++ b/package.json
@@@ -1,6 +1,6 @@
{
"name": "openvibe-contracts",
-- "version": "0.300.0",
++ "version": "0.301.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",