openvibers/openvibe.contracts Commits

Agent Streams S7: schedules and watch parties (0.305.0) (#315)

OP OpenVibers committed 6 days ago · 3e5c5893b4 · 62 files, +1355 −100

Changes

ddiff --git a/CHANGELOG.md b/CHANGELOG.md
iindex 8cc9aeaf..fc5765ba 100644
---- a/CHANGELOG.md
++++ b/CHANGELOG.md
@@@ -1,5 +1,13 @@
# Changelog
++## 0.305.0 — 2026-11-07
++
++- Give the id kinds the S7 work needs a prefix: `newId('agent_stream_schedule')` is `scd_…` (a scheduled public agent stream) and `newId('party')` is `pty_…` (a watch party's id when a party is not named by its room slug).
++- Add `live.agent-stream-schedule@1` (Agent Streams S7): an owner's schedule for a public agent stream — a time, a task template and the mode. Live starts it when the owner's desk is online; when the desk is not, the record says `missed` with `desk_offline` ("didn't start: the desk was offline") and nothing runs. A `chatplays` schedule keeps its time but waits for the owner's Go (`waits_for_go`), the S6 rule. The record carries the stream it started, its reminder count (the people who opted in, never who they are) and the page where it shows 24 hours before its time.
++- Add `chat.party@1` (Agent Streams S7): a watch party on a public agent stream or its VOD, a Chat room of kind `party`. On a VOD the position follows the host's; on a live stream it follows the live edge. A party is private by default, joining is by its link, and a listed party reaches the stream's page only as a count ("3 parties watching") — the count never carries names.
++- Extend `live.agent_stream.publish` with the schedule routes and the desk heartbeat: `POST|GET /api/streams/agent/schedules`, `DELETE /api/streams/agent/schedules/:id`, `POST /api/streams/agent/schedules/:id/remind`, `POST /api/streams/agent/schedules/:id/go` and `POST /api/streams/agent/desk/heartbeat`.
++- Valid and invalid fixtures cover a scheduled stream, a missed one with the desk offline, a chatplays schedule that waits for Go, a missing task and an unknown state; a private VOD party, a live party with a link, a party made public and a party with a room id that cannot exist.
++
## 0.304.0 — 2026-11-06
- Give the id kinds the Agent Streams work needs a prefix: `newId('agent_stream')` is `ags_…` (an agent stream's id), `newId('play_request')` is `req_…` (a chat plays request) and `newId('sandbox_session')` is `sbs_…` (the sandbox desk). Without them a service that had to name one of these ids had to build the ULID itself, and `newId('ags')` threw.
ddiff --git a/contracts/catalog.json b/contracts/catalog.json
iindex bc94200e..8ed29afa 100644
---- a/contracts/catalog.json
++++ b/contracts/catalog.json
@@@ -9609,6 +9609,24 @@
"visibility": "first-party",
"compatibility": "backward",
"status": "active"
++ },
++ {
++ "id": "live.agent-stream-schedule",
++ "version": "1.0.0",
++ "owner": "live",
++ "schema": "live/agent-stream-schedule.v1.json",
++ "visibility": "public",
++ "compatibility": "backward",
++ "status": "active"
++ },
++ {
++ "id": "chat.party",
++ "version": "1.0.0",
++ "owner": "chat",
++ "schema": "chat/party.v1.json",
++ "visibility": "first-party",
++ "compatibility": "backward",
++ "status": "active"
}
]
}
ddiff --git a/contracts/chat/party.v1.json b/contracts/chat/party.v1.json
nnew file mode 100644
iindex 00000000..23b20492
---- /dev/null
++++ b/contracts/chat/party.v1.json
@@@ -0,0 +1,106 @@
++{
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/chat/party.v1.json",
++ "title": "ChatParty",
++ "description": "chat.party@1 (Agent Streams S7): a watch party on a public agent stream or its VOD. A party is a Chat room of kind 'party' where friends watch in sync with their own chat beside the stream's. On a VOD the position follows the host's; on a live stream it follows the live edge, so there is no position to keep. A party is private by default: joining is by its link, and it may be listed on the stream's page as a count only ('3 parties watching') — names are never in that count. The id is the room's slug.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "id",
++ "agent_stream_id",
++ "host",
++ "title",
++ "sync",
++ "visibility",
++ "listed",
++ "join_url",
++ "created_at"
++ ],
++ "properties": {
++ "id": {
++ "type": "string",
++ "pattern": "^[a-z0-9][a-z0-9-]{1,30}[a-z0-9]$",
++ "description": "The party room's slug (its room id in Chat)."
++ },
++ "agent_stream_id": {
++ "type": "string",
++ "pattern": "^ags_[0-9A-HJKMNP-TV-Z]{26}$",
++ "description": "The public agent stream the party watches."
++ },
++ "vod_id": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "description": "Media's recording id when the party watches the VOD; null on a live stream."
++ },
++ "host": {
++ "type": "string",
++ "pattern": "^usr_[0-9A-HJKMNP-TV-Z]{26}$",
++ "description": "The person whose position the party follows on a VOD."
++ },
++ "title": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 200
++ },
++ "sync": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "mode",
++ "playing"
++ ],
++ "properties": {
++ "mode": {
++ "enum": [
++ "live",
++ "vod"
++ ],
++ "description": "Live follows the live edge; vod follows the host's position."
++ },
++ "position_s": {
++ "type": "integer",
++ "minimum": 0,
++ "description": "The host's position on the VOD, in whole seconds. Absent on a live stream."
++ },
++ "playing": {
++ "type": "boolean"
++ },
++ "at": {
++ "type": "string",
++ "format": "date-time",
++ "description": "When the position was set; a reader adds the time since to a playing position."
++ }
++ }
++ },
++ "visibility": {
++ "enum": [
++ "private",
++ "link"
++ ],
++ "description": "Private by default: members only. 'link' lets anyone with join_url in; neither makes the party a directory entry."
++ },
++ "listed": {
++ "type": "boolean",
++ "description": "Whether the stream's page counts this party. The count carries no names."
++ },
++ "join_url": {
++ "type": "string",
++ "format": "uri",
++ "pattern": "^(https://openvibe\\.chat|https://openvibe\\.live)/",
++ "description": "The party's link, the one way in."
++ },
++ "created_at": {
++ "type": "string",
++ "format": "date-time"
++ },
++ "ended_at": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "format": "date-time"
++ }
++ }
++}
ddiff --git a/contracts/live/agent-stream-schedule.v1.json b/contracts/live/agent-stream-schedule.v1.json
nnew file mode 100644
iindex 00000000..ecfc7bb0
---- /dev/null
++++ b/contracts/live/agent-stream-schedule.v1.json
@@@ -0,0 +1,135 @@
++{
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/live/agent-stream-schedule.v1.json",
++ "title": "LiveAgentStreamSchedule",
++ "description": "live.agent-stream-schedule@1 (Agent Streams S7): an owner's schedule for a public agent stream. A schedule names a time, the task template the desk will run and the mode; Live starts it when the owner's desk is online, and when the desk is not it says 'didn't start: the desk was offline' and runs nothing. A chatplays schedule never starts on its own: it waits for the owner's Go (the S6 rule). The schedule shows on the channel's Agents tab and in Today 24 hours before its time. The id is scd_<ULID>; the started stream (if any) is named by agent_stream_id.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "id",
++ "owner",
++ "channel",
++ "title",
++ "task",
++ "mode",
++ "visibility",
++ "starts_at",
++ "state",
++ "created_at"
++ ],
++ "properties": {
++ "id": {
++ "type": "string",
++ "pattern": "^scd_[0-9A-HJKMNP-TV-Z]{26}$",
++ "description": "The schedule's id (ULID, Crockford base32)."
++ },
++ "owner": {
++ "type": "string",
++ "pattern": "^usr_[0-9A-HJKMNP-TV-Z]{26}$",
++ "description": "The person whose desk runs the scheduled task."
++ },
++ "channel": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 64,
++ "description": "The owner's Live channel username."
++ },
++ "title": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 200
++ },
++ "task": {
++ "$ref": "agent-stream.v1.json#/$defs/task"
++ },
++ "mode": {
++ "enum": [
++ "watch",
++ "narrated",
++ "copilot",
++ "chatplays"
++ ],
++ "description": "How the stream is played. Watch, Narrated and Co-pilot may start on schedule; chatplays waits for the owner's Go."
++ },
++ "visibility": {
++ "enum": [
++ "private",
++ "unlisted",
++ "public"
++ ],
++ "description": "Who may watch the stream the schedule starts. Today shows public schedules only."
++ },
++ "starts_at": {
++ "type": "string",
++ "format": "date-time"
++ },
++ "state": {
++ "enum": [
++ "scheduled",
++ "live",
++ "ended",
++ "missed",
++ "cancelled"
++ ],
++ "description": "Where the schedule stands: scheduled, live (with agent_stream_id), ended, missed ('didn't start: the desk was offline') or cancelled by its owner."
++ },
++ "agent_stream_id": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "pattern": "^ags_[0-9A-HJKMNP-TV-Z]{26}$",
++ "description": "The stream the schedule started, once it did."
++ },
++ "missed_reason": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "enum": [
++ "desk_offline",
++ "task_not_ready",
++ "waits_for_go",
++ null
++ ],
++ "description": "Why a scheduled start did not happen. 'waits_for_go' is a chatplays schedule keeping its time until the owner presses Go; 'desk_offline' is the design's 'didn't start: the desk was offline'."
++ },
++ "waits_for_go": {
++ "type": "boolean",
++ "description": "True for a chatplays schedule: the time has come but nothing runs until the owner presses Go."
++ },
++ "started_at": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "format": "date-time"
++ },
++ "ended_at": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "format": "date-time"
++ },
++ "reminders": {
++ "type": "integer",
++ "minimum": 0,
++ "description": "How many followers opted in to a reminder; neighbours never see who they are."
++ },
++ "reminded": {
++ "type": "boolean",
++ "description": "For the caller's own view: whether this caller opted in to a reminder. Absent when there is no caller."
++ },
++ "page_url": {
++ "type": "string",
++ "format": "uri",
++ "pattern": "^https://openvibe\\.live/",
++ "description": "The channel's Agents tab, where the schedule shows 24 hours before its time."
++ },
++ "created_at": {
++ "type": "string",
++ "format": "date-time"
++ }
++ }
++}
ddiff --git a/fixtures/chat.party/invalid/bad-room-id.json b/fixtures/chat.party/invalid/bad-room-id.json
nnew file mode 100644
iindex 00000000..f64e89da
---- /dev/null
++++ b/fixtures/chat.party/invalid/bad-room-id.json
@@@ -0,0 +1,15 @@
++{
++ "id": "Bad Slug!",
++ "agent_stream_id": "ags_01JAB2C3D4E5F6G7H8J9K0MNPV",
++ "host": "usr_01JAB2C3D4E5F6G7H8J9K0MNPT",
++ "title": "Bad room id",
++ "sync": {
++ "mode": "vod",
++ "position_s": 0,
++ "playing": false
++ },
++ "visibility": "private",
++ "listed": false,
++ "join_url": "https://openvibe.chat/rooms/bad",
++ "created_at": "2026-11-07T21:00:00.000Z"
++}
ddiff --git a/fixtures/chat.party/invalid/public-visibility.json b/fixtures/chat.party/invalid/public-visibility.json
nnew file mode 100644
iindex 00000000..7c98898b
---- /dev/null
++++ b/fixtures/chat.party/invalid/public-visibility.json
@@@ -0,0 +1,15 @@
++{
++ "id": "public-party",
++ "agent_stream_id": "ags_01JAB2C3D4E5F6G7H8J9K0MNPW",
++ "host": "usr_01JAB2C3D4E5F6G7H8J9K0MNPT",
++ "title": "A party anyone can find",
++ "sync": {
++ "mode": "vod",
++ "position_s": 0,
++ "playing": false
++ },
++ "visibility": "public",
++ "listed": true,
++ "join_url": "https://openvibe.chat/rooms/public-party",
++ "created_at": "2026-11-07T21:00:00.000Z"
++}
ddiff --git a/fixtures/chat.party/valid/live-link.json b/fixtures/chat.party/valid/live-link.json
nnew file mode 100644
iindex 00000000..2e1e74ce
---- /dev/null
++++ b/fixtures/chat.party/valid/live-link.json
@@@ -0,0 +1,15 @@
++{
++ "id": "live-edge",
++ "agent_stream_id": "ags_01JAB2C3D4E5F6G7H8J9K0MNPV",
++ "vod_id": null,
++ "host": "usr_01JAB2C3D4E5F6G7H8J9K0MNPT",
++ "title": "Watching the live edge",
++ "sync": {
++ "mode": "live",
++ "playing": true
++ },
++ "visibility": "link",
++ "listed": false,
++ "join_url": "https://openvibe.live/@mira/agents/ags_01JAB2C3D4E5F6G7H8J9K0MNPV?party=live-edge",
++ "created_at": "2026-11-07T21:00:00.000Z"
++}
ddiff --git a/fixtures/chat.party/valid/vod-private.json b/fixtures/chat.party/valid/vod-private.json
nnew file mode 100644
iindex 00000000..fbabb408
---- /dev/null
++++ b/fixtures/chat.party/valid/vod-private.json
@@@ -0,0 +1,18 @@
++{
++ "id": "friday-watch",
++ "agent_stream_id": "ags_01JAB2C3D4E5F6G7H8J9K0MNPS",
++ "vod_id": "4242",
++ "host": "usr_01JAB2C3D4E5F6G7H8J9K0MNPT",
++ "title": "Friday watch: the robot build",
++ "sync": {
++ "mode": "vod",
++ "position_s": 312,
++ "playing": true,
++ "at": "2026-11-07T20:30:00.000Z"
++ },
++ "visibility": "private",
++ "listed": true,
++ "join_url": "https://openvibe.chat/rooms/friday-watch",
++ "created_at": "2026-11-07T20:00:00.000Z",
++ "ended_at": null
++}
ddiff --git a/fixtures/live.agent-stream-schedule/invalid/missing-task.json b/fixtures/live.agent-stream-schedule/invalid/missing-task.json
nnew file mode 100644
iindex 00000000..ec8be5b2
---- /dev/null
++++ b/fixtures/live.agent-stream-schedule/invalid/missing-task.json
@@@ -0,0 +1,11 @@
++{
++ "id": "scd_01JAB2C3D4E5F6G7H8J9K0MNP1",
++ "owner": "usr_01JAB2C3D4E5F6G7H8J9K0MNPT",
++ "channel": "mira",
++ "title": "No task",
++ "mode": "watch",
++ "visibility": "public",
++ "starts_at": "2026-11-08T19:00:00.000Z",
++ "state": "scheduled",
++ "created_at": "2026-11-07T02:00:00.000Z"
++}
ddiff --git a/fixtures/live.agent-stream-schedule/invalid/unknown-state.json b/fixtures/live.agent-stream-schedule/invalid/unknown-state.json
nnew file mode 100644
iindex 00000000..1785d120
---- /dev/null
++++ b/fixtures/live.agent-stream-schedule/invalid/unknown-state.json
@@@ -0,0 +1,16 @@
++{
++ "id": "scd_01JAB2C3D4E5F6G7H8J9K0MNP2",
++ "owner": "usr_01JAB2C3D4E5F6G7H8J9K0MNPT",
++ "channel": "mira",
++ "title": "Confusing state",
++ "task": {
++ "source": "codes",
++ "ref": "tsk_01JAB2C3D4E5F6G7H8J9K0MNQ2",
++ "title": "A task"
++ },
++ "mode": "watch",
++ "visibility": "public",
++ "starts_at": "2026-11-08T19:00:00.000Z",
++ "state": "postponed",
++ "created_at": "2026-11-07T02:00:00.000Z"
++}
ddiff --git a/fixtures/live.agent-stream-schedule/valid/missed-desk-offline.json b/fixtures/live.agent-stream-schedule/valid/missed-desk-offline.json
nnew file mode 100644
iindex 00000000..b7e232d7
---- /dev/null
++++ b/fixtures/live.agent-stream-schedule/valid/missed-desk-offline.json
@@@ -0,0 +1,23 @@
++{
++ "id": "scd_01JAB2C3D4E5F6G7H8J9K0MNPX",
++ "owner": "usr_01JAB2C3D4E5F6G7H8J9K0MNPT",
++ "channel": "mira",
++ "title": "Nightly dependency update",
++ "task": {
++ "source": "actor",
++ "ref": "tsk_01JAB2C3D4E5F6G7H8J9K0MNPY",
++ "title": "Update the dependencies"
++ },
++ "mode": "watch",
++ "visibility": "public",
++ "starts_at": "2026-11-08T03:00:00.000Z",
++ "state": "missed",
++ "agent_stream_id": null,
++ "missed_reason": "desk_offline",
++ "waits_for_go": false,
++ "started_at": null,
++ "ended_at": null,
++ "reminders": 0,
++ "page_url": "https://openvibe.live/@mira/agents",
++ "created_at": "2026-11-07T03:00:00.000Z"
++}
ddiff --git a/fixtures/live.agent-stream-schedule/valid/scheduled.json b/fixtures/live.agent-stream-schedule/valid/scheduled.json
nnew file mode 100644
iindex 00000000..ec6af7ac
---- /dev/null
++++ b/fixtures/live.agent-stream-schedule/valid/scheduled.json
@@@ -0,0 +1,25 @@
++{
++ "id": "scd_01JAB2C3D4E5F6G7H8J9K0MNPS",
++ "owner": "usr_01JAB2C3D4E5F6G7H8J9K0MNPT",
++ "channel": "mira",
++ "title": "Fix the login page, on a schedule",
++ "task": {
++ "source": "codes",
++ "ref": "tsk_01JAB2C3D4E5F6G7H8J9K0MNPW",
++ "title": "Fix the login page",
++ "url": "https://openvibe.codes/t/tsk_01JAB2C3D4E5F6G7H8J9K0MNPW"
++ },
++ "mode": "narrated",
++ "visibility": "public",
++ "starts_at": "2026-11-08T19:00:00.000Z",
++ "state": "scheduled",
++ "agent_stream_id": null,
++ "missed_reason": null,
++ "waits_for_go": false,
++ "started_at": null,
++ "ended_at": null,
++ "reminders": 3,
++ "reminded": true,
++ "page_url": "https://openvibe.live/@mira/agents",
++ "created_at": "2026-11-07T02:00:00.000Z"
++}
ddiff --git a/fixtures/live.agent-stream-schedule/valid/waits-for-go.json b/fixtures/live.agent-stream-schedule/valid/waits-for-go.json
nnew file mode 100644
iindex 00000000..e22e9af8
---- /dev/null
++++ b/fixtures/live.agent-stream-schedule/valid/waits-for-go.json
@@@ -0,0 +1,23 @@
++{
++ "id": "scd_01JAB2C3D4E5F6G7H8J9K0MNPZ",
++ "owner": "usr_01JAB2C3D4E5F6G7H8J9K0MNPT",
++ "channel": "mira",
++ "title": "Chat plays: build a tiny game",
++ "task": {
++ "source": "codes",
++ "ref": "tsk_01JAB2C3D4E5F6G7H8J9K0MNQ1",
++ "title": "Build a tiny game"
++ },
++ "mode": "chatplays",
++ "visibility": "public",
++ "starts_at": "2026-11-08T20:00:00.000Z",
++ "state": "scheduled",
++ "agent_stream_id": null,
++ "missed_reason": "waits_for_go",
++ "waits_for_go": true,
++ "started_at": null,
++ "ended_at": null,
++ "reminders": 1,
++ "page_url": "https://openvibe.live/@mira/agents",
++ "created_at": "2026-11-07T04:00:00.000Z"
++}
ddiff --git a/generated/json-schema/bundle.json b/generated/json-schema/bundle.json
iindex 7e409943..5789b774 100644
---- a/generated/json-schema/bundle.json
++++ b/generated/json-schema/bundle.json
@@@ -105974,6 +105974,257 @@
}
}
}
++ },
++ "live.agent-stream-schedule": {
++ "version": "1.0.0",
++ "owner": "live",
++ "status": "active",
++ "schema": {
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/live/agent-stream-schedule.v1.json",
++ "title": "LiveAgentStreamSchedule",
++ "description": "live.agent-stream-schedule@1 (Agent Streams S7): an owner's schedule for a public agent stream. A schedule names a time, the task template the desk will run and the mode; Live starts it when the owner's desk is online, and when the desk is not it says 'didn't start: the desk was offline' and runs nothing. A chatplays schedule never starts on its own: it waits for the owner's Go (the S6 rule). The schedule shows on the channel's Agents tab and in Today 24 hours before its time. The id is scd_<ULID>; the started stream (if any) is named by agent_stream_id.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "id",
++ "owner",
++ "channel",
++ "title",
++ "task",
++ "mode",
++ "visibility",
++ "starts_at",
++ "state",
++ "created_at"
++ ],
++ "properties": {
++ "id": {
++ "type": "string",
++ "pattern": "^scd_[0-9A-HJKMNP-TV-Z]{26}$",
++ "description": "The schedule's id (ULID, Crockford base32)."
++ },
++ "owner": {
++ "type": "string",
++ "pattern": "^usr_[0-9A-HJKMNP-TV-Z]{26}$",
++ "description": "The person whose desk runs the scheduled task."
++ },
++ "channel": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 64,
++ "description": "The owner's Live channel username."
++ },
++ "title": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 200
++ },
++ "task": {
++ "$ref": "agent-stream.v1.json#/$defs/task"
++ },
++ "mode": {
++ "enum": [
++ "watch",
++ "narrated",
++ "copilot",
++ "chatplays"
++ ],
++ "description": "How the stream is played. Watch, Narrated and Co-pilot may start on schedule; chatplays waits for the owner's Go."
++ },
++ "visibility": {
++ "enum": [
++ "private",
++ "unlisted",
++ "public"
++ ],
++ "description": "Who may watch the stream the schedule starts. Today shows public schedules only."
++ },
++ "starts_at": {
++ "type": "string",
++ "format": "date-time"
++ },
++ "state": {
++ "enum": [
++ "scheduled",
++ "live",
++ "ended",
++ "missed",
++ "cancelled"
++ ],
++ "description": "Where the schedule stands: scheduled, live (with agent_stream_id), ended, missed ('didn't start: the desk was offline') or cancelled by its owner."
++ },
++ "agent_stream_id": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "pattern": "^ags_[0-9A-HJKMNP-TV-Z]{26}$",
++ "description": "The stream the schedule started, once it did."
++ },
++ "missed_reason": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "enum": [
++ "desk_offline",
++ "task_not_ready",
++ "waits_for_go",
++ null
++ ],
++ "description": "Why a scheduled start did not happen. 'waits_for_go' is a chatplays schedule keeping its time until the owner presses Go; 'desk_offline' is the design's 'didn't start: the desk was offline'."
++ },
++ "waits_for_go": {
++ "type": "boolean",
++ "description": "True for a chatplays schedule: the time has come but nothing runs until the owner presses Go."
++ },
++ "started_at": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "format": "date-time"
++ },
++ "ended_at": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "format": "date-time"
++ },
++ "reminders": {
++ "type": "integer",
++ "minimum": 0,
++ "description": "How many followers opted in to a reminder; neighbours never see who they are."
++ },
++ "reminded": {
++ "type": "boolean",
++ "description": "For the caller's own view: whether this caller opted in to a reminder. Absent when there is no caller."
++ },
++ "page_url": {
++ "type": "string",
++ "format": "uri",
++ "pattern": "^https://openvibe\\.live/",
++ "description": "The channel's Agents tab, where the schedule shows 24 hours before its time."
++ },
++ "created_at": {
++ "type": "string",
++ "format": "date-time"
++ }
++ }
++ }
++ },
++ "chat.party": {
++ "version": "1.0.0",
++ "owner": "chat",
++ "status": "active",
++ "schema": {
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/chat/party.v1.json",
++ "title": "ChatParty",
++ "description": "chat.party@1 (Agent Streams S7): a watch party on a public agent stream or its VOD. A party is a Chat room of kind 'party' where friends watch in sync with their own chat beside the stream's. On a VOD the position follows the host's; on a live stream it follows the live edge, so there is no position to keep. A party is private by default: joining is by its link, and it may be listed on the stream's page as a count only ('3 parties watching') — names are never in that count. The id is the room's slug.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "id",
++ "agent_stream_id",
++ "host",
++ "title",
++ "sync",
++ "visibility",
++ "listed",
++ "join_url",
++ "created_at"
++ ],
++ "properties": {
++ "id": {
++ "type": "string",
++ "pattern": "^[a-z0-9][a-z0-9-]{1,30}[a-z0-9]$",
++ "description": "The party room's slug (its room id in Chat)."
++ },
++ "agent_stream_id": {
++ "type": "string",
++ "pattern": "^ags_[0-9A-HJKMNP-TV-Z]{26}$",
++ "description": "The public agent stream the party watches."
++ },
++ "vod_id": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "description": "Media's recording id when the party watches the VOD; null on a live stream."
++ },
++ "host": {
++ "type": "string",
++ "pattern": "^usr_[0-9A-HJKMNP-TV-Z]{26}$",
++ "description": "The person whose position the party follows on a VOD."
++ },
++ "title": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 200
++ },
++ "sync": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "mode",
++ "playing"
++ ],
++ "properties": {
++ "mode": {
++ "enum": [
++ "live",
++ "vod"
++ ],
++ "description": "Live follows the live edge; vod follows the host's position."
++ },
++ "position_s": {
++ "type": "integer",
++ "minimum": 0,
++ "description": "The host's position on the VOD, in whole seconds. Absent on a live stream."
++ },
++ "playing": {
++ "type": "boolean"
++ },
++ "at": {
++ "type": "string",
++ "format": "date-time",
++ "description": "When the position was set; a reader adds the time since to a playing position."
++ }
++ }
++ },
++ "visibility": {
++ "enum": [
++ "private",
++ "link"
++ ],
++ "description": "Private by default: members only. 'link' lets anyone with join_url in; neither makes the party a directory entry."
++ },
++ "listed": {
++ "type": "boolean",
++ "description": "Whether the stream's page counts this party. The count carries no names."
++ },
++ "join_url": {
++ "type": "string",
++ "format": "uri",
++ "pattern": "^(https://openvibe\\.chat|https://openvibe\\.live)/",
++ "description": "The party's link, the one way in."
++ },
++ "created_at": {
++ "type": "string",
++ "format": "date-time"
++ },
++ "ended_at": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "format": "date-time"
++ }
++ }
++ }
}
}
}
ddiff --git a/generated/openapi/actor.json b/generated/openapi/actor.json
iindex 88e52048..f4c3082e 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.304.0",
-- "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.304.0): each operation lists the capabilities it performs; a token for 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.305.0",
++ "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.305.0): each operation lists the capabilities it performs; a token for 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 a0ed7e70..11687cfc 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.304.0",
-- "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.304.0): each operation lists the capabilities it performs; a token for 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.305.0",
++ "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.305.0): each operation lists the capabilities it performs; a token for 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 097c5cda..f4d10e67 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.304.0",
-- "description": "Routes of OpenVibe.Bench as the OpenVibe contracts describe them (openvibe-contracts 0.304.0): each operation lists the capabilities it performs; a token for 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.305.0",
++ "description": "Routes of OpenVibe.Bench as the OpenVibe contracts describe them (openvibe-contracts 0.305.0): each operation lists the capabilities it performs; a token for 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 bbfdc22f..23ca1f8f 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.304.0",
-- "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.304.0): each operation lists the capabilities it performs; a token for 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.305.0",
++ "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.305.0): each operation lists the capabilities it performs; a token for 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 94d5e631..904ba781 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.304.0",
-- "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.304.0): each operation lists the capabilities it performs; a token for 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.305.0",
++ "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.305.0): each operation lists the capabilities it performs; a token for 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 78e65065..fb60785f 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.304.0",
-- "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.304.0): each operation lists the capabilities it performs; a token for 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.305.0",
++ "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.305.0): each operation lists the capabilities it performs; a token for 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 642cc1cc..91f0470b 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.304.0",
-- "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.304.0): each operation lists the capabilities it performs; a token for 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.305.0",
++ "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.305.0): each operation lists the capabilities it performs; a token for 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 44517d1d..342f236f 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.304.0",
-- "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.304.0): each operation lists the capabilities it performs; a token for 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.305.0",
++ "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.305.0): each operation lists the capabilities it performs; a token for 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 1ed9fcab..ff53d144 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.304.0",
-- "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.304.0): each operation lists the capabilities it performs; a token for 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.305.0",
++ "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.305.0): each operation lists the capabilities it performs; a token for 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 b0fd6b19..ceb2cbe4 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.304.0",
-- "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.304.0): each operation lists the capabilities it performs; a token for 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.305.0",
++ "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.305.0): each operation lists the capabilities it performs; a token for 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 94a537b8..789abbf2 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.304.0",
-- "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.304.0): each operation lists the capabilities it performs; a token for 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.305.0",
++ "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.305.0): each operation lists the capabilities it performs; a token for 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 586ec0e2..bdc4fd40 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.304.0",
-- "description": "Routes of OpenVibe.Domains as the OpenVibe contracts describe them (openvibe-contracts 0.304.0): each operation lists the capabilities it performs; a token for 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.305.0",
++ "description": "Routes of OpenVibe.Domains as the OpenVibe contracts describe them (openvibe-contracts 0.305.0): each operation lists the capabilities it performs; a token for 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 42d56535..d614ebcf 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.304.0",
-- "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.304.0): each operation lists the capabilities it performs; a token for 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.305.0",
++ "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.305.0): each operation lists the capabilities it performs; a token for 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 1e57be24..306750c8 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.304.0",
-- "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.304.0): each operation lists the capabilities it performs; a token for 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.305.0",
++ "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.305.0): each operation lists the capabilities it performs; a token for 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 1f33a14f..49c9eed8 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.304.0",
-- "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.304.0): each operation lists the capabilities it performs; a token for 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.305.0",
++ "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.305.0): each operation lists the capabilities it performs; a token for 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 b2e91737..866998b3 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.304.0",
-- "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.304.0): each operation lists the capabilities it performs; a token for 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.305.0",
++ "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.305.0): each operation lists the capabilities it performs; a token for 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 c4e29cba..180afbb3 100644
---- a/generated/openapi/index.json
++++ b/generated/openapi/index.json
@@@ -124,7 +124,7 @@
"service": "live",
"name": "OpenVibe.Live",
"origin": "https://openvibe.live",
-- "operations": 40,
++ "operations": 46,
"capabilities": 11
},
{
ddiff --git a/generated/openapi/inventory.json b/generated/openapi/inventory.json
iindex 5d777532..7c3e0636 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.304.0",
-- "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.304.0): each operation lists the capabilities it performs; a token for 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.305.0",
++ "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.305.0): each operation lists the capabilities it performs; a token for 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 f1f3f3fa..56f0eae3 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.304.0",
-- "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.304.0): each operation lists the capabilities it performs; a token for 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.305.0",
++ "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.305.0): each operation lists the capabilities it performs; a token for 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"
@@@ -694,7 +694,7 @@
"post": {
"operationId": "post_api_streams_agent",
"summary": "Publish an agent's stream on OpenVibe.Live (the Agent Streams plan, S1).",
-- "description": "**live.agent_stream.publish** (public): Publish an agent's stream on OpenVibe.Live (the Agent Streams plan, S1). POST /api/streams/agent creates the agent stream and its publish ticket, POST /api/streams/agent/:id/ticket renews that ticket, DELETE /api/streams/agent/:id/ticket revokes it (the kill switch: Live ends the WHIP session at once), POST /api/streams/agent/:id/curtain raises the desk's privacy screen, PUT /api/streams/agent/:id/frame sends the last frame while Live wants no video, POST /api/streams/agent/:id/end ends the stream, and GET /api/streams/agent/:id/state tells the desk whether to encode, and POST /api/streams/agent/:id/control is one of the four controls (pause, curtain, mute, end) with the moderator rules of the Agent Streams plan, S5. The publish capability also covers the step credit: a step may name the suggestion it took (\"Suggested by @mira\"). The caller is the person's own session token, or a first-party service token acting for that person (a Node principal acting for its owner, Codes or Actor) that holds this capability for the audience openvibe.live: Network grants it to exactly those principals. Never a developer-app token, never another person's stream. The Agent Streams design calls it live.agent-stream.publish; a capability id in this system carries no hyphen (the capability pattern and the token claims' cap pattern both allow letters, digits and underscores only), so the id is live.agent_stream.publish.",
++ "description": "**live.agent_stream.publish** (public): Publish an agent's stream on OpenVibe.Live (the Agent Streams plan, S1). POST /api/streams/agent creates the agent stream and its publish ticket, POST /api/streams/agent/:id/ticket renews that ticket, DELETE /api/streams/agent/:id/ticket revokes it (the kill switch: Live ends the WHIP session at once), POST /api/streams/agent/:id/curtain raises the desk's privacy screen, PUT /api/streams/agent/:id/frame sends the last frame while Live wants no video, POST /api/streams/agent/:id/end ends the stream, and GET /api/streams/agent/:id/state tells the desk whether to encode, and POST /api/streams/agent/:id/control is one of the four controls (pause, curtain, mute, end) with the moderator rules of the Agent Streams plan, S5. The publish capability also covers the step credit: a step may name the suggestion it took (\"Suggested by @mira\"). The caller is the person's own session token, or a first-party service token acting for that person (a Node principal acting for its owner, Codes or Actor) that holds this capability for the audience openvibe.live: Network grants it to exactly those principals. Never a developer-app token, never another person's stream. The Agent Streams design calls it live.agent-stream.publish; a capability id in this system carries no hyphen (the capability pattern and the token claims' cap pattern both allow letters, digits and underscores only), so the id is live.agent_stream.publish. S7 adds the owner's schedules: POST /api/streams/agent/schedules writes one, GET /api/streams/agent/schedules lists the caller's, DELETE /api/streams/agent/schedules/:id cancels one, POST /api/streams/agent/schedules/:id/remind opts the caller in to its reminder, POST /api/streams/agent/schedules/:id/go is the owner's Go for a chatplays schedule, and POST /api/streams/agent/desk/heartbeat says the owner's desk is online so a due schedule can start. A schedule that finds the desk offline is recorded as missed ('didn't start: the desk was offline') and starts nothing.",
"tags": [
"live.agent_stream"
],
@@@ -750,7 +750,7 @@
"post": {
"operationId": "post_api_streams_agent_id_control",
"summary": "Publish an agent's stream on OpenVibe.Live (the Agent Streams plan, S1).",
-- "description": "**live.agent_stream.publish** (public): Publish an agent's stream on OpenVibe.Live (the Agent Streams plan, S1). POST /api/streams/agent creates the agent stream and its publish ticket, POST /api/streams/agent/:id/ticket renews that ticket, DELETE /api/streams/agent/:id/ticket revokes it (the kill switch: Live ends the WHIP session at once), POST /api/streams/agent/:id/curtain raises the desk's privacy screen, PUT /api/streams/agent/:id/frame sends the last frame while Live wants no video, POST /api/streams/agent/:id/end ends the stream, and GET /api/streams/agent/:id/state tells the desk whether to encode, and POST /api/streams/agent/:id/control is one of the four controls (pause, curtain, mute, end) with the moderator rules of the Agent Streams plan, S5. The publish capability also covers the step credit: a step may name the suggestion it took (\"Suggested by @mira\"). The caller is the person's own session token, or a first-party service token acting for that person (a Node principal acting for its owner, Codes or Actor) that holds this capability for the audience openvibe.live: Network grants it to exactly those principals. Never a developer-app token, never another person's stream. The Agent Streams design calls it live.agent-stream.publish; a capability id in this system carries no hyphen (the capability pattern and the token claims' cap pattern both allow letters, digits and underscores only), so the id is live.agent_stream.publish.",
++ "description": "**live.agent_stream.publish** (public): Publish an agent's stream on OpenVibe.Live (the Agent Streams plan, S1). POST /api/streams/agent creates the agent stream and its publish ticket, POST /api/streams/agent/:id/ticket renews that ticket, DELETE /api/streams/agent/:id/ticket revokes it (the kill switch: Live ends the WHIP session at once), POST /api/streams/agent/:id/curtain raises the desk's privacy screen, PUT /api/streams/agent/:id/frame sends the last frame while Live wants no video, POST /api/streams/agent/:id/end ends the stream, and GET /api/streams/agent/:id/state tells the desk whether to encode, and POST /api/streams/agent/:id/control is one of the four controls (pause, curtain, mute, end) with the moderator rules of the Agent Streams plan, S5. The publish capability also covers the step credit: a step may name the suggestion it took (\"Suggested by @mira\"). The caller is the person's own session token, or a first-party service token acting for that person (a Node principal acting for its owner, Codes or Actor) that holds this capability for the audience openvibe.live: Network grants it to exactly those principals. Never a developer-app token, never another person's stream. The Agent Streams design calls it live.agent-stream.publish; a capability id in this system carries no hyphen (the capability pattern and the token claims' cap pattern both allow letters, digits and underscores only), so the id is live.agent_stream.publish. S7 adds the owner's schedules: POST /api/streams/agent/schedules writes one, GET /api/streams/agent/schedules lists the caller's, DELETE /api/streams/agent/schedules/:id cancels one, POST /api/streams/agent/schedules/:id/remind opts the caller in to its reminder, POST /api/streams/agent/schedules/:id/go is the owner's Go for a chatplays schedule, and POST /api/streams/agent/desk/heartbeat says the owner's desk is online so a due schedule can start. A schedule that finds the desk offline is recorded as missed ('didn't start: the desk was offline') and starts nothing.",
"tags": [
"live.agent_stream"
],
@@@ -816,7 +816,7 @@
"get": {
"operationId": "get_api_streams_agent_id_controls",
"summary": "Publish an agent's stream on OpenVibe.Live (the Agent Streams plan, S1).",
-- "description": "**live.agent_stream.publish** (public): Publish an agent's stream on OpenVibe.Live (the Agent Streams plan, S1). POST /api/streams/agent creates the agent stream and its publish ticket, POST /api/streams/agent/:id/ticket renews that ticket, DELETE /api/streams/agent/:id/ticket revokes it (the kill switch: Live ends the WHIP session at once), POST /api/streams/agent/:id/curtain raises the desk's privacy screen, PUT /api/streams/agent/:id/frame sends the last frame while Live wants no video, POST /api/streams/agent/:id/end ends the stream, and GET /api/streams/agent/:id/state tells the desk whether to encode, and POST /api/streams/agent/:id/control is one of the four controls (pause, curtain, mute, end) with the moderator rules of the Agent Streams plan, S5. The publish capability also covers the step credit: a step may name the suggestion it took (\"Suggested by @mira\"). The caller is the person's own session token, or a first-party service token acting for that person (a Node principal acting for its owner, Codes or Actor) that holds this capability for the audience openvibe.live: Network grants it to exactly those principals. Never a developer-app token, never another person's stream. The Agent Streams design calls it live.agent-stream.publish; a capability id in this system carries no hyphen (the capability pattern and the token claims' cap pattern both allow letters, digits and underscores only), so the id is live.agent_stream.publish.",
++ "description": "**live.agent_stream.publish** (public): Publish an agent's stream on OpenVibe.Live (the Agent Streams plan, S1). POST /api/streams/agent creates the agent stream and its publish ticket, POST /api/streams/agent/:id/ticket renews that ticket, DELETE /api/streams/agent/:id/ticket revokes it (the kill switch: Live ends the WHIP session at once), POST /api/streams/agent/:id/curtain raises the desk's privacy screen, PUT /api/streams/agent/:id/frame sends the last frame while Live wants no video, POST /api/streams/agent/:id/end ends the stream, and GET /api/streams/agent/:id/state tells the desk whether to encode, and POST /api/streams/agent/:id/control is one of the four controls (pause, curtain, mute, end) with the moderator rules of the Agent Streams plan, S5. The publish capability also covers the step credit: a step may name the suggestion it took (\"Suggested by @mira\"). The caller is the person's own session token, or a first-party service token acting for that person (a Node principal acting for its owner, Codes or Actor) that holds this capability for the audience openvibe.live: Network grants it to exactly those principals. Never a developer-app token, never another person's stream. The Agent Streams design calls it live.agent-stream.publish; a capability id in this system carries no hyphen (the capability pattern and the token claims' cap pattern both allow letters, digits and underscores only), so the id is live.agent_stream.publish. S7 adds the owner's schedules: POST /api/streams/agent/schedules writes one, GET /api/streams/agent/schedules lists the caller's, DELETE /api/streams/agent/schedules/:id cancels one, POST /api/streams/agent/schedules/:id/remind opts the caller in to its reminder, POST /api/streams/agent/schedules/:id/go is the owner's Go for a chatplays schedule, and POST /api/streams/agent/desk/heartbeat says the owner's desk is online so a due schedule can start. A schedule that finds the desk offline is recorded as missed ('didn't start: the desk was offline') and starts nothing.",
"tags": [
"live.agent_stream"
],
@@@ -920,7 +920,7 @@
"post": {
"operationId": "post_api_streams_agent_id_curtain",
"summary": "Publish an agent's stream on OpenVibe.Live (the Agent Streams plan, S1).",
-- "description": "**live.agent_stream.publish** (public): Publish an agent's stream on OpenVibe.Live (the Agent Streams plan, S1). POST /api/streams/agent creates the agent stream and its publish ticket, POST /api/streams/agent/:id/ticket renews that ticket, DELETE /api/streams/agent/:id/ticket revokes it (the kill switch: Live ends the WHIP session at once), POST /api/streams/agent/:id/curtain raises the desk's privacy screen, PUT /api/streams/agent/:id/frame sends the last frame while Live wants no video, POST /api/streams/agent/:id/end ends the stream, and GET /api/streams/agent/:id/state tells the desk whether to encode, and POST /api/streams/agent/:id/control is one of the four controls (pause, curtain, mute, end) with the moderator rules of the Agent Streams plan, S5. The publish capability also covers the step credit: a step may name the suggestion it took (\"Suggested by @mira\"). The caller is the person's own session token, or a first-party service token acting for that person (a Node principal acting for its owner, Codes or Actor) that holds this capability for the audience openvibe.live: Network grants it to exactly those principals. Never a developer-app token, never another person's stream. The Agent Streams design calls it live.agent-stream.publish; a capability id in this system carries no hyphen (the capability pattern and the token claims' cap pattern both allow letters, digits and underscores only), so the id is live.agent_stream.publish.",
++ "description": "**live.agent_stream.publish** (public): Publish an agent's stream on OpenVibe.Live (the Agent Streams plan, S1). POST /api/streams/agent creates the agent stream and its publish ticket, POST /api/streams/agent/:id/ticket renews that ticket, DELETE /api/streams/agent/:id/ticket revokes it (the kill switch: Live ends the WHIP session at once), POST /api/streams/agent/:id/curtain raises the desk's privacy screen, PUT /api/streams/agent/:id/frame sends the last frame while Live wants no video, POST /api/streams/agent/:id/end ends the stream, and GET /api/streams/agent/:id/state tells the desk whether to encode, and POST /api/streams/agent/:id/control is one of the four controls (pause, curtain, mute, end) with the moderator rules of the Agent Streams plan, S5. The publish capability also covers the step credit: a step may name the suggestion it took (\"Suggested by @mira\"). The caller is the person's own session token, or a first-party service token acting for that person (a Node principal acting for its owner, Codes or Actor) that holds this capability for the audience openvibe.live: Network grants it to exactly those principals. Never a developer-app token, never another person's stream. The Agent Streams design calls it live.agent-stream.publish; a capability id in this system carries no hyphen (the capability pattern and the token claims' cap pattern both allow letters, digits and underscores only), so the id is live.agent_stream.publish. S7 adds the owner's schedules: POST /api/streams/agent/schedules writes one, GET /api/streams/agent/schedules lists the caller's, DELETE /api/streams/agent/schedules/:id cancels one, POST /api/streams/agent/schedules/:id/remind opts the caller in to its reminder, POST /api/streams/agent/schedules/:id/go is the owner's Go for a chatplays schedule, and POST /api/streams/agent/desk/heartbeat says the owner's desk is online so a due schedule can start. A schedule that finds the desk offline is recorded as missed ('didn't start: the desk was offline') and starts nothing.",
"tags": [
"live.agent_stream"
],
@@@ -986,7 +986,7 @@
"post": {
"operationId": "post_api_streams_agent_id_end",
"summary": "Publish an agent's stream on OpenVibe.Live (the Agent Streams plan, S1).",
-- "description": "**live.agent_stream.publish** (public): Publish an agent's stream on OpenVibe.Live (the Agent Streams plan, S1). POST /api/streams/agent creates the agent stream and its publish ticket, POST /api/streams/agent/:id/ticket renews that ticket, DELETE /api/streams/agent/:id/ticket revokes it (the kill switch: Live ends the WHIP session at once), POST /api/streams/agent/:id/curtain raises the desk's privacy screen, PUT /api/streams/agent/:id/frame sends the last frame while Live wants no video, POST /api/streams/agent/:id/end ends the stream, and GET /api/streams/agent/:id/state tells the desk whether to encode, and POST /api/streams/agent/:id/control is one of the four controls (pause, curtain, mute, end) with the moderator rules of the Agent Streams plan, S5. The publish capability also covers the step credit: a step may name the suggestion it took (\"Suggested by @mira\"). The caller is the person's own session token, or a first-party service token acting for that person (a Node principal acting for its owner, Codes or Actor) that holds this capability for the audience openvibe.live: Network grants it to exactly those principals. Never a developer-app token, never another person's stream. The Agent Streams design calls it live.agent-stream.publish; a capability id in this system carries no hyphen (the capability pattern and the token claims' cap pattern both allow letters, digits and underscores only), so the id is live.agent_stream.publish.",
++ "description": "**live.agent_stream.publish** (public): Publish an agent's stream on OpenVibe.Live (the Agent Streams plan, S1). POST /api/streams/agent creates the agent stream and its publish ticket, POST /api/streams/agent/:id/ticket renews that ticket, DELETE /api/streams/agent/:id/ticket revokes it (the kill switch: Live ends the WHIP session at once), POST /api/streams/agent/:id/curtain raises the desk's privacy screen, PUT /api/streams/agent/:id/frame sends the last frame while Live wants no video, POST /api/streams/agent/:id/end ends the stream, and GET /api/streams/agent/:id/state tells the desk whether to encode, and POST /api/streams/agent/:id/control is one of the four controls (pause, curtain, mute, end) with the moderator rules of the Agent Streams plan, S5. The publish capability also covers the step credit: a step may name the suggestion it took (\"Suggested by @mira\"). The caller is the person's own session token, or a first-party service token acting for that person (a Node principal acting for its owner, Codes or Actor) that holds this capability for the audience openvibe.live: Network grants it to exactly those principals. Never a developer-app token, never another person's stream. The Agent Streams design calls it live.agent-stream.publish; a capability id in this system carries no hyphen (the capability pattern and the token claims' cap pattern both allow letters, digits and underscores only), so the id is live.agent_stream.publish. S7 adds the owner's schedules: POST /api/streams/agent/schedules writes one, GET /api/streams/agent/schedules lists the caller's, DELETE /api/streams/agent/schedules/:id cancels one, POST /api/streams/agent/schedules/:id/remind opts the caller in to its reminder, POST /api/streams/agent/schedules/:id/go is the owner's Go for a chatplays schedule, and POST /api/streams/agent/desk/heartbeat says the owner's desk is online so a due schedule can start. A schedule that finds the desk offline is recorded as missed ('didn't start: the desk was offline') and starts nothing.",
"tags": [
"live.agent_stream"
],
@@@ -1052,7 +1052,7 @@
"put": {
"operationId": "put_api_streams_agent_id_frame",
"summary": "Publish an agent's stream on OpenVibe.Live (the Agent Streams plan, S1).",
-- "description": "**live.agent_stream.publish** (public): Publish an agent's stream on OpenVibe.Live (the Agent Streams plan, S1). POST /api/streams/agent creates the agent stream and its publish ticket, POST /api/streams/agent/:id/ticket renews that ticket, DELETE /api/streams/agent/:id/ticket revokes it (the kill switch: Live ends the WHIP session at once), POST /api/streams/agent/:id/curtain raises the desk's privacy screen, PUT /api/streams/agent/:id/frame sends the last frame while Live wants no video, POST /api/streams/agent/:id/end ends the stream, and GET /api/streams/agent/:id/state tells the desk whether to encode, and POST /api/streams/agent/:id/control is one of the four controls (pause, curtain, mute, end) with the moderator rules of the Agent Streams plan, S5. The publish capability also covers the step credit: a step may name the suggestion it took (\"Suggested by @mira\"). The caller is the person's own session token, or a first-party service token acting for that person (a Node principal acting for its owner, Codes or Actor) that holds this capability for the audience openvibe.live: Network grants it to exactly those principals. Never a developer-app token, never another person's stream. The Agent Streams design calls it live.agent-stream.publish; a capability id in this system carries no hyphen (the capability pattern and the token claims' cap pattern both allow letters, digits and underscores only), so the id is live.agent_stream.publish.",
++ "description": "**live.agent_stream.publish** (public): Publish an agent's stream on OpenVibe.Live (the Agent Streams plan, S1). POST /api/streams/agent creates the agent stream and its publish ticket, POST /api/streams/agent/:id/ticket renews that ticket, DELETE /api/streams/agent/:id/ticket revokes it (the kill switch: Live ends the WHIP session at once), POST /api/streams/agent/:id/curtain raises the desk's privacy screen, PUT /api/streams/agent/:id/frame sends the last frame while Live wants no video, POST /api/streams/agent/:id/end ends the stream, and GET /api/streams/agent/:id/state tells the desk whether to encode, and POST /api/streams/agent/:id/control is one of the four controls (pause, curtain, mute, end) with the moderator rules of the Agent Streams plan, S5. The publish capability also covers the step credit: a step may name the suggestion it took (\"Suggested by @mira\"). The caller is the person's own session token, or a first-party service token acting for that person (a Node principal acting for its owner, Codes or Actor) that holds this capability for the audience openvibe.live: Network grants it to exactly those principals. Never a developer-app token, never another person's stream. The Agent Streams design calls it live.agent-stream.publish; a capability id in this system carries no hyphen (the capability pattern and the token claims' cap pattern both allow letters, digits and underscores only), so the id is live.agent_stream.publish. S7 adds the owner's schedules: POST /api/streams/agent/schedules writes one, GET /api/streams/agent/schedules lists the caller's, DELETE /api/streams/agent/schedules/:id cancels one, POST /api/streams/agent/schedules/:id/remind opts the caller in to its reminder, POST /api/streams/agent/schedules/:id/go is the owner's Go for a chatplays schedule, and POST /api/streams/agent/desk/heartbeat says the owner's desk is online so a due schedule can start. A schedule that finds the desk offline is recorded as missed ('didn't start: the desk was offline') and starts nothing.",
"tags": [
"live.agent_stream"
],
@@@ -1118,7 +1118,7 @@
"get": {
"operationId": "get_api_streams_agent_id_state",
"summary": "Publish an agent's stream on OpenVibe.Live (the Agent Streams plan, S1).",
-- "description": "**live.agent_stream.publish** (public): Publish an agent's stream on OpenVibe.Live (the Agent Streams plan, S1). POST /api/streams/agent creates the agent stream and its publish ticket, POST /api/streams/agent/:id/ticket renews that ticket, DELETE /api/streams/agent/:id/ticket revokes it (the kill switch: Live ends the WHIP session at once), POST /api/streams/agent/:id/curtain raises the desk's privacy screen, PUT /api/streams/agent/:id/frame sends the last frame while Live wants no video, POST /api/streams/agent/:id/end ends the stream, and GET /api/streams/agent/:id/state tells the desk whether to encode, and POST /api/streams/agent/:id/control is one of the four controls (pause, curtain, mute, end) with the moderator rules of the Agent Streams plan, S5. The publish capability also covers the step credit: a step may name the suggestion it took (\"Suggested by @mira\"). The caller is the person's own session token, or a first-party service token acting for that person (a Node principal acting for its owner, Codes or Actor) that holds this capability for the audience openvibe.live: Network grants it to exactly those principals. Never a developer-app token, never another person's stream. The Agent Streams design calls it live.agent-stream.publish; a capability id in this system carries no hyphen (the capability pattern and the token claims' cap pattern both allow letters, digits and underscores only), so the id is live.agent_stream.publish.",
++ "description": "**live.agent_stream.publish** (public): Publish an agent's stream on OpenVibe.Live (the Agent Streams plan, S1). POST /api/streams/agent creates the agent stream and its publish ticket, POST /api/streams/agent/:id/ticket renews that ticket, DELETE /api/streams/agent/:id/ticket revokes it (the kill switch: Live ends the WHIP session at once), POST /api/streams/agent/:id/curtain raises the desk's privacy screen, PUT /api/streams/agent/:id/frame sends the last frame while Live wants no video, POST /api/streams/agent/:id/end ends the stream, and GET /api/streams/agent/:id/state tells the desk whether to encode, and POST /api/streams/agent/:id/control is one of the four controls (pause, curtain, mute, end) with the moderator rules of the Agent Streams plan, S5. The publish capability also covers the step credit: a step may name the suggestion it took (\"Suggested by @mira\"). The caller is the person's own session token, or a first-party service token acting for that person (a Node principal acting for its owner, Codes or Actor) that holds this capability for the audience openvibe.live: Network grants it to exactly those principals. Never a developer-app token, never another person's stream. The Agent Streams design calls it live.agent-stream.publish; a capability id in this system carries no hyphen (the capability pattern and the token claims' cap pattern both allow letters, digits and underscores only), so the id is live.agent_stream.publish. S7 adds the owner's schedules: POST /api/streams/agent/schedules writes one, GET /api/streams/agent/schedules lists the caller's, DELETE /api/streams/agent/schedules/:id cancels one, POST /api/streams/agent/schedules/:id/remind opts the caller in to its reminder, POST /api/streams/agent/schedules/:id/go is the owner's Go for a chatplays schedule, and POST /api/streams/agent/desk/heartbeat says the owner's desk is online so a due schedule can start. A schedule that finds the desk offline is recorded as missed ('didn't start: the desk was offline') and starts nothing.",
"tags": [
"live.agent_stream"
],
@@@ -1222,7 +1222,7 @@
"delete": {
"operationId": "delete_api_streams_agent_id_ticket",
"summary": "Publish an agent's stream on OpenVibe.Live (the Agent Streams plan, S1).",
-- "description": "**live.agent_stream.publish** (public): Publish an agent's stream on OpenVibe.Live (the Agent Streams plan, S1). POST /api/streams/agent creates the agent stream and its publish ticket, POST /api/streams/agent/:id/ticket renews that ticket, DELETE /api/streams/agent/:id/ticket revokes it (the kill switch: Live ends the WHIP session at once), POST /api/streams/agent/:id/curtain raises the desk's privacy screen, PUT /api/streams/agent/:id/frame sends the last frame while Live wants no video, POST /api/streams/agent/:id/end ends the stream, and GET /api/streams/agent/:id/state tells the desk whether to encode, and POST /api/streams/agent/:id/control is one of the four controls (pause, curtain, mute, end) with the moderator rules of the Agent Streams plan, S5. The publish capability also covers the step credit: a step may name the suggestion it took (\"Suggested by @mira\"). The caller is the person's own session token, or a first-party service token acting for that person (a Node principal acting for its owner, Codes or Actor) that holds this capability for the audience openvibe.live: Network grants it to exactly those principals. Never a developer-app token, never another person's stream. The Agent Streams design calls it live.agent-stream.publish; a capability id in this system carries no hyphen (the capability pattern and the token claims' cap pattern both allow letters, digits and underscores only), so the id is live.agent_stream.publish.",
++ "description": "**live.agent_stream.publish** (public): Publish an agent's stream on OpenVibe.Live (the Agent Streams plan, S1). POST /api/streams/agent creates the agent stream and its publish ticket, POST /api/streams/agent/:id/ticket renews that ticket, DELETE /api/streams/agent/:id/ticket revokes it (the kill switch: Live ends the WHIP session at once), POST /api/streams/agent/:id/curtain raises the desk's privacy screen, PUT /api/streams/agent/:id/frame sends the last frame while Live wants no video, POST /api/streams/agent/:id/end ends the stream, and GET /api/streams/agent/:id/state tells the desk whether to encode, and POST /api/streams/agent/:id/control is one of the four controls (pause, curtain, mute, end) with the moderator rules of the Agent Streams plan, S5. The publish capability also covers the step credit: a step may name the suggestion it took (\"Suggested by @mira\"). The caller is the person's own session token, or a first-party service token acting for that person (a Node principal acting for its owner, Codes or Actor) that holds this capability for the audience openvibe.live: Network grants it to exactly those principals. Never a developer-app token, never another person's stream. The Agent Streams design calls it live.agent-stream.publish; a capability id in this system carries no hyphen (the capability pattern and the token claims' cap pattern both allow letters, digits and underscores only), so the id is live.agent_stream.publish. S7 adds the owner's schedules: POST /api/streams/agent/schedules writes one, GET /api/streams/agent/schedules lists the caller's, DELETE /api/streams/agent/schedules/:id cancels one, POST /api/streams/agent/schedules/:id/remind opts the caller in to its reminder, POST /api/streams/agent/schedules/:id/go is the owner's Go for a chatplays schedule, and POST /api/streams/agent/desk/heartbeat says the owner's desk is online so a due schedule can start. A schedule that finds the desk offline is recorded as missed ('didn't start: the desk was offline') and starts nothing.",
"tags": [
"live.agent_stream"
],
@@@ -1324,7 +1324,449 @@
"post": {
"operationId": "post_api_streams_agent_id_ticket",
"summary": "Publish an agent's stream on OpenVibe.Live (the Agent Streams plan, S1).",
-- "description": "**live.agent_stream.publish** (public): Publish an agent's stream on OpenVibe.Live (the Agent Streams plan, S1). POST /api/streams/agent creates the agent stream and its publish ticket, POST /api/streams/agent/:id/ticket renews that ticket, DELETE /api/streams/agent/:id/ticket revokes it (the kill switch: Live ends the WHIP session at once), POST /api/streams/agent/:id/curtain raises the desk's privacy screen, PUT /api/streams/agent/:id/frame sends the last frame while Live wants no video, POST /api/streams/agent/:id/end ends the stream, and GET /api/streams/agent/:id/state tells the desk whether to encode, and POST /api/streams/agent/:id/control is one of the four controls (pause, curtain, mute, end) with the moderator rules of the Agent Streams plan, S5. The publish capability also covers the step credit: a step may name the suggestion it took (\"Suggested by @mira\"). The caller is the person's own session token, or a first-party service token acting for that person (a Node principal acting for its owner, Codes or Actor) that holds this capability for the audience openvibe.live: Network grants it to exactly those principals. Never a developer-app token, never another person's stream. The Agent Streams design calls it live.agent-stream.publish; a capability id in this system carries no hyphen (the capability pattern and the token claims' cap pattern both allow letters, digits and underscores only), so the id is live.agent_stream.publish.",
++ "description": "**live.agent_stream.publish** (public): Publish an agent's stream on OpenVibe.Live (the Agent Streams plan, S1). POST /api/streams/agent creates the agent stream and its publish ticket, POST /api/streams/agent/:id/ticket renews that ticket, DELETE /api/streams/agent/:id/ticket revokes it (the kill switch: Live ends the WHIP session at once), POST /api/streams/agent/:id/curtain raises the desk's privacy screen, PUT /api/streams/agent/:id/frame sends the last frame while Live wants no video, POST /api/streams/agent/:id/end ends the stream, and GET /api/streams/agent/:id/state tells the desk whether to encode, and POST /api/streams/agent/:id/control is one of the four controls (pause, curtain, mute, end) with the moderator rules of the Agent Streams plan, S5. The publish capability also covers the step credit: a step may name the suggestion it took (\"Suggested by @mira\"). The caller is the person's own session token, or a first-party service token acting for that person (a Node principal acting for its owner, Codes or Actor) that holds this capability for the audience openvibe.live: Network grants it to exactly those principals. Never a developer-app token, never another person's stream. The Agent Streams design calls it live.agent-stream.publish; a capability id in this system carries no hyphen (the capability pattern and the token claims' cap pattern both allow letters, digits and underscores only), so the id is live.agent_stream.publish. S7 adds the owner's schedules: POST /api/streams/agent/schedules writes one, GET /api/streams/agent/schedules lists the caller's, DELETE /api/streams/agent/schedules/:id cancels one, POST /api/streams/agent/schedules/:id/remind opts the caller in to its reminder, POST /api/streams/agent/schedules/:id/go is the owner's Go for a chatplays schedule, and POST /api/streams/agent/desk/heartbeat says the owner's desk is online so a due schedule can start. A schedule that finds the desk offline is recorded as missed ('didn't start: the desk was offline') and starts nothing.",
++ "tags": [
++ "live.agent_stream"
++ ],
++ "x-openvibe-capabilities": [
++ "live.agent_stream.publish"
++ ],
++ "x-openvibe-visibility": [
++ "public"
++ ],
++ "x-openvibe-quota-class": "standard",
++ "security": [
++ {
++ "openvibeToken": [
++ "live.agent_stream.publish"
++ ]
++ }
++ ],
++ "requestBody": {
++ "required": false,
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/live.agent-stream-create-request.v1"
++ }
++ }
++ }
++ },
++ "parameters": [
++ {
++ "name": "id",
++ "in": "path",
++ "required": true,
++ "schema": {
++ "type": "string"
++ }
++ }
++ ],
++ "responses": {
++ "2XX": {
++ "description": "Success",
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/live.agent-stream-publish.v1"
++ }
++ }
++ }
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ }
++ },
++ "/api/streams/agent/desk/heartbeat": {
++ "post": {
++ "operationId": "post_api_streams_agent_desk_heartbeat",
++ "summary": "Publish an agent's stream on OpenVibe.Live (the Agent Streams plan, S1).",
++ "description": "**live.agent_stream.publish** (public): Publish an agent's stream on OpenVibe.Live (the Agent Streams plan, S1). POST /api/streams/agent creates the agent stream and its publish ticket, POST /api/streams/agent/:id/ticket renews that ticket, DELETE /api/streams/agent/:id/ticket revokes it (the kill switch: Live ends the WHIP session at once), POST /api/streams/agent/:id/curtain raises the desk's privacy screen, PUT /api/streams/agent/:id/frame sends the last frame while Live wants no video, POST /api/streams/agent/:id/end ends the stream, and GET /api/streams/agent/:id/state tells the desk whether to encode, and POST /api/streams/agent/:id/control is one of the four controls (pause, curtain, mute, end) with the moderator rules of the Agent Streams plan, S5. The publish capability also covers the step credit: a step may name the suggestion it took (\"Suggested by @mira\"). The caller is the person's own session token, or a first-party service token acting for that person (a Node principal acting for its owner, Codes or Actor) that holds this capability for the audience openvibe.live: Network grants it to exactly those principals. Never a developer-app token, never another person's stream. The Agent Streams design calls it live.agent-stream.publish; a capability id in this system carries no hyphen (the capability pattern and the token claims' cap pattern both allow letters, digits and underscores only), so the id is live.agent_stream.publish. S7 adds the owner's schedules: POST /api/streams/agent/schedules writes one, GET /api/streams/agent/schedules lists the caller's, DELETE /api/streams/agent/schedules/:id cancels one, POST /api/streams/agent/schedules/:id/remind opts the caller in to its reminder, POST /api/streams/agent/schedules/:id/go is the owner's Go for a chatplays schedule, and POST /api/streams/agent/desk/heartbeat says the owner's desk is online so a due schedule can start. A schedule that finds the desk offline is recorded as missed ('didn't start: the desk was offline') and starts nothing.",
++ "tags": [
++ "live.agent_stream"
++ ],
++ "x-openvibe-capabilities": [
++ "live.agent_stream.publish"
++ ],
++ "x-openvibe-visibility": [
++ "public"
++ ],
++ "x-openvibe-quota-class": "standard",
++ "security": [
++ {
++ "openvibeToken": [
++ "live.agent_stream.publish"
++ ]
++ }
++ ],
++ "requestBody": {
++ "required": false,
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/live.agent-stream-create-request.v1"
++ }
++ }
++ }
++ },
++ "responses": {
++ "2XX": {
++ "description": "Success",
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/live.agent-stream-publish.v1"
++ }
++ }
++ }
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ }
++ },
++ "/api/streams/agent/schedules": {
++ "get": {
++ "operationId": "get_api_streams_agent_schedules",
++ "summary": "Publish an agent's stream on OpenVibe.Live (the Agent Streams plan, S1).",
++ "description": "**live.agent_stream.publish** (public): Publish an agent's stream on OpenVibe.Live (the Agent Streams plan, S1). POST /api/streams/agent creates the agent stream and its publish ticket, POST /api/streams/agent/:id/ticket renews that ticket, DELETE /api/streams/agent/:id/ticket revokes it (the kill switch: Live ends the WHIP session at once), POST /api/streams/agent/:id/curtain raises the desk's privacy screen, PUT /api/streams/agent/:id/frame sends the last frame while Live wants no video, POST /api/streams/agent/:id/end ends the stream, and GET /api/streams/agent/:id/state tells the desk whether to encode, and POST /api/streams/agent/:id/control is one of the four controls (pause, curtain, mute, end) with the moderator rules of the Agent Streams plan, S5. The publish capability also covers the step credit: a step may name the suggestion it took (\"Suggested by @mira\"). The caller is the person's own session token, or a first-party service token acting for that person (a Node principal acting for its owner, Codes or Actor) that holds this capability for the audience openvibe.live: Network grants it to exactly those principals. Never a developer-app token, never another person's stream. The Agent Streams design calls it live.agent-stream.publish; a capability id in this system carries no hyphen (the capability pattern and the token claims' cap pattern both allow letters, digits and underscores only), so the id is live.agent_stream.publish. S7 adds the owner's schedules: POST /api/streams/agent/schedules writes one, GET /api/streams/agent/schedules lists the caller's, DELETE /api/streams/agent/schedules/:id cancels one, POST /api/streams/agent/schedules/:id/remind opts the caller in to its reminder, POST /api/streams/agent/schedules/:id/go is the owner's Go for a chatplays schedule, and POST /api/streams/agent/desk/heartbeat says the owner's desk is online so a due schedule can start. A schedule that finds the desk offline is recorded as missed ('didn't start: the desk was offline') and starts nothing.",
++ "tags": [
++ "live.agent_stream"
++ ],
++ "x-openvibe-capabilities": [
++ "live.agent_stream.publish"
++ ],
++ "x-openvibe-visibility": [
++ "public"
++ ],
++ "x-openvibe-quota-class": "standard",
++ "security": [
++ {
++ "openvibeToken": [
++ "live.agent_stream.publish"
++ ]
++ }
++ ],
++ "x-openvibe-input": {
++ "$ref": "#/components/schemas/live.agent-stream-create-request.v1"
++ },
++ "parameters": [
++ {
++ "name": "title",
++ "in": "query",
++ "required": true,
++ "schema": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 200
++ }
++ },
++ {
++ "name": "task",
++ "in": "query",
++ "required": true,
++ "schema": {
++ "$ref": "#/components/schemas/live.agent-stream.v1/$defs/task"
++ }
++ },
++ {
++ "name": "visibility",
++ "in": "query",
++ "required": true,
++ "schema": {
++ "enum": [
++ "private",
++ "unlisted",
++ "public"
++ ]
++ }
++ },
++ {
++ "name": "allow_sites",
++ "in": "query",
++ "required": false,
++ "schema": {
++ "type": "array",
++ "maxItems": 50,
++ "items": {
++ "type": "string",
++ "format": "uri"
++ },
++ "description": "The hosts the browser desk may visit. Absent means no limit."
++ },
++ "description": "The hosts the browser desk may visit. Absent means no limit."
++ }
++ ],
++ "responses": {
++ "2XX": {
++ "description": "Success",
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/live.agent-stream-publish.v1"
++ }
++ }
++ }
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ },
++ "post": {
++ "operationId": "post_api_streams_agent_schedules",
++ "summary": "Publish an agent's stream on OpenVibe.Live (the Agent Streams plan, S1).",
++ "description": "**live.agent_stream.publish** (public): Publish an agent's stream on OpenVibe.Live (the Agent Streams plan, S1). POST /api/streams/agent creates the agent stream and its publish ticket, POST /api/streams/agent/:id/ticket renews that ticket, DELETE /api/streams/agent/:id/ticket revokes it (the kill switch: Live ends the WHIP session at once), POST /api/streams/agent/:id/curtain raises the desk's privacy screen, PUT /api/streams/agent/:id/frame sends the last frame while Live wants no video, POST /api/streams/agent/:id/end ends the stream, and GET /api/streams/agent/:id/state tells the desk whether to encode, and POST /api/streams/agent/:id/control is one of the four controls (pause, curtain, mute, end) with the moderator rules of the Agent Streams plan, S5. The publish capability also covers the step credit: a step may name the suggestion it took (\"Suggested by @mira\"). The caller is the person's own session token, or a first-party service token acting for that person (a Node principal acting for its owner, Codes or Actor) that holds this capability for the audience openvibe.live: Network grants it to exactly those principals. Never a developer-app token, never another person's stream. The Agent Streams design calls it live.agent-stream.publish; a capability id in this system carries no hyphen (the capability pattern and the token claims' cap pattern both allow letters, digits and underscores only), so the id is live.agent_stream.publish. S7 adds the owner's schedules: POST /api/streams/agent/schedules writes one, GET /api/streams/agent/schedules lists the caller's, DELETE /api/streams/agent/schedules/:id cancels one, POST /api/streams/agent/schedules/:id/remind opts the caller in to its reminder, POST /api/streams/agent/schedules/:id/go is the owner's Go for a chatplays schedule, and POST /api/streams/agent/desk/heartbeat says the owner's desk is online so a due schedule can start. A schedule that finds the desk offline is recorded as missed ('didn't start: the desk was offline') and starts nothing.",
++ "tags": [
++ "live.agent_stream"
++ ],
++ "x-openvibe-capabilities": [
++ "live.agent_stream.publish"
++ ],
++ "x-openvibe-visibility": [
++ "public"
++ ],
++ "x-openvibe-quota-class": "standard",
++ "security": [
++ {
++ "openvibeToken": [
++ "live.agent_stream.publish"
++ ]
++ }
++ ],
++ "requestBody": {
++ "required": false,
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/live.agent-stream-create-request.v1"
++ }
++ }
++ }
++ },
++ "responses": {
++ "2XX": {
++ "description": "Success",
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/live.agent-stream-publish.v1"
++ }
++ }
++ }
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ }
++ },
++ "/api/streams/agent/schedules/{id}": {
++ "delete": {
++ "operationId": "delete_api_streams_agent_schedules_id",
++ "summary": "Publish an agent's stream on OpenVibe.Live (the Agent Streams plan, S1).",
++ "description": "**live.agent_stream.publish** (public): Publish an agent's stream on OpenVibe.Live (the Agent Streams plan, S1). POST /api/streams/agent creates the agent stream and its publish ticket, POST /api/streams/agent/:id/ticket renews that ticket, DELETE /api/streams/agent/:id/ticket revokes it (the kill switch: Live ends the WHIP session at once), POST /api/streams/agent/:id/curtain raises the desk's privacy screen, PUT /api/streams/agent/:id/frame sends the last frame while Live wants no video, POST /api/streams/agent/:id/end ends the stream, and GET /api/streams/agent/:id/state tells the desk whether to encode, and POST /api/streams/agent/:id/control is one of the four controls (pause, curtain, mute, end) with the moderator rules of the Agent Streams plan, S5. The publish capability also covers the step credit: a step may name the suggestion it took (\"Suggested by @mira\"). The caller is the person's own session token, or a first-party service token acting for that person (a Node principal acting for its owner, Codes or Actor) that holds this capability for the audience openvibe.live: Network grants it to exactly those principals. Never a developer-app token, never another person's stream. The Agent Streams design calls it live.agent-stream.publish; a capability id in this system carries no hyphen (the capability pattern and the token claims' cap pattern both allow letters, digits and underscores only), so the id is live.agent_stream.publish. S7 adds the owner's schedules: POST /api/streams/agent/schedules writes one, GET /api/streams/agent/schedules lists the caller's, DELETE /api/streams/agent/schedules/:id cancels one, POST /api/streams/agent/schedules/:id/remind opts the caller in to its reminder, POST /api/streams/agent/schedules/:id/go is the owner's Go for a chatplays schedule, and POST /api/streams/agent/desk/heartbeat says the owner's desk is online so a due schedule can start. A schedule that finds the desk offline is recorded as missed ('didn't start: the desk was offline') and starts nothing.",
++ "tags": [
++ "live.agent_stream"
++ ],
++ "x-openvibe-capabilities": [
++ "live.agent_stream.publish"
++ ],
++ "x-openvibe-visibility": [
++ "public"
++ ],
++ "x-openvibe-quota-class": "standard",
++ "security": [
++ {
++ "openvibeToken": [
++ "live.agent_stream.publish"
++ ]
++ }
++ ],
++ "x-openvibe-input": {
++ "$ref": "#/components/schemas/live.agent-stream-create-request.v1"
++ },
++ "parameters": [
++ {
++ "name": "id",
++ "in": "path",
++ "required": true,
++ "schema": {
++ "type": "string"
++ }
++ },
++ {
++ "name": "title",
++ "in": "query",
++ "required": true,
++ "schema": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 200
++ }
++ },
++ {
++ "name": "task",
++ "in": "query",
++ "required": true,
++ "schema": {
++ "$ref": "#/components/schemas/live.agent-stream.v1/$defs/task"
++ }
++ },
++ {
++ "name": "visibility",
++ "in": "query",
++ "required": true,
++ "schema": {
++ "enum": [
++ "private",
++ "unlisted",
++ "public"
++ ]
++ }
++ },
++ {
++ "name": "allow_sites",
++ "in": "query",
++ "required": false,
++ "schema": {
++ "type": "array",
++ "maxItems": 50,
++ "items": {
++ "type": "string",
++ "format": "uri"
++ },
++ "description": "The hosts the browser desk may visit. Absent means no limit."
++ },
++ "description": "The hosts the browser desk may visit. Absent means no limit."
++ }
++ ],
++ "responses": {
++ "2XX": {
++ "description": "Success",
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/live.agent-stream-publish.v1"
++ }
++ }
++ }
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ }
++ },
++ "/api/streams/agent/schedules/{id}/go": {
++ "post": {
++ "operationId": "post_api_streams_agent_schedules_id_go",
++ "summary": "Publish an agent's stream on OpenVibe.Live (the Agent Streams plan, S1).",
++ "description": "**live.agent_stream.publish** (public): Publish an agent's stream on OpenVibe.Live (the Agent Streams plan, S1). POST /api/streams/agent creates the agent stream and its publish ticket, POST /api/streams/agent/:id/ticket renews that ticket, DELETE /api/streams/agent/:id/ticket revokes it (the kill switch: Live ends the WHIP session at once), POST /api/streams/agent/:id/curtain raises the desk's privacy screen, PUT /api/streams/agent/:id/frame sends the last frame while Live wants no video, POST /api/streams/agent/:id/end ends the stream, and GET /api/streams/agent/:id/state tells the desk whether to encode, and POST /api/streams/agent/:id/control is one of the four controls (pause, curtain, mute, end) with the moderator rules of the Agent Streams plan, S5. The publish capability also covers the step credit: a step may name the suggestion it took (\"Suggested by @mira\"). The caller is the person's own session token, or a first-party service token acting for that person (a Node principal acting for its owner, Codes or Actor) that holds this capability for the audience openvibe.live: Network grants it to exactly those principals. Never a developer-app token, never another person's stream. The Agent Streams design calls it live.agent-stream.publish; a capability id in this system carries no hyphen (the capability pattern and the token claims' cap pattern both allow letters, digits and underscores only), so the id is live.agent_stream.publish. S7 adds the owner's schedules: POST /api/streams/agent/schedules writes one, GET /api/streams/agent/schedules lists the caller's, DELETE /api/streams/agent/schedules/:id cancels one, POST /api/streams/agent/schedules/:id/remind opts the caller in to its reminder, POST /api/streams/agent/schedules/:id/go is the owner's Go for a chatplays schedule, and POST /api/streams/agent/desk/heartbeat says the owner's desk is online so a due schedule can start. A schedule that finds the desk offline is recorded as missed ('didn't start: the desk was offline') and starts nothing.",
++ "tags": [
++ "live.agent_stream"
++ ],
++ "x-openvibe-capabilities": [
++ "live.agent_stream.publish"
++ ],
++ "x-openvibe-visibility": [
++ "public"
++ ],
++ "x-openvibe-quota-class": "standard",
++ "security": [
++ {
++ "openvibeToken": [
++ "live.agent_stream.publish"
++ ]
++ }
++ ],
++ "requestBody": {
++ "required": false,
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/live.agent-stream-create-request.v1"
++ }
++ }
++ }
++ },
++ "parameters": [
++ {
++ "name": "id",
++ "in": "path",
++ "required": true,
++ "schema": {
++ "type": "string"
++ }
++ }
++ ],
++ "responses": {
++ "2XX": {
++ "description": "Success",
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/live.agent-stream-publish.v1"
++ }
++ }
++ }
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ }
++ },
++ "/api/streams/agent/schedules/{id}/remind": {
++ "post": {
++ "operationId": "post_api_streams_agent_schedules_id_remind",
++ "summary": "Publish an agent's stream on OpenVibe.Live (the Agent Streams plan, S1).",
++ "description": "**live.agent_stream.publish** (public): Publish an agent's stream on OpenVibe.Live (the Agent Streams plan, S1). POST /api/streams/agent creates the agent stream and its publish ticket, POST /api/streams/agent/:id/ticket renews that ticket, DELETE /api/streams/agent/:id/ticket revokes it (the kill switch: Live ends the WHIP session at once), POST /api/streams/agent/:id/curtain raises the desk's privacy screen, PUT /api/streams/agent/:id/frame sends the last frame while Live wants no video, POST /api/streams/agent/:id/end ends the stream, and GET /api/streams/agent/:id/state tells the desk whether to encode, and POST /api/streams/agent/:id/control is one of the four controls (pause, curtain, mute, end) with the moderator rules of the Agent Streams plan, S5. The publish capability also covers the step credit: a step may name the suggestion it took (\"Suggested by @mira\"). The caller is the person's own session token, or a first-party service token acting for that person (a Node principal acting for its owner, Codes or Actor) that holds this capability for the audience openvibe.live: Network grants it to exactly those principals. Never a developer-app token, never another person's stream. The Agent Streams design calls it live.agent-stream.publish; a capability id in this system carries no hyphen (the capability pattern and the token claims' cap pattern both allow letters, digits and underscores only), so the id is live.agent_stream.publish. S7 adds the owner's schedules: POST /api/streams/agent/schedules writes one, GET /api/streams/agent/schedules lists the caller's, DELETE /api/streams/agent/schedules/:id cancels one, POST /api/streams/agent/schedules/:id/remind opts the caller in to its reminder, POST /api/streams/agent/schedules/:id/go is the owner's Go for a chatplays schedule, and POST /api/streams/agent/desk/heartbeat says the owner's desk is online so a due schedule can start. A schedule that finds the desk offline is recorded as missed ('didn't start: the desk was offline') and starts nothing.",
"tags": [
"live.agent_stream"
],
ddiff --git a/generated/openapi/media-hub.json b/generated/openapi/media-hub.json
iindex 25ea2826..a16c21be 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.304.0",
-- "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.304.0): each operation lists the capabilities it performs; a token for 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.305.0",
++ "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.305.0): each operation lists the capabilities it performs; a token for 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 2393543d..1f992a0b 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.304.0",
-- "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.304.0): each operation lists the capabilities it performs; a token for 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.305.0",
++ "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.305.0): each operation lists the capabilities it performs; a token for 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 af58f769..14d4d6a5 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.304.0",
-- "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.304.0): each operation lists the capabilities it performs; a token for 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.305.0",
++ "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.305.0): each operation lists the capabilities it performs; a token for 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 d0bf2b93..136f29b7 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.304.0",
-- "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.304.0): each operation lists the capabilities it performs; a token for 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.305.0",
++ "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.305.0): each operation lists the capabilities it performs; a token for 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 998d1a28..23dd79cf 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.304.0",
-- "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.304.0): each operation lists the capabilities it performs; a token for 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.305.0",
++ "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.305.0): each operation lists the capabilities it performs; a token for 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 0e1e0fc1..9fcb2c09 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.304.0",
-- "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.304.0): each operation lists the capabilities it performs; a token for 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.305.0",
++ "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.305.0): each operation lists the capabilities it performs; a token for 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 a9d853be..816d10e9 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.304.0",
-- "description": "Routes of OpenVibe.Quest as the OpenVibe contracts describe them (openvibe-contracts 0.304.0): each operation lists the capabilities it performs; a token for 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.305.0",
++ "description": "Routes of OpenVibe.Quest as the OpenVibe contracts describe them (openvibe-contracts 0.305.0): each operation lists the capabilities it performs; a token for 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 a5d699aa..d9bac6ed 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.304.0",
-- "description": "Routes of OpenVibe.Report as the OpenVibe contracts describe them (openvibe-contracts 0.304.0): each operation lists the capabilities it performs; a token for 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.305.0",
++ "description": "Routes of OpenVibe.Report as the OpenVibe contracts describe them (openvibe-contracts 0.305.0): each operation lists the capabilities it performs; a token for 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 94e3c441..55ab7e78 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.304.0",
-- "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.304.0): each operation lists the capabilities it performs; a token for 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.305.0",
++ "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.305.0): each operation lists the capabilities it performs; a token for 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 ffff1e13..d81b9257 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.304.0",
-- "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.304.0): each operation lists the capabilities it performs; a token for 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.305.0",
++ "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.305.0): each operation lists the capabilities it performs; a token for 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 5cd08a78..5da3c51d 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.304.0",
-- "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.304.0): each operation lists the capabilities it performs; a token for 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.305.0",
++ "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.305.0): each operation lists the capabilities it performs; a token for 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 ecfbac78..eec76e0a 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.304.0",
-- "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.304.0): each operation lists the capabilities it performs; a token for 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.305.0",
++ "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.305.0): each operation lists the capabilities it performs; a token for 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 34da8a63..94586242 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.304.0",
-- "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.304.0): each operation lists the capabilities it performs; a token for 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.305.0",
++ "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.305.0): each operation lists the capabilities it performs; a token for 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 ef8b46e3..3cd21358 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.304.0",
-- "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.304.0): each operation lists the capabilities it performs; a token for 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.305.0",
++ "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.305.0): each operation lists the capabilities it performs; a token for 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 42d2b9e3..c574121d 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.304.0",
-- "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.304.0): each operation lists the capabilities it performs; a token for 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.305.0",
++ "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.305.0): each operation lists the capabilities it performs; a token for 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 ecb57d6b..43c79808 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.304.0",
-- "description": "Routes of OpenVibe.Today as the OpenVibe contracts describe them (openvibe-contracts 0.304.0): each operation lists the capabilities it performs; a token for 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.305.0",
++ "description": "Routes of OpenVibe.Today as the OpenVibe contracts describe them (openvibe-contracts 0.305.0): each operation lists the capabilities it performs; a token for 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 abacad50..9eafb8ce 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.304.0",
-- "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.304.0): each operation lists the capabilities it performs; a token for 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.305.0",
++ "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.305.0): each operation lists the capabilities it performs; a token for 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 a2f49c49..07b465ae 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.304.0",
-- "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.304.0): each operation lists the capabilities it performs; a token for 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.305.0",
++ "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.305.0): each operation lists the capabilities it performs; a token for 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 5c503236..8642219c 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.304.0",
-- "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.304.0): each operation lists the capabilities it performs; a token for 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.305.0",
++ "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.305.0): each operation lists the capabilities it performs; a token for 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 4128c66b..ab4d4154 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.304.0",
-- "description": "Routes of OpenVibe.Vision as the OpenVibe contracts describe them (openvibe-contracts 0.304.0): each operation lists the capabilities it performs; a token for 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.305.0",
++ "description": "Routes of OpenVibe.Vision as the OpenVibe contracts describe them (openvibe-contracts 0.305.0): each operation lists the capabilities it performs; a token for 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 f235b649..625a2b0f 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.304.0",
-- "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.304.0): each operation lists the capabilities it performs; a token for 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.305.0",
++ "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.305.0): each operation lists the capabilities it performs; a token for 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 9d8a4a6d..62bd5416 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.304.0",
-- "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.304.0): each operation lists the capabilities it performs; a token for 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.305.0",
++ "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.305.0): each operation lists the capabilities it performs; a token for 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 98b89ffc..2228d57f 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.304.0",
-- "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.304.0): each operation lists the capabilities it performs; a token for 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.305.0",
++ "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.305.0): each operation lists the capabilities it performs; a token for 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 475ca072..dfa8daeb 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.304.0",
-- "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.304.0): each operation lists the capabilities it performs; a token for 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.305.0",
++ "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.305.0): each operation lists the capabilities it performs; a token for 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 fa83c78a..9dd7ddf7 100644
---- a/generated/typescript/index.d.ts
++++ b/generated/typescript/index.d.ts
@@@ -294972,3 +294972,131 @@ export interface CodesSandboxSession {
kept: boolean;
} | null;
}
++
++/** [email protected] (owner: live) */
++/**
++ * live.agent-stream-schedule@1 (Agent Streams S7): an owner's schedule for a public agent stream. A schedule names a time, the task template the desk will run and the mode; Live starts it when the owner's desk is online, and when the desk is not it says 'didn't start: the desk was offline' and runs nothing. A chatplays schedule never starts on its own: it waits for the owner's Go (the S6 rule). The schedule shows on the channel's Agents tab and in Today 24 hours before its time. The id is scd_<ULID>; the started stream (if any) is named by agent_stream_id.
++ */
++export interface LiveAgentStreamSchedule {
++ /**
++ * The schedule's id (ULID, Crockford base32).
++ */
++ id: string;
++ /**
++ * The person whose desk runs the scheduled task.
++ */
++ owner: string;
++ /**
++ * The owner's Live channel username.
++ */
++ channel: string;
++ title: string;
++ task: {
++ /**
++ * Where the task runs.
++ */
++ source: "codes" | "actor" | "desk" | "node";
++ /**
++ * The task's id in that source.
++ */
++ ref: string;
++ title: string;
++ /**
++ * The task's page, when it has one.
++ */
++ url?: string | null;
++ };
++ /**
++ * How the stream is played. Watch, Narrated and Co-pilot may start on schedule; chatplays waits for the owner's Go.
++ */
++ mode: "watch" | "narrated" | "copilot" | "chatplays";
++ /**
++ * Who may watch the stream the schedule starts. Today shows public schedules only.
++ */
++ visibility: "private" | "unlisted" | "public";
++ starts_at: string;
++ /**
++ * Where the schedule stands: scheduled, live (with agent_stream_id), ended, missed ('didn't start: the desk was offline') or cancelled by its owner.
++ */
++ state: "scheduled" | "live" | "ended" | "missed" | "cancelled";
++ /**
++ * The stream the schedule started, once it did.
++ */
++ agent_stream_id?: string | null;
++ /**
++ * Why a scheduled start did not happen. 'waits_for_go' is a chatplays schedule keeping its time until the owner presses Go; 'desk_offline' is the design's 'didn't start: the desk was offline'.
++ */
++ missed_reason?: "desk_offline" | "task_not_ready" | "waits_for_go" | null;
++ /**
++ * True for a chatplays schedule: the time has come but nothing runs until the owner presses Go.
++ */
++ waits_for_go?: boolean;
++ started_at?: string | null;
++ ended_at?: string | null;
++ /**
++ * How many followers opted in to a reminder; neighbours never see who they are.
++ */
++ reminders?: number;
++ /**
++ * For the caller's own view: whether this caller opted in to a reminder. Absent when there is no caller.
++ */
++ reminded?: boolean;
++ /**
++ * The channel's Agents tab, where the schedule shows 24 hours before its time.
++ */
++ page_url?: string;
++ created_at: string;
++}
++
++/** [email protected] (owner: chat) */
++/**
++ * chat.party@1 (Agent Streams S7): a watch party on a public agent stream or its VOD. A party is a Chat room of kind 'party' where friends watch in sync with their own chat beside the stream's. On a VOD the position follows the host's; on a live stream it follows the live edge, so there is no position to keep. A party is private by default: joining is by its link, and it may be listed on the stream's page as a count only ('3 parties watching') — names are never in that count. The id is the room's slug.
++ */
++export interface ChatParty {
++ /**
++ * The party room's slug (its room id in Chat).
++ */
++ id: string;
++ /**
++ * The public agent stream the party watches.
++ */
++ agent_stream_id: string;
++ /**
++ * Media's recording id when the party watches the VOD; null on a live stream.
++ */
++ vod_id?: string | null;
++ /**
++ * The person whose position the party follows on a VOD.
++ */
++ host: string;
++ title: string;
++ sync: {
++ /**
++ * Live follows the live edge; vod follows the host's position.
++ */
++ mode: "live" | "vod";
++ /**
++ * The host's position on the VOD, in whole seconds. Absent on a live stream.
++ */
++ position_s?: number;
++ playing: boolean;
++ /**
++ * When the position was set; a reader adds the time since to a playing position.
++ */
++ at?: string;
++ };
++ /**
++ * Private by default: members only. 'link' lets anyone with join_url in; neither makes the party a directory entry.
++ */
++ visibility: "private" | "link";
++ /**
++ * Whether the stream's page counts this party. The count carries no names.
++ */
++ listed: boolean;
++ /**
++ * The party's link, the one way in.
++ */
++ join_url: string;
++ created_at: string;
++ ended_at?: string | null;
++}
ddiff --git a/lib/ids.js b/lib/ids.js
iindex b5a6fa06..b4564c26 100644
---- a/lib/ids.js
++++ b/lib/ids.js
@@@ -6,7 +6,7 @@
const crypto = require('crypto');
const ALPHABET = '0123456789ABCDEFGHJKMNPQRSTVWXYZ';
--const PREFIX = { user: 'usr', guest: 'gst', app: 'app', mod: 'mod', agent: 'agt', node: 'nod', event: 'evt', media: 'med', project: 'prj', confirmation: 'cnf', consent: 'cns', job: 'job', task: 'tsk', watch: 'wch', wait: 'wai', observation: 'wco', check: 'ckr', subscription: 'sub', deploy: 'dpl', domain: 'dom', manifest: 'mfs', release: 'rel', site: 'sit', robot: 'rob', stream: 'std', webhook_delivery: 'whd', share: 'shr', device: 'dev', hook: 'hok', policy: 'pol', audit: 'aud', agent_stream: 'ags', play_request: 'req', sandbox_session: 'sbs' };
++const PREFIX = { user: 'usr', guest: 'gst', app: 'app', mod: 'mod', agent: 'agt', node: 'nod', event: 'evt', media: 'med', project: 'prj', confirmation: 'cnf', consent: 'cns', job: 'job', task: 'tsk', watch: 'wch', wait: 'wai', observation: 'wco', check: 'ckr', subscription: 'sub', deploy: 'dpl', domain: 'dom', manifest: 'mfs', release: 'rel', site: 'sit', robot: 'rob', stream: 'std', webhook_delivery: 'whd', share: 'shr', device: 'dev', hook: 'hok', policy: 'pol', audit: 'aud', agent_stream: 'ags', agent_stream_schedule: 'scd', play_request: 'req', sandbox_session: 'sbs', party: 'pty' };
const SLUG_TYPES = new Set(['service', 'system']);
const ULID_RE = /^[0-9A-HJKMNP-TV-Z]{26}$/;
const SLUG_RE = /^[a-z][a-z0-9-]{1,39}$/;
ddiff --git a/manifests/capabilities/live.agent_stream.publish.json b/manifests/capabilities/live.agent_stream.publish.json
iindex 867f6800..db24e867 100644
---- a/manifests/capabilities/live.agent_stream.publish.json
++++ b/manifests/capabilities/live.agent_stream.publish.json
@@@ -4,7 +4,7 @@
"owner": "live",
"status": "active",
"visibility": "public",
-- "description": "Publish an agent's stream on OpenVibe.Live (the Agent Streams plan, S1). POST /api/streams/agent creates the agent stream and its publish ticket, POST /api/streams/agent/:id/ticket renews that ticket, DELETE /api/streams/agent/:id/ticket revokes it (the kill switch: Live ends the WHIP session at once), POST /api/streams/agent/:id/curtain raises the desk's privacy screen, PUT /api/streams/agent/:id/frame sends the last frame while Live wants no video, POST /api/streams/agent/:id/end ends the stream, and GET /api/streams/agent/:id/state tells the desk whether to encode, and POST /api/streams/agent/:id/control is one of the four controls (pause, curtain, mute, end) with the moderator rules of the Agent Streams plan, S5. The publish capability also covers the step credit: a step may name the suggestion it took (\"Suggested by @mira\"). The caller is the person's own session token, or a first-party service token acting for that person (a Node principal acting for its owner, Codes or Actor) that holds this capability for the audience openvibe.live: Network grants it to exactly those principals. Never a developer-app token, never another person's stream. The Agent Streams design calls it live.agent-stream.publish; a capability id in this system carries no hyphen (the capability pattern and the token claims' cap pattern both allow letters, digits and underscores only), so the id is live.agent_stream.publish.",
++ "description": "Publish an agent's stream on OpenVibe.Live (the Agent Streams plan, S1). POST /api/streams/agent creates the agent stream and its publish ticket, POST /api/streams/agent/:id/ticket renews that ticket, DELETE /api/streams/agent/:id/ticket revokes it (the kill switch: Live ends the WHIP session at once), POST /api/streams/agent/:id/curtain raises the desk's privacy screen, PUT /api/streams/agent/:id/frame sends the last frame while Live wants no video, POST /api/streams/agent/:id/end ends the stream, and GET /api/streams/agent/:id/state tells the desk whether to encode, and POST /api/streams/agent/:id/control is one of the four controls (pause, curtain, mute, end) with the moderator rules of the Agent Streams plan, S5. The publish capability also covers the step credit: a step may name the suggestion it took (\"Suggested by @mira\"). The caller is the person's own session token, or a first-party service token acting for that person (a Node principal acting for its owner, Codes or Actor) that holds this capability for the audience openvibe.live: Network grants it to exactly those principals. Never a developer-app token, never another person's stream. The Agent Streams design calls it live.agent-stream.publish; a capability id in this system carries no hyphen (the capability pattern and the token claims' cap pattern both allow letters, digits and underscores only), so the id is live.agent_stream.publish. S7 adds the owner's schedules: POST /api/streams/agent/schedules writes one, GET /api/streams/agent/schedules lists the caller's, DELETE /api/streams/agent/schedules/:id cancels one, POST /api/streams/agent/schedules/:id/remind opts the caller in to its reminder, POST /api/streams/agent/schedules/:id/go is the owner's Go for a chatplays schedule, and POST /api/streams/agent/desk/heartbeat says the owner's desk is online so a due schedule can start. A schedule that finds the desk offline is recorded as missed ('didn't start: the desk was offline') and starts nothing.",
"inputSchema": "live.agent-stream-create-request@1",
"outputSchema": "live.agent-stream-publish@1",
"permissions": [
@@@ -26,7 +26,13 @@
"POST /api/streams/agent/:id/end",
"GET /api/streams/agent/:id/state",
"POST /api/streams/agent/:id/control",
-- "GET /api/streams/agent/:id/controls"
++ "GET /api/streams/agent/:id/controls",
++ "POST /api/streams/agent/schedules",
++ "GET /api/streams/agent/schedules",
++ "DELETE /api/streams/agent/schedules/:id",
++ "POST /api/streams/agent/schedules/:id/remind",
++ "POST /api/streams/agent/schedules/:id/go",
++ "POST /api/streams/agent/desk/heartbeat"
],
"sensitive": true
}
ddiff --git a/package-lock.json b/package-lock.json
iindex 11c085fd..67e56a0d 100644
---- a/package-lock.json
++++ b/package-lock.json
@@@ -1,12 +1,12 @@
{
"name": "openvibe-contracts",
-- "version": "0.304.0",
++ "version": "0.305.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "openvibe-contracts",
-- "version": "0.304.0",
++ "version": "0.305.0",
"license": "AGPL-3.0-only",
"dependencies": {
"ajv": "^8.17.1",
ddiff --git a/package.json b/package.json
iindex d1ddd66c..13be4c68 100644
---- a/package.json
++++ b/package.json
@@@ -1,6 +1,6 @@
{
"name": "openvibe-contracts",
-- "version": "0.304.0",
++ "version": "0.305.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",