---
title: "live.agent-stream-control@1 · OpenVibe.Services"
canonical: "https://openvibe.services/docs/contracts/live.agent-stream-control"
updated: null
---

# live.agent-stream-control@1 · OpenVibe.Services

HTML: [live.agent-stream-control@1 · OpenVibe.Services](https://openvibe.services/docs/contracts/live.agent-stream-control)

# LiveAgentStreamControl `live.agent-stream-control@1`

Generated at 2026-11-13 06:25:48 UTC from [`openvibe-contracts v0.419.0`](https://github.com/OpenVibers/OpenVibe.Contracts/tree/v0.419.0) and [`openvibe-sdk v0.161.0`](https://github.com/OpenVibers/OpenVibe.SDK/tree/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`](/docs/contracts/live.agent-stream-control.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

| Field | Type | Required | Description | Constraints |
| --- | --- | --- | --- | --- |
| `control` | enum | yes | Which control was pressed. | - `one of "pause", "curtain", "mute", "end", "wipe"` |
| `by` | object | yes | Who pressed it: the handle and the role they hold. Never an id, never anything else about them. | - `no other fields` |
| `by.handle` | string | yes | The handle of the person who pressed the control. | - `pattern ^[a-z0-9_]{2,32}$` |
| `by.role` | enum | yes | What they are on this stream: the owner, or one of the channel's moderators. | - `one of "owner", "moderator"` |
| `at` | string | yes | When the control was pressed. | - `format date-time` |
| `stream` | string |  | The agent stream the control was pressed on. | - `pattern ^ags_[0-9A-HJKMNP-TV-Z]{26}$` |
| `paused_by` | string \| null |  | The 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 }] }
~~~~
