LiveAgentStreamControl live.agent-stream-control@1

Generated at from openvibe-contracts v0.419.0 and openvibe-sdk v0.161.0.

Version
1.0.0
Owner
live
Visibility
first-party
Status
active
Compatibility
backward
Schema
https://openvibe.network/contracts/live/agent-stream-control.v1.json

live.agent-stream-control@1 (the Agent Streams plan, S5): one of the controls the owner and the channel's moderators have over a live agent stream, with who pressed it. PAUSE tells the task's service (Codes or Actor) to pause at the next safe point; the overlay then says 'Paused by @mod'. CURTAIN is the S1 curtain, raised from the viewer side. MUTE is the S4 mute: the agent voice stops. END ends the stream and the room's Co-pilot reading, while the task itself keeps running off camera unless it was paused. WIPE is the chat plays control of S6: it stops the run and resets the sandbox desk. A moderator may press every control, but may not resume a pause the owner set and may not change the mode or the task. Every press is logged: who, which control, when.

Fields

FieldTypeRequiredDescriptionConstraints
controlenumyesWhich control was pressed.
  • one of "pause", "curtain", "mute", "end", "wipe"
byobjectyesWho pressed it: the handle and the role they hold. Never an id, never anything else about them.
  • no other fields
by.handlestringyesThe handle of the person who pressed the control.
  • pattern ^[a-z0-9_]{2,32}$
by.roleenumyesWhat they are on this stream: the owner, or one of the channel's moderators.
  • one of "owner", "moderator"
atstringyesWhen the control was pressed.
  • format date-time
streamstringThe agent stream the control was pressed on.
  • pattern ^ags_[0-9A-HJKMNP-TV-Z]{26}$
paused_bystring | nullThe handle of the person whose pause is in force, or null when the stream is not paused. A moderator cannot resume the owner's pause: this says whose it is.

Examples

From the contract's own test fixtures: valid ones validate, rejected ones must fail.

Valid: end-by-the-owner
{
  "control": "end",
  "by": {
    "handle": "owner",
    "role": "owner"
  },
  "at": "2026-11-06T10:00:00.000Z",
  "stream": "ags_01JAB2C3D4E5F6G7H8J9K0MNPQ",
  "paused_by": null
}
Valid: pause
{
  "control": "pause",
  "by": {
    "handle": "mod",
    "role": "moderator"
  },
  "at": "2026-11-06T10:00:00.000Z",
  "stream": "ags_01JAB2C3D4E5F6G7H8J9K0MNPQ",
  "paused_by": "mod"
}
Valid: wipe
{
  "control": "wipe",
  "by": {
    "handle": "owner",
    "role": "owner"
  },
  "at": "2026-11-06T20:30:00.000Z",
  "stream": "ags_01JAB2C3D4E5F6G7H8J9K0MNPQ",
  "paused_by": null
}
Rejected: no-one
{
  "control": "pause",
  "at": "2026-11-06T10:00:00.000Z"
}
Rejected: role-is-not-one-of-the-two
{
  "control": "pause",
  "by": {
    "handle": "mod",
    "role": "viewer"
  },
  "at": "2026-11-06T10:00:00.000Z"
}
Rejected: unknown-control
{
  "control": "nuke",
  "by": {
    "handle": "mod",
    "role": "moderator"
  },
  "at": "2026-11-06T10:00:00.000Z"
}

Validate

const contracts = require('openvibe-contracts');
contracts.validate('live.agent-stream-control@1', value);   // { valid, errors: [{ path, message }] }