openvibers/openvibe.contracts Commits

openvibe-contracts 0.414.0: the whole run (the agent engine) (#467)

OP OpenVibers committed 22 h ago · dad4c3a021 · 82 files, +14452 −398

Everything a person asks an AI to do is one shape: a run and its thread of steps. agents.run@1 and
agents.step@1 grow optional fields (title, kind, ref, model, where, target, doing, waiting, preview,
context, outputs, counts, the agent's face; from, status, title, glyph, attachments, sources, a
rich card, the desk). New: agents.run-start@1 (what starts a run), agents.event@1 (a run's stream)
and the event agents.run.updated. A conversation is a run that is waiting for a message.

Changes

ddiff --git a/CHANGELOG.md b/CHANGELOG.md
iindex 0641acd1..c0dd4f6b 100644
---- a/CHANGELOG.md
++++ b/CHANGELOG.md
@@@ -1,5 +1,25 @@
# Changelog
++## 0.414.0 — 2026-11-12
++
++The whole run (the agent engine, `docs/agents-runs.md`; design `agent-engine.md`). The owner, 11-12, with the menu's
++Chat · Code · Agents switch crossed out: "one new unified agent … the same agentic system, shared across agents, code
++and chat". Everything a person asks an AI to do is one shape: a run, and its thread of steps.
++
++- `agents.run@1` 1.1.0, optional fields only:
++ - `title`, `kind`, `ref` (its address on the Frame), `url`;
++ - `model`, `where`, `target`;
++ - `doing`, `waiting`, `preview`, `counts`, `ended_at`;
++ - `context`, `outputs`, `visibility`;
++ - the agent's face: `agent.glyph`, `agent.hue`, `agent.avatar_url`, `agent.harness`.
++- `agents.step@1` 1.1.0, optional fields only: `from`, `author`, `status`, `title`, `glyph`, `attachments`, `sources`,
++ `ui` (a rich card) and `desk`.
++- Add `agents.run-start@1`: what starts a run on any product and on the Frame. Only `text` is required.
++- Add `agents.event@1`: a run's stream (`run`, `step`, `delta`, `approval`, `end`).
++- Add the event `agents.run.updated` (`@1`): the run's snapshot on OpenVibe.Events when what a list draws changed.
++- A conversation is a run that is `waiting` for a `message`; an approval and a takeover are the same status with
++ another `for`.
++
## 0.413.0 — 2026-11-12
The composer's Reach (Post · Ask · Do, stage R3; Network R3): what its `/` and `@` menus offer.
ddiff --git a/contracts/agents/event.v1.json b/contracts/agents/event.v1.json
nnew file mode 100644
iindex 00000000..b90a5c94
---- /dev/null
++++ b/contracts/agents/event.v1.json
@@@ -0,0 +1,141 @@
++{
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/agents/event.v1.json",
++ "title": "AgentsEvent",
++ "description": "agents.event@1 (agent-engine.md, 2026-11-12): one event of a run's stream, GET /api/v1/runs/{id}/events (and /api/frame/runs/{ref}/events), as server-sent events whose event name is TYPE and whose id is the newest step's seq, so Last-Event-ID resumes after it. run: the run changed; RUN is its new snapshot. step: a step was appended; STEP is it, whole. delta: more TEXT for the step SEQ that is still being written (its STATUS is running); a reader appends it. approval: an approval was asked or answered; APPROVAL is it. end: the run reached an end status; the stream closes after it. A reader ignores a type it does not know.",
++ "type": "object",
++ "required": [
++ "type"
++ ],
++ "properties": {
++ "type": {
++ "enum": [
++ "run",
++ "step",
++ "delta",
++ "approval",
++ "end"
++ ]
++ },
++ "run": {
++ "$ref": "run.v1.json"
++ },
++ "step": {
++ "$ref": "step.v1.json"
++ },
++ "approval": {
++ "$ref": "approval.v1.json"
++ },
++ "run_id": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 160
++ },
++ "seq": {
++ "type": "integer",
++ "minimum": 1
++ },
++ "text": {
++ "type": "string",
++ "maxLength": 65536
++ },
++ "status": {
++ "enum": [
++ "done",
++ "failed",
++ "stopped"
++ ]
++ }
++ },
++ "additionalProperties": false,
++ "allOf": [
++ {
++ "if": {
++ "properties": {
++ "type": {
++ "const": "run"
++ }
++ },
++ "required": [
++ "type"
++ ]
++ },
++ "then": {
++ "required": [
++ "run"
++ ]
++ }
++ },
++ {
++ "if": {
++ "properties": {
++ "type": {
++ "const": "step"
++ }
++ },
++ "required": [
++ "type"
++ ]
++ },
++ "then": {
++ "required": [
++ "step"
++ ]
++ }
++ },
++ {
++ "if": {
++ "properties": {
++ "type": {
++ "const": "delta"
++ }
++ },
++ "required": [
++ "type"
++ ]
++ },
++ "then": {
++ "required": [
++ "run_id",
++ "seq",
++ "text"
++ ]
++ }
++ },
++ {
++ "if": {
++ "properties": {
++ "type": {
++ "const": "approval"
++ }
++ },
++ "required": [
++ "type"
++ ]
++ },
++ "then": {
++ "required": [
++ "approval"
++ ]
++ }
++ },
++ {
++ "if": {
++ "properties": {
++ "type": {
++ "const": "end"
++ }
++ },
++ "required": [
++ "type"
++ ]
++ },
++ "then": {
++ "required": [
++ "run_id",
++ "status"
++ ]
++ }
++ }
++ ]
++}
ddiff --git a/contracts/agents/run-start.v1.json b/contracts/agents/run-start.v1.json
nnew file mode 100644
iindex 00000000..26822392
---- /dev/null
++++ b/contracts/agents/run-start.v1.json
@@@ -0,0 +1,267 @@
++{
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/agents/run-start.v1.json",
++ "title": "AgentsRunStart",
++ "description": "agents.run-start@1 (agent-engine.md, 2026-11-12): what starts a run, the same on every product's POST /api/v1/runs and on the Frame's POST /api/frame/runs. Only TEXT is required: the goal, the question or the first message, in the person's own words. KIND chooses the sort of run (agents.run@1's kinds); absent, the Frame's orchestrator decides whether to answer, plan, or hand the work to another product as a child run. AGENT names who does it (an agent's id; auto lets the product choose). MODEL and WHERE are the picker's choices; TARGET is a code run's (new, openvibe or a repository); CONTEXT is where it was asked; ATTACHMENTS are files by Media id or address; SOURCES and DEPTH are an answer's (frame.ask@1's); PARENT_RUN makes it a sub-agent's run inside its parent's budget; BUDGET is its own hard limit. An Idempotency-Key header makes a repeated start return the first run.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "text"
++ ],
++ "properties": {
++ "text": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 16000
++ },
++ "title": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 200
++ },
++ "kind": {
++ "type": "string",
++ "pattern": "^[a-z][a-z0-9-]{0,30}$"
++ },
++ "agent": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 160,
++ "description": "An agent's id on the product that will run it, or auto."
++ },
++ "model": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "id"
++ ],
++ "properties": {
++ "id": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 200,
++ "pattern": "^[A-Za-z0-9._:/@+| -]+$"
++ },
++ "source": {
++ "enum": [
++ "openvibe",
++ "keys",
++ "machines",
++ "plans"
++ ],
++ "description": "openvibe: Exchange's directory, paid in credits. keys: the person's own key. machines: a model on the person's own computer (Link). plans: a signed-in plan through a harness."
++ },
++ "machine": {
++ "type": "string",
++ "maxLength": 40
++ },
++ "name": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 200
++ },
++ "effort": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 40
++ }
++ },
++ "description": "The picker's choice (frame.choices@1). Absent: the person's default for this kind of work."
++ },
++ "where": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "kind"
++ ],
++ "description": "Where the run's work happens. openvibe: OpenVibe's own computers. machine: the person's own computer or robot through Link (ID is the device). runner: a Codes runner. this-computer: the machine that serves the run itself (Link's agent serve).",
++ "properties": {
++ "kind": {
++ "enum": [
++ "openvibe",
++ "machine",
++ "runner",
++ "this-computer"
++ ]
++ },
++ "id": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 160
++ },
++ "name": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 200
++ }
++ }
++ },
++ "target": {
++ "description": "What a code run works on. new: a new project in the person's own space. openvibe: OpenVibe itself; the orchestrator finds the repositories and opens pull requests, never merges. An object names one repository.",
++ "anyOf": [
++ {
++ "enum": [
++ "new",
++ "openvibe"
++ ]
++ },
++ {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "repo"
++ ],
++ "properties": {
++ "repo": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 300,
++ "description": "owner/name, or the repository's address."
++ },
++ "branch": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 200
++ }
++ }
++ }
++ ]
++ },
++ "context": {
++ "type": "object",
++ "additionalProperties": false,
++ "description": "Where the run was asked: the site, the page and what the page is about. A run may use it; it never grants access.",
++ "properties": {
++ "site": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 60
++ },
++ "url": {
++ "type": "string",
++ "format": "uri",
++ "maxLength": 2000,
++ "description": "The page's address."
++ },
++ "title": {
++ "type": "string",
++ "maxLength": 300
++ },
++ "kind": {
++ "type": "string",
++ "maxLength": 60
++ },
++ "id": {
++ "type": "string",
++ "maxLength": 160
++ }
++ }
++ },
++ "attachments": {
++ "type": "array",
++ "maxItems": 20,
++ "items": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "kind"
++ ],
++ "description": "A file that goes with a message or a start: by its OpenVibe.Media id, or by an https address.",
++ "properties": {
++ "kind": {
++ "enum": [
++ "image",
++ "file",
++ "audio",
++ "video"
++ ]
++ },
++ "media_id": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 60
++ },
++ "url": {
++ "type": "string",
++ "format": "uri",
++ "maxLength": 2000,
++ "description": "An https address the reader may fetch."
++ },
++ "name": {
++ "type": "string",
++ "maxLength": 300
++ },
++ "mime": {
++ "type": "string",
++ "maxLength": 120
++ },
++ "bytes": {
++ "type": "integer",
++ "minimum": 0
++ },
++ "width": {
++ "type": "integer",
++ "minimum": 1
++ },
++ "height": {
++ "type": "integer",
++ "minimum": 1
++ },
++ "alt": {
++ "type": "string",
++ "maxLength": 500,
++ "description": "What a picture shows, in words."
++ }
++ }
++ }
++ },
++ "sources": {
++ "type": "array",
++ "maxItems": 4,
++ "uniqueItems": true,
++ "items": {
++ "enum": [
++ "web",
++ "openvibe",
++ "mine",
++ "page"
++ ]
++ }
++ },
++ "depth": {
++ "enum": [
++ "quick",
++ "balanced",
++ "deep"
++ ]
++ },
++ "parent_run": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 160
++ },
++ "budget": {
++ "type": "object",
++ "additionalProperties": false,
++ "description": "The hard limit the run may not exceed. A field that is absent is not limited. USD is money; TOKENS counts model tokens in and out; SECONDS is wall time; STEPS counts the appended steps.",
++ "properties": {
++ "usd": {
++ "type": "number",
++ "minimum": 0
++ },
++ "tokens": {
++ "type": "integer",
++ "minimum": 0
++ },
++ "seconds": {
++ "type": "number",
++ "minimum": 0
++ },
++ "steps": {
++ "type": "integer",
++ "minimum": 1
++ }
++ }
++ }
++ }
++}
ddiff --git a/contracts/agents/run.v1.json b/contracts/agents/run.v1.json
iindex dea9679f..740e7665 100644
---- a/contracts/agents/run.v1.json
++++ b/contracts/agents/run.v1.json
@@@ -2,7 +2,7 @@
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://openvibe.network/contracts/agents/run.v1.json",
"title": "AgentsRun",
-- "description": "agents.run@1 (one agent system, 2026-11-12): one run of an agent, the same shape on every product (Actor, Codes, Run and anything else on openvibe-sdk/agents). The owner is the person or agent the work belongs to; AGENT names the agent or harness that runs it and the product it comes from; PARENT_RUN makes sub-agent runs a tree; BUDGET is the hard limit and COST what the run has spent; STATUS is where the run is now. The run is stored by its product, not here: this contract is the wire shape. GET /api/v1/runs, /api/v1/runs/{id} and /api/v1/runs/{id}/steps serve it (OpenVibe.Actor) and the SDK's runs client reads it. The product's own id is kept, never reused. A run that ends keeps its end status. This v1 contract may grow optional fields; a step is agents.step@1 and an approval is agents.approval@1.",
++ "description": "agents.run@1 (one agent system, 2026-11-12): one run of an agent, the same shape on every product (Actor, Codes, Run and anything else on openvibe-sdk/agents). The owner is the person or agent the work belongs to; AGENT names the agent or harness that runs it and the product it comes from; PARENT_RUN makes sub-agent runs a tree; BUDGET is the hard limit and COST what the run has spent; STATUS is where the run is now. The run is stored by its product, not here: this contract is the wire shape. GET /api/v1/runs, /api/v1/runs/{id} and /api/v1/runs/{id}/steps serve it (OpenVibe.Actor) and the SDK's runs client reads it. The product's own id is kept, never reused. A run that ends keeps its end status. Since 1.1.0 (agent-engine.md) a run also says what a person calls it (TITLE), what sort it is (KIND), where it lives (REF on the Frame, URL on its product), which model runs it and where, what it is doing now (DOING), what it waits for (WAITING), its last line (PREVIEW), where it was asked (CONTEXT) and what it made (OUTPUTS); a chat with Vibe is a run of KIND chat that is waiting for a message. Every added field is optional. This v1 contract may grow optional fields; a step is agents.step@1 and an approval is agents.approval@1.",
"type": "object",
"additionalProperties": false,
"required": [
@@@ -34,7 +34,7 @@
"required": [
"id"
],
-- "description": "The agent or harness that runs it. ID is the product's own agent id or slug; NAME is what a person reads; PRODUCT is the product it comes from (actor, codes, run, chat, …).",
++ "description": "The agent or harness that runs it. ID is the product's own agent id or slug; NAME is what a person reads; PRODUCT is the product it comes from (actor, codes, run, chat, …). GLYPH, HUE and AVATAR_URL are its face; HARNESS is the loop that runs it.",
"properties": {
"id": {
"type": "string",
@@@ -50,6 +50,28 @@
"type": "string",
"minLength": 1,
"maxLength": 40
++ },
++ "glyph": {
++ "type": "string",
++ "pattern": "^[a-z][a-z0-9-]{0,40}$",
++ "description": "The agent's face when it has no picture: a glyph from the registry. A chat's persona sets it per run."
++ },
++ "hue": {
++ "type": "integer",
++ "minimum": 0,
++ "maximum": 359,
++ "description": "The hue its face is tinted with."
++ },
++ "avatar_url": {
++ "type": "string",
++ "format": "uri",
++ "maxLength": 2000,
++ "description": "The agent's picture, when it has one."
++ },
++ "harness": {
++ "type": "string",
++ "pattern": "^[a-z][a-z0-9-]{0,59}$",
++ "description": "The loop that runs it: openvibe (the SDK's own), or another harness run through an adapter (codex, claude-code, opencode, deepseek, …)."
}
}
},
@@@ -137,6 +159,340 @@
"minimum": 0
}
}
++ },
++ "title": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 200,
++ "description": "What a person calls this run: a chat's name, a task's goal in a few words."
++ },
++ "kind": {
++ "type": "string",
++ "pattern": "^[a-z][a-z0-9-]{0,30}$",
++ "description": "What sort of run it is. chat: a conversation that stays open. ask: one question and its answer. task: work an agent does for its person. code: a coding task. machine: a job on a computer or a robot. goal: a standing goal that runs on its own schedule. A product may add its own; a reader treats an unknown kind as task."
++ },
++ "ref": {
++ "type": "string",
++ "maxLength": 200,
++ "pattern": "^[a-z][a-z0-9-]{0,30}:[A-Za-z0-9._~-]{1,160}$",
++ "description": "The run's address on the Frame: its product, a colon, the product's own id (chat:…, codes:tsk_…, actor:tsk_…). /api/frame/runs/{ref} reads it wherever it lives."
++ },
++ "url": {
++ "type": "string",
++ "format": "uri",
++ "maxLength": 2000,
++ "description": "The run's own page on its product."
++ },
++ "model": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "id"
++ ],
++ "description": "The model that runs it, as the picker chose it (frame.choices@1's choice, with the name a person reads). EFFORT is the reasoning effort where the model has one.",
++ "properties": {
++ "id": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 200,
++ "pattern": "^[A-Za-z0-9._:/@+| -]+$"
++ },
++ "source": {
++ "enum": [
++ "openvibe",
++ "keys",
++ "machines",
++ "plans"
++ ],
++ "description": "openvibe: Exchange's directory, paid in credits. keys: the person's own key. machines: a model on the person's own computer (Link). plans: a signed-in plan through a harness."
++ },
++ "machine": {
++ "type": "string",
++ "maxLength": 40
++ },
++ "name": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 200
++ },
++ "effort": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 40
++ }
++ }
++ },
++ "where": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "kind"
++ ],
++ "description": "Where the run's work happens. openvibe: OpenVibe's own computers. machine: the person's own computer or robot through Link (ID is the device). runner: a Codes runner. this-computer: the machine that serves the run itself (Link's agent serve).",
++ "properties": {
++ "kind": {
++ "enum": [
++ "openvibe",
++ "machine",
++ "runner",
++ "this-computer"
++ ]
++ },
++ "id": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 160
++ },
++ "name": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 200
++ }
++ }
++ },
++ "target": {
++ "description": "What a code run works on. new: a new project in the person's own space. openvibe: OpenVibe itself; the orchestrator finds the repositories and opens pull requests, never merges. An object names one repository.",
++ "anyOf": [
++ {
++ "enum": [
++ "new",
++ "openvibe"
++ ]
++ },
++ {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "repo"
++ ],
++ "properties": {
++ "repo": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 300,
++ "description": "owner/name, or the repository's address."
++ },
++ "branch": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 200
++ }
++ }
++ }
++ ]
++ },
++ "doing": {
++ "type": [
++ "object",
++ "null"
++ ],
++ "additionalProperties": false,
++ "required": [
++ "text"
++ ],
++ "description": "What the run is doing now, for its agent's face: a few words and a glyph. Null when it is not working.",
++ "properties": {
++ "text": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 200
++ },
++ "glyph": {
++ "type": "string",
++ "pattern": "^[a-z][a-z0-9-]{0,40}$",
++ "description": "A glyph's name in the openvibe-shared glyph registry (openvibe.design/icons). A reader that does not know it draws its default."
++ }
++ }
++ },
++ "waiting": {
++ "type": [
++ "object",
++ "null"
++ ],
++ "additionalProperties": false,
++ "required": [
++ "for"
++ ],
++ "description": "Why a waiting run waits. message: it is the person's turn to speak (a conversation between turns). approval: it asked before an act (APPROVAL is the agents.approval@1 id). takeover: it met something only its person can do (a sign-in, a code). payment: it needs funds. WHAT says it in words. Null unless STATUS is waiting.",
++ "properties": {
++ "for": {
++ "enum": [
++ "message",
++ "approval",
++ "takeover",
++ "payment"
++ ]
++ },
++ "what": {
++ "type": "string",
++ "maxLength": 500
++ },
++ "approval": {
++ "type": "string",
++ "maxLength": 160
++ },
++ "since": {
++ "type": "string",
++ "format": "date-time"
++ }
++ }
++ },
++ "preview": {
++ "type": [
++ "object",
++ "null"
++ ],
++ "additionalProperties": false,
++ "required": [
++ "text"
++ ],
++ "description": "The last thing said in the run, for a list: the words, who said them and when.",
++ "properties": {
++ "text": {
++ "type": "string",
++ "maxLength": 500
++ },
++ "from": {
++ "enum": [
++ "person",
++ "agent",
++ "system",
++ "tool"
++ ]
++ },
++ "at": {
++ "type": "string",
++ "format": "date-time"
++ }
++ }
++ },
++ "context": {
++ "type": "object",
++ "additionalProperties": false,
++ "description": "Where the run was asked: the site, the page and what the page is about. A run may use it; it never grants access.",
++ "properties": {
++ "site": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 60
++ },
++ "url": {
++ "type": "string",
++ "format": "uri",
++ "maxLength": 2000,
++ "description": "The page's address."
++ },
++ "title": {
++ "type": "string",
++ "maxLength": 300
++ },
++ "kind": {
++ "type": "string",
++ "maxLength": 60
++ },
++ "id": {
++ "type": "string",
++ "maxLength": 160
++ }
++ }
++ },
++ "outputs": {
++ "type": "array",
++ "maxItems": 50,
++ "description": "What the run made, newest last: for its card, and for the feed when it is shared.",
++ "items": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "kind",
++ "title"
++ ],
++ "properties": {
++ "kind": {
++ "enum": [
++ "link",
++ "file",
++ "image",
++ "video",
++ "audio",
++ "pr",
++ "repo",
++ "page",
++ "post",
++ "run"
++ ]
++ },
++ "title": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 300
++ },
++ "url": {
++ "type": "string",
++ "format": "uri",
++ "maxLength": 2000,
++ "description": "Where it is."
++ },
++ "thumb": {
++ "type": "string",
++ "format": "uri",
++ "maxLength": 2000,
++ "description": "A small picture of it."
++ },
++ "media_id": {
++ "type": "string",
++ "maxLength": 60
++ },
++ "state": {
++ "type": "string",
++ "maxLength": 40,
++ "description": "A pull request's or a check's state in a word (open, green, red, merged)."
++ }
++ }
++ }
++ },
++ "counts": {
++ "type": "object",
++ "additionalProperties": false,
++ "description": "Counts a list shows without reading the steps.",
++ "properties": {
++ "steps": {
++ "type": "integer",
++ "minimum": 0
++ },
++ "children": {
++ "type": "integer",
++ "minimum": 0
++ },
++ "files": {
++ "type": "integer",
++ "minimum": 0
++ },
++ "approvals": {
++ "type": "integer",
++ "minimum": 0
++ },
++ "unread": {
++ "type": "integer",
++ "minimum": 0
++ }
++ }
++ },
++ "visibility": {
++ "enum": [
++ "private",
++ "shared",
++ "public"
++ ],
++ "description": "Who may read the run: its owner only, people it was shared with, or anyone with its address."
++ },
++ "ended_at": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "format": "date-time",
++ "description": "When the run reached an end status. Null while it has not."
}
}
}
ddiff --git a/contracts/agents/step.v1.json b/contracts/agents/step.v1.json
iindex 9de5bd07..eaa99630 100644
---- a/contracts/agents/step.v1.json
++++ b/contracts/agents/step.v1.json
@@@ -2,7 +2,7 @@
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://openvibe.network/contracts/agents/step.v1.json",
"title": "AgentsStep",
-- "description": "agents.step@1 (one agent system, 2026-11-12): one entry of a run's append-only step log, as GET /api/v1/runs/{id}/steps returns it and as agents.step.appended@1 publishes it. SEQ is the run's own order (1, 2, …), never renumbered; a reader pages with ?after=SEQ. KIND says what the entry is: think (a plan, a check, a note to self), tool (a tool call or its result), message (words for the person), approval (the run asked), child (a sub-agent or a hand-off) or file (a file the run made). TEXT is what a person reads; TOOL_CALL is the tool's name and input on a tool entry; RESULT is what came back. The product's own event may split a call and its result into two steps: both carry KIND tool and the call's seq is the earlier one. A step carries no credential, no key and no token; a secret a tool saw is redacted before it is stored.",
++ "description": "agents.step@1 (one agent system, 2026-11-12): one entry of a run's append-only step log, as GET /api/v1/runs/{id}/steps returns it and as agents.step.appended@1 publishes it. SEQ is the run's own order (1, 2, …), never renumbered; a reader pages with ?after=SEQ. KIND says what the entry is: think (a plan, a check, a note to self), tool (a tool call or its result), message (words for the person), approval (the run asked), child (a sub-agent or a hand-off) or file (a file the run made). TEXT is what a person reads; TOOL_CALL is the tool's name and input on a tool entry; RESULT is what came back. The product's own event may split a call and its result into two steps: both carry KIND tool and the call's seq is the earlier one. A step carries no credential, no key and no token; a secret a tool saw is redacted before it is stored. Since 1.1.0 (agent-engine.md) a step also says who spoke (FROM: the person's own words are steps too), whether it is still under way (STATUS), a short TITLE and GLYPH for a tool or a thought, the files that go with it (ATTACHMENTS), numbered SOURCES, a rich card (UI) and, where a computer was used, the DESK picture and action for replay. Every added field is optional.",
"type": "object",
"additionalProperties": false,
"required": [
@@@ -115,6 +115,212 @@
],
"maxLength": 160,
"description": "The child run this step started, on KIND child. Null elsewhere."
++ },
++ "from": {
++ "enum": [
++ "person",
++ "agent",
++ "system",
++ "tool"
++ ],
++ "description": "Who this entry is from. person: the run's person (their message). agent: the agent. system: the product (a notice, a limit reached). tool: a tool's own words. Absent means agent."
++ },
++ "author": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "name"
++ ],
++ "description": "Who spoke, when a thread has several people or agents: a name and a picture. Absent for the run's own person and agent.",
++ "properties": {
++ "id": {
++ "type": "string",
++ "maxLength": 160
++ },
++ "name": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 160
++ },
++ "avatar_url": {
++ "type": "string",
++ "format": "uri",
++ "maxLength": 2000,
++ "description": "Their picture."
++ }
++ }
++ },
++ "status": {
++ "enum": [
++ "running",
++ "done",
++ "failed"
++ ],
++ "description": "Whether the entry is still under way (a tool that runs, a message being written). Absent means done."
++ },
++ "title": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 200,
++ "description": "The entry in a few words, for a tool or a thought: \"Searching the web\", \"Reading 3 files\"."
++ },
++ "glyph": {
++ "type": "string",
++ "pattern": "^[a-z][a-z0-9-]{0,40}$",
++ "description": "A glyph's name in the openvibe-shared glyph registry (openvibe.design/icons). A reader that does not know it draws its default."
++ },
++ "attachments": {
++ "type": "array",
++ "maxItems": 20,
++ "items": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "kind"
++ ],
++ "description": "A file that goes with a message or a start: by its OpenVibe.Media id, or by an https address.",
++ "properties": {
++ "kind": {
++ "enum": [
++ "image",
++ "file",
++ "audio",
++ "video"
++ ]
++ },
++ "media_id": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 60
++ },
++ "url": {
++ "type": "string",
++ "format": "uri",
++ "maxLength": 2000,
++ "description": "An https address the reader may fetch."
++ },
++ "name": {
++ "type": "string",
++ "maxLength": 300
++ },
++ "mime": {
++ "type": "string",
++ "maxLength": 120
++ },
++ "bytes": {
++ "type": "integer",
++ "minimum": 0
++ },
++ "width": {
++ "type": "integer",
++ "minimum": 1
++ },
++ "height": {
++ "type": "integer",
++ "minimum": 1
++ },
++ "alt": {
++ "type": "string",
++ "maxLength": 500,
++ "description": "What a picture shows, in words."
++ }
++ }
++ }
++ },
++ "sources": {
++ "type": "array",
++ "maxItems": 40,
++ "description": "The sources a message cites, numbered as its text cites them ([1], [2]).",
++ "items": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "n",
++ "url"
++ ],
++ "properties": {
++ "n": {
++ "type": "integer",
++ "minimum": 1
++ },
++ "title": {
++ "type": "string",
++ "maxLength": 300
++ },
++ "url": {
++ "type": "string",
++ "format": "uri",
++ "maxLength": 2000,
++ "description": "The source's address."
++ },
++ "site": {
++ "type": "string",
++ "maxLength": 120
++ }
++ }
++ }
++ },
++ "ui": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "type"
++ ],
++ "description": "A rich card for this entry. TYPE names it (link, table, code, diff, image, choice, timer, repo, desk, run, or a product's own, prefixed with its product: live-clip); DATA is that card's own content. A reader that does not know the type shows TEXT instead, so TEXT always says the same thing in words.",
++ "properties": {
++ "type": {
++ "type": "string",
++ "pattern": "^[a-z][a-z0-9-]{0,40}$"
++ },
++ "data": {
++ "type": "object",
++ "maxProperties": 64
++ }
++ }
++ },
++ "desk": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "id"
++ ],
++ "description": "The computer this step used, for the screen tile and the replay: the desk, the picture it saw and what it did. A secret field is blanked before a still is stored.",
++ "properties": {
++ "id": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 160
++ },
++ "still_url": {
++ "type": "string",
++ "format": "uri",
++ "maxLength": 2000,
++ "description": "The picture the step saw."
++ },
++ "action": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "type"
++ ],
++ "properties": {
++ "type": {
++ "type": "string",
++ "pattern": "^[a-z][a-z0-9-]{0,40}$"
++ },
++ "x": {
++ "type": "number"
++ },
++ "y": {
++ "type": "number"
++ },
++ "text": {
++ "type": "string",
++ "maxLength": 500
++ }
++ }
++ }
++ }
}
}
}
ddiff --git a/contracts/catalog.json b/contracts/catalog.json
iindex 6abdc3c0..a213c964 100644
---- a/contracts/catalog.json
++++ b/contracts/catalog.json
@@@ -11731,7 +11731,7 @@
},
{
"id": "agents.run",
-- "version": "1.0.0",
++ "version": "1.1.0",
"owner": "actor",
"schema": "agents/run.v1.json",
"visibility": "public",
@@@ -11741,7 +11741,7 @@
},
{
"id": "agents.step",
-- "version": "1.0.0",
++ "version": "1.1.0",
"owner": "actor",
"schema": "agents/step.v1.json",
"visibility": "public",
@@@ -11768,6 +11768,36 @@
"compatibility": "backward",
"status": "active",
"adr": "ADR-044"
++ },
++ {
++ "id": "agents.run-start",
++ "version": "1.0.0",
++ "owner": "network",
++ "schema": "agents/run-start.v1.json",
++ "visibility": "public",
++ "compatibility": "backward",
++ "status": "active",
++ "adr": "ADR-044"
++ },
++ {
++ "id": "agents.event",
++ "version": "1.0.0",
++ "owner": "network",
++ "schema": "agents/event.v1.json",
++ "visibility": "public",
++ "compatibility": "backward",
++ "status": "active",
++ "adr": "ADR-044"
++ },
++ {
++ "id": "agents.run.updated",
++ "version": "1.0.0",
++ "owner": "actor",
++ "schema": "events/payloads/agents.run.updated.v1.json",
++ "visibility": "first-party",
++ "compatibility": "backward",
++ "status": "active",
++ "adr": "ADR-044"
}
]
}
ddiff --git a/contracts/events/payloads/agents.run.updated.v1.json b/contracts/events/payloads/agents.run.updated.v1.json
nnew file mode 100644
iindex 00000000..dd89acfc
---- /dev/null
++++ b/contracts/events/payloads/agents.run.updated.v1.json
@@@ -0,0 +1,7 @@
++{
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/events/payloads/agents.run.updated.v1.json",
++ "title": "AgentsRunUpdatedPayload",
++ "description": "agents.run.updated v1 (agent-engine.md, 2026-11-12). A run changed in a way a list shows: it started, its status, title, doing, waiting or preview changed, or it ended. The payload is the run's agents.run@1 snapshot, whole. OpenVibe.Events carries it with the run's owner as the subject, the product that stores it as the source and visibility subject, so the person's run list anywhere stays current without polling. A step is agents.step.appended; this event is not sent for every step, only when the snapshot a list draws changed (at most about once a second per run).",
++ "$ref": "../../agents/run.v1.json"
++}
ddiff --git a/docs/agents-runs.md b/docs/agents-runs.md
iindex a936493c..c2d3c78e 100644
---- a/docs/agents-runs.md
++++ b/docs/agents-runs.md
@@@ -132,3 +132,49 @@ tool_result`.
- **The event is a contract, not yet a producer.** OpenVibe.Events accepts `agents.step.appended`; Actor's
read-only API does not publish it yet. The engine that appends the step is the publisher (one producer per run),
with the run's owner as the subject and the product as the source.
++
++## 0.414.0: the whole run (the agent engine)
++
++Design: `~/openvibe/research-2026-11-12/agent-engine.md`. **Everything a person asks an AI to do on OpenVibe is a run,
++and a run is a thread of steps**: a chat with Vibe, a question in a composer, a task for your agent, a coding task, a
++job on a machine. The 0.412.0 shapes were the core; 0.414.0 grows them with optional fields only, so every reader and
++writer of 0.412.0 stays valid.
++
++- `agents.run@1` (1.1.0) adds:
++ - **what it is:** `title`, `kind` (`chat`, `ask`, `task`, `code`, `machine`, `goal`, or a product's own);
++ - **where it lives:** `ref` (`<product>:<id>`, its address on the Frame), `url` (its page on its product);
++ - **how it runs:** `model` (`id`, `source`, `name`, `effort`), `where` (`openvibe`, `machine`, `runner`,
++ `this-computer`), `target` (a code run's: `new`, `openvibe`, or `{ repo }`);
++ - **its state for a list:** `doing` (`text`, `glyph`: the icon on its agent's face), `waiting` (`for`: `message`,
++ `approval`, `takeover` or `payment`), `preview` (the last line), `counts`, `ended_at`;
++ - **around it:** `context` (where it was asked), `outputs` (what it made), `visibility`;
++ - **its agent's face:** `agent.glyph`, `agent.hue`, `agent.avatar_url`, `agent.harness`. A chat's persona is that
++ run's `agent`.
++- `agents.step@1` (1.1.0) adds `from` (`person`, `agent`, `system`, `tool`: a person's own words are steps), `author`,
++ `status` (`running`, `done`, `failed`), `title`, `glyph`, `attachments`, `sources`, `ui` (a rich card: `type` and
++ `data`; a reader that does not know the type shows `text`) and `desk` (the picture and action, for replay).
++- `agents.run-start@1` is what starts a run: only `text` is required.
++- `agents.event@1` is one event of a run's stream: `run`, `step`, `delta`, `approval` or `end`.
++- `agents.run.updated` (event, `@1`) is the run's snapshot on OpenVibe.Events when what a list draws changed.
++
++**A conversation is a run that is `waiting` for a `message`.** The same status covers an approval (`for: approval`)
++and something only the person can do (`for: takeover`), so no reader needs a second model for chats.
++
++### The Run API
++
++The same routes on every product (`/api/v1`) and, for every product at once, on the Frame (`/api/frame`, where the id
++is the run's `ref`):
++
++| | |
++|---|---|
++| `GET /runs?kind=&status=&q=&limit=&cursor=` | the caller's runs, newest first: `{ runs, next }` |
++| `POST /runs` | start one (`agents.run-start@1`; `Idempotency-Key` returns the first run again): `201` the run |
++| `GET /runs/{id}` | one run |
++| `GET /runs/{id}/steps?after=&limit=` | its thread: `{ steps, next }` |
++| `GET /runs/{id}/events` | its stream (`agents.event@1` as server-sent events; `Last-Event-ID` is a step's seq) |
++| `POST /runs/{id}/messages` | say something to it (`{ text, attachments }`): `201` the step |
++| `POST /runs/{id}/stop` | stop it |
++| `POST /runs/{id}/approvals/{approval}` | answer an approval (`{ answer }`) |
++
++`openvibe-sdk/agents` is the client (`runs`, `approvals`, the desks calls) and the kit a product mounts to serve these
++routes from its own store.
ddiff --git a/fixtures/agents.event/invalid/an-end-without-its-status.json b/fixtures/agents.event/invalid/an-end-without-its-status.json
nnew file mode 100644
iindex 00000000..5739bf55
---- /dev/null
++++ b/fixtures/agents.event/invalid/an-end-without-its-status.json
@@@ -0,0 +1,4 @@
++{
++ "type": "end",
++ "run_id": "c_8f3k2m"
++}
ddiff --git a/fixtures/agents.event/invalid/more-text-for-no-step.json b/fixtures/agents.event/invalid/more-text-for-no-step.json
nnew file mode 100644
iindex 00000000..68008bfb
---- /dev/null
++++ b/fixtures/agents.event/invalid/more-text-for-no-step.json
@@@ -0,0 +1,5 @@
++{
++ "type": "delta",
++ "run_id": "c_8f3k2m",
++ "text": "…"
++}
ddiff --git a/fixtures/agents.event/valid/a-step.json b/fixtures/agents.event/valid/a-step.json
nnew file mode 100644
iindex 00000000..c7380b62
---- /dev/null
++++ b/fixtures/agents.event/valid/a-step.json
@@@ -0,0 +1,25 @@
++{
++ "type": "step",
++ "step": {
++ "run_id": "tsk_01K9R2V6M8Q4T0B7C3D5E9F2GH",
++ "seq": 4,
++ "kind": "tool",
++ "text": "Ran the test suite",
++ "tool_call": {
++ "name": "terminal",
++ "input": {
++ "command": "npm test",
++ "cwd": "/home/person/app"
++ }
++ },
++ "result": "124 checks passed",
++ "cost": {
++ "usd": 0.002,
++ "tokens": 310,
++ "seconds": 18
++ },
++ "started_at": "2026-11-12T10:00:10Z",
++ "ended_at": "2026-11-12T10:00:28Z",
++ "child_run": null
++ }
++}
ddiff --git a/fixtures/agents.event/valid/more-text.json b/fixtures/agents.event/valid/more-text.json
nnew file mode 100644
iindex 00000000..4d7800ef
---- /dev/null
++++ b/fixtures/agents.event/valid/more-text.json
@@@ -0,0 +1,6 @@
++{
++ "type": "delta",
++ "run_id": "c_8f3k2m",
++ "seq": 4,
++ "text": " the Keychron K2 is the best value"
++}
ddiff --git a/fixtures/agents.event/valid/the-end.json b/fixtures/agents.event/valid/the-end.json
nnew file mode 100644
iindex 00000000..aa14295e
---- /dev/null
++++ b/fixtures/agents.event/valid/the-end.json
@@@ -0,0 +1,5 @@
++{
++ "type": "end",
++ "run_id": "tsk_01K9R2V6M8Q4T0B7C3D5E9F2GH",
++ "status": "done"
++}
ddiff --git a/fixtures/agents.event/valid/the-run-changed.json b/fixtures/agents.event/valid/the-run-changed.json
nnew file mode 100644
iindex 00000000..c4c23f26
---- /dev/null
++++ b/fixtures/agents.event/valid/the-run-changed.json
@@@ -0,0 +1,52 @@
++{
++ "type": "run",
++ "run": {
++ "id": "c_8f3k2m",
++ "ref": "chat:c_8f3k2m",
++ "kind": "chat",
++ "title": "Keyboard Scout",
++ "owner": {
++ "type": "user",
++ "id": "usr_01K9R2V6M8Q4T0B7C3D5E9F2GH"
++ },
++ "agent": {
++ "id": "vibe",
++ "name": "Keyboard Scout",
++ "product": "chat",
++ "glyph": "search",
++ "hue": 212,
++ "harness": "openvibe"
++ },
++ "status": "waiting",
++ "waiting": {
++ "for": "message",
++ "since": "2026-11-12T10:02:00Z"
++ },
++ "preview": {
++ "text": "Three picks under $90, with sources.",
++ "from": "agent",
++ "at": "2026-11-12T10:02:00Z"
++ },
++ "model": {
++ "id": "openvibe/auto",
++ "source": "openvibe",
++ "name": "Auto"
++ },
++ "where": {
++ "kind": "openvibe"
++ },
++ "context": {
++ "site": "deals",
++ "url": "https://openvibe.deals/",
++ "title": "Deals"
++ },
++ "url": "https://openvibe.chat/vibe/c_8f3k2m",
++ "counts": {
++ "steps": 6,
++ "unread": 1
++ },
++ "visibility": "private",
++ "created_at": "2026-11-12T10:00:00Z",
++ "updated_at": "2026-11-12T10:02:00Z"
++ }
++}
ddiff --git a/fixtures/agents.run-start/invalid/a-target-that-is-not-one.json b/fixtures/agents.run-start/invalid/a-target-that-is-not-one.json
nnew file mode 100644
iindex 00000000..bf8490e4
---- /dev/null
++++ b/fixtures/agents.run-start/invalid/a-target-that-is-not-one.json
@@@ -0,0 +1,5 @@
++{
++ "text": "fix it",
++ "kind": "code",
++ "target": "everything"
++}
ddiff --git a/fixtures/agents.run-start/invalid/no-words.json b/fixtures/agents.run-start/invalid/no-words.json
nnew file mode 100644
iindex 00000000..4be98ca7
---- /dev/null
++++ b/fixtures/agents.run-start/invalid/no-words.json
@@@ -0,0 +1,3 @@
++{
++ "kind": "chat"
++}
ddiff --git a/fixtures/agents.run-start/valid/a-code-run-on-openvibe.json b/fixtures/agents.run-start/valid/a-code-run-on-openvibe.json
nnew file mode 100644
iindex 00000000..beb7beaf
---- /dev/null
++++ b/fixtures/agents.run-start/valid/a-code-run-on-openvibe.json
@@@ -0,0 +1,28 @@
++{
++ "text": "Add a goal bar overlay streamers can put on their stream, with the sub goal and progress.",
++ "kind": "code",
++ "target": "openvibe",
++ "model": {
++ "id": "openvibe/auto",
++ "source": "openvibe"
++ },
++ "where": {
++ "kind": "openvibe"
++ },
++ "context": {
++ "site": "live",
++ "url": "https://openvibe.live/dashboard",
++ "title": "Dashboard"
++ },
++ "attachments": [
++ {
++ "kind": "image",
++ "media_id": "med_01K9R2V6M8Q4T0B7C3D5E9F2GH",
++ "alt": "A sketch of the bar"
++ }
++ ],
++ "budget": {
++ "usd": 5,
++ "steps": 400
++ }
++}
ddiff --git a/fixtures/agents.run-start/valid/a-question-with-sources.json b/fixtures/agents.run-start/valid/a-question-with-sources.json
nnew file mode 100644
iindex 00000000..c2958e46
---- /dev/null
++++ b/fixtures/agents.run-start/valid/a-question-with-sources.json
@@@ -0,0 +1,9 @@
++{
++ "text": "What happened in tech news today?",
++ "kind": "ask",
++ "sources": [
++ "web",
++ "openvibe"
++ ],
++ "depth": "balanced"
++}
ddiff --git a/fixtures/agents.run-start/valid/just-words.json b/fixtures/agents.run-start/valid/just-words.json
nnew file mode 100644
iindex 00000000..e3f3f16a
---- /dev/null
++++ b/fixtures/agents.run-start/valid/just-words.json
@@@ -0,0 +1,3 @@
++{
++ "text": "A goal bar for my sub goal"
++}
ddiff --git a/fixtures/agents.run.updated/invalid/no-status.json b/fixtures/agents.run.updated/invalid/no-status.json
nnew file mode 100644
iindex 00000000..3517ef9f
---- /dev/null
++++ b/fixtures/agents.run.updated/invalid/no-status.json
@@@ -0,0 +1,48 @@
++{
++ "id": "c_8f3k2m",
++ "ref": "chat:c_8f3k2m",
++ "kind": "chat",
++ "title": "Keyboard Scout",
++ "owner": {
++ "type": "user",
++ "id": "usr_01K9R2V6M8Q4T0B7C3D5E9F2GH"
++ },
++ "agent": {
++ "id": "vibe",
++ "name": "Keyboard Scout",
++ "product": "chat",
++ "glyph": "search",
++ "hue": 212,
++ "harness": "openvibe"
++ },
++ "waiting": {
++ "for": "message",
++ "since": "2026-11-12T10:02:00Z"
++ },
++ "preview": {
++ "text": "Three picks under $90, with sources.",
++ "from": "agent",
++ "at": "2026-11-12T10:02:00Z"
++ },
++ "model": {
++ "id": "openvibe/auto",
++ "source": "openvibe",
++ "name": "Auto"
++ },
++ "where": {
++ "kind": "openvibe"
++ },
++ "context": {
++ "site": "deals",
++ "url": "https://openvibe.deals/",
++ "title": "Deals"
++ },
++ "url": "https://openvibe.chat/vibe/c_8f3k2m",
++ "counts": {
++ "steps": 6,
++ "unread": 1
++ },
++ "visibility": "private",
++ "created_at": "2026-11-12T10:00:00Z",
++ "updated_at": "2026-11-12T10:02:00Z"
++}
ddiff --git a/fixtures/agents.run.updated/valid/a-chat-waiting.json b/fixtures/agents.run.updated/valid/a-chat-waiting.json
nnew file mode 100644
iindex 00000000..1ac21816
---- /dev/null
++++ b/fixtures/agents.run.updated/valid/a-chat-waiting.json
@@@ -0,0 +1,49 @@
++{
++ "id": "c_8f3k2m",
++ "ref": "chat:c_8f3k2m",
++ "kind": "chat",
++ "title": "Keyboard Scout",
++ "owner": {
++ "type": "user",
++ "id": "usr_01K9R2V6M8Q4T0B7C3D5E9F2GH"
++ },
++ "agent": {
++ "id": "vibe",
++ "name": "Keyboard Scout",
++ "product": "chat",
++ "glyph": "search",
++ "hue": 212,
++ "harness": "openvibe"
++ },
++ "status": "waiting",
++ "waiting": {
++ "for": "message",
++ "since": "2026-11-12T10:02:00Z"
++ },
++ "preview": {
++ "text": "Three picks under $90, with sources.",
++ "from": "agent",
++ "at": "2026-11-12T10:02:00Z"
++ },
++ "model": {
++ "id": "openvibe/auto",
++ "source": "openvibe",
++ "name": "Auto"
++ },
++ "where": {
++ "kind": "openvibe"
++ },
++ "context": {
++ "site": "deals",
++ "url": "https://openvibe.deals/",
++ "title": "Deals"
++ },
++ "url": "https://openvibe.chat/vibe/c_8f3k2m",
++ "counts": {
++ "steps": 6,
++ "unread": 1
++ },
++ "visibility": "private",
++ "created_at": "2026-11-12T10:00:00Z",
++ "updated_at": "2026-11-12T10:02:00Z"
++}
ddiff --git a/fixtures/agents.run/invalid/ref-without-a-product.json b/fixtures/agents.run/invalid/ref-without-a-product.json
nnew file mode 100644
iindex 00000000..31438542
---- /dev/null
++++ b/fixtures/agents.run/invalid/ref-without-a-product.json
@@@ -0,0 +1,49 @@
++{
++ "id": "c_8f3k2m",
++ "ref": "c_8f3k2m",
++ "kind": "chat",
++ "title": "Keyboard Scout",
++ "owner": {
++ "type": "user",
++ "id": "usr_01K9R2V6M8Q4T0B7C3D5E9F2GH"
++ },
++ "agent": {
++ "id": "vibe",
++ "name": "Keyboard Scout",
++ "product": "chat",
++ "glyph": "search",
++ "hue": 212,
++ "harness": "openvibe"
++ },
++ "status": "waiting",
++ "waiting": {
++ "for": "message",
++ "since": "2026-11-12T10:02:00Z"
++ },
++ "preview": {
++ "text": "Three picks under $90, with sources.",
++ "from": "agent",
++ "at": "2026-11-12T10:02:00Z"
++ },
++ "model": {
++ "id": "openvibe/auto",
++ "source": "openvibe",
++ "name": "Auto"
++ },
++ "where": {
++ "kind": "openvibe"
++ },
++ "context": {
++ "site": "deals",
++ "url": "https://openvibe.deals/",
++ "title": "Deals"
++ },
++ "url": "https://openvibe.chat/vibe/c_8f3k2m",
++ "counts": {
++ "steps": 6,
++ "unread": 1
++ },
++ "visibility": "private",
++ "created_at": "2026-11-12T10:00:00Z",
++ "updated_at": "2026-11-12T10:02:00Z"
++}
ddiff --git a/fixtures/agents.run/invalid/waiting-for-nothing-known.json b/fixtures/agents.run/invalid/waiting-for-nothing-known.json
nnew file mode 100644
iindex 00000000..0bac8b4c
---- /dev/null
++++ b/fixtures/agents.run/invalid/waiting-for-nothing-known.json
@@@ -0,0 +1,48 @@
++{
++ "id": "c_8f3k2m",
++ "ref": "chat:c_8f3k2m",
++ "kind": "chat",
++ "title": "Keyboard Scout",
++ "owner": {
++ "type": "user",
++ "id": "usr_01K9R2V6M8Q4T0B7C3D5E9F2GH"
++ },
++ "agent": {
++ "id": "vibe",
++ "name": "Keyboard Scout",
++ "product": "chat",
++ "glyph": "search",
++ "hue": 212,
++ "harness": "openvibe"
++ },
++ "status": "waiting",
++ "waiting": {
++ "for": "luck"
++ },
++ "preview": {
++ "text": "Three picks under $90, with sources.",
++ "from": "agent",
++ "at": "2026-11-12T10:02:00Z"
++ },
++ "model": {
++ "id": "openvibe/auto",
++ "source": "openvibe",
++ "name": "Auto"
++ },
++ "where": {
++ "kind": "openvibe"
++ },
++ "context": {
++ "site": "deals",
++ "url": "https://openvibe.deals/",
++ "title": "Deals"
++ },
++ "url": "https://openvibe.chat/vibe/c_8f3k2m",
++ "counts": {
++ "steps": 6,
++ "unread": 1
++ },
++ "visibility": "private",
++ "created_at": "2026-11-12T10:00:00Z",
++ "updated_at": "2026-11-12T10:02:00Z"
++}
ddiff --git a/fixtures/agents.run/valid/chat-waiting-for-a-message.json b/fixtures/agents.run/valid/chat-waiting-for-a-message.json
nnew file mode 100644
iindex 00000000..1ac21816
---- /dev/null
++++ b/fixtures/agents.run/valid/chat-waiting-for-a-message.json
@@@ -0,0 +1,49 @@
++{
++ "id": "c_8f3k2m",
++ "ref": "chat:c_8f3k2m",
++ "kind": "chat",
++ "title": "Keyboard Scout",
++ "owner": {
++ "type": "user",
++ "id": "usr_01K9R2V6M8Q4T0B7C3D5E9F2GH"
++ },
++ "agent": {
++ "id": "vibe",
++ "name": "Keyboard Scout",
++ "product": "chat",
++ "glyph": "search",
++ "hue": 212,
++ "harness": "openvibe"
++ },
++ "status": "waiting",
++ "waiting": {
++ "for": "message",
++ "since": "2026-11-12T10:02:00Z"
++ },
++ "preview": {
++ "text": "Three picks under $90, with sources.",
++ "from": "agent",
++ "at": "2026-11-12T10:02:00Z"
++ },
++ "model": {
++ "id": "openvibe/auto",
++ "source": "openvibe",
++ "name": "Auto"
++ },
++ "where": {
++ "kind": "openvibe"
++ },
++ "context": {
++ "site": "deals",
++ "url": "https://openvibe.deals/",
++ "title": "Deals"
++ },
++ "url": "https://openvibe.chat/vibe/c_8f3k2m",
++ "counts": {
++ "steps": 6,
++ "unread": 1
++ },
++ "visibility": "private",
++ "created_at": "2026-11-12T10:00:00Z",
++ "updated_at": "2026-11-12T10:02:00Z"
++}
ddiff --git a/fixtures/agents.run/valid/code-on-openvibe.json b/fixtures/agents.run/valid/code-on-openvibe.json
nnew file mode 100644
iindex 00000000..505971e5
---- /dev/null
++++ b/fixtures/agents.run/valid/code-on-openvibe.json
@@@ -0,0 +1,59 @@
++{
++ "id": "tsk_01K9R2V6M8Q4T0B7C3D5E9F2GH",
++ "ref": "codes:tsk_01K9R2V6M8Q4T0B7C3D5E9F2GH",
++ "kind": "code",
++ "title": "A goal bar for my sub goal",
++ "owner": {
++ "type": "user",
++ "id": "usr_01K9R2V6M8Q4T0B7C3D5E9F2GH"
++ },
++ "agent": {
++ "id": "orchestrator",
++ "name": "Codes",
++ "product": "codes",
++ "glyph": "code",
++ "hue": 262,
++ "harness": "codex"
++ },
++ "target": "openvibe",
++ "status": "running",
++ "doing": {
++ "text": "Reading OpenVibe.Live's overlay code",
++ "glyph": "book-open"
++ },
++ "model": {
++ "id": "plans/codex|gpt-6-sol",
++ "source": "plans",
++ "name": "GPT-6 Sol",
++ "effort": "xhigh"
++ },
++ "where": {
++ "kind": "runner",
++ "id": "run_ws1",
++ "name": "Workstation"
++ },
++ "outputs": [
++ {
++ "kind": "pr",
++ "title": "Live: a goal bar overlay",
++ "url": "https://git.openvibe.codes/OpenVibers/OpenVibe.Live/pulls/871",
++ "state": "open"
++ }
++ ],
++ "counts": {
++ "steps": 41,
++ "children": 2,
++ "files": 5
++ },
++ "budget": {
++ "usd": 5,
++ "steps": 400
++ },
++ "cost": {
++ "usd": 0.84,
++ "steps": 41
++ },
++ "created_at": "2026-11-12T10:00:00Z",
++ "updated_at": "2026-11-12T10:09:30Z",
++ "ended_at": null
++}
ddiff --git a/fixtures/agents.step/invalid/a-card-without-a-type.json b/fixtures/agents.step/invalid/a-card-without-a-type.json
nnew file mode 100644
iindex 00000000..b6746c21
---- /dev/null
++++ b/fixtures/agents.step/invalid/a-card-without-a-type.json
@@@ -0,0 +1,10 @@
++{
++ "run_id": "c_8f3k2m",
++ "seq": 2,
++ "kind": "message",
++ "text": "hi",
++ "ui": {
++ "data": {}
++ },
++ "started_at": "2026-11-12T10:00:00Z"
++}
ddiff --git a/fixtures/agents.step/invalid/from-nobody-known.json b/fixtures/agents.step/invalid/from-nobody-known.json
nnew file mode 100644
iindex 00000000..6a6d36ef
---- /dev/null
++++ b/fixtures/agents.step/invalid/from-nobody-known.json
@@@ -0,0 +1,8 @@
++{
++ "run_id": "c_8f3k2m",
++ "seq": 2,
++ "kind": "message",
++ "from": "narrator",
++ "text": "hi",
++ "started_at": "2026-11-12T10:00:00Z"
++}
ddiff --git a/fixtures/agents.step/valid/a-persons-message-with-a-picture.json b/fixtures/agents.step/valid/a-persons-message-with-a-picture.json
nnew file mode 100644
iindex 00000000..e32f2718
---- /dev/null
++++ b/fixtures/agents.step/valid/a-persons-message-with-a-picture.json
@@@ -0,0 +1,21 @@
++{
++ "run_id": "c_8f3k2m",
++ "seq": 1,
++ "kind": "message",
++ "from": "person",
++ "text": "Find me a good deal on a mechanical keyboard like this one.",
++ "attachments": [
++ {
++ "kind": "image",
++ "media_id": "med_01K9R2V6M8Q4T0B7C3D5E9F2GH",
++ "name": "keyboard.jpg",
++ "mime": "image/jpeg",
++ "bytes": 182044,
++ "width": 1200,
++ "height": 800,
++ "alt": "A grey 75% mechanical keyboard"
++ }
++ ],
++ "started_at": "2026-11-12T10:00:00Z",
++ "ended_at": "2026-11-12T10:00:00Z"
++}
ddiff --git a/fixtures/agents.step/valid/a-tool-on-a-desk.json b/fixtures/agents.step/valid/a-tool-on-a-desk.json
nnew file mode 100644
iindex 00000000..e1d8234b
---- /dev/null
++++ b/fixtures/agents.step/valid/a-tool-on-a-desk.json
@@@ -0,0 +1,28 @@
++{
++ "run_id": "tsk_01K9R2V6M8Q4T0B7C3D5E9F2GH",
++ "seq": 7,
++ "kind": "tool",
++ "from": "tool",
++ "status": "done",
++ "title": "Typing in the search box",
++ "glyph": "search",
++ "text": "Typed \"mechanical keyboard 75%\" in the search box.",
++ "tool_call": {
++ "name": "computer.type",
++ "input": {
++ "text": "mechanical keyboard 75%"
++ }
++ },
++ "desk": {
++ "id": "desk_private_1",
++ "still_url": "https://openvibe.media/s/still_01K9R2V6M8Q4T0B7C3D5E9F2GH.jpg",
++ "action": {
++ "type": "type",
++ "x": 512,
++ "y": 96,
++ "text": "mechanical keyboard 75%"
++ }
++ },
++ "started_at": "2026-11-12T10:03:00Z",
++ "ended_at": "2026-11-12T10:03:01Z"
++}
ddiff --git a/fixtures/agents.step/valid/an-answer-being-written-with-sources-and-a-card.json b/fixtures/agents.step/valid/an-answer-being-written-with-sources-and-a-card.json
nnew file mode 100644
iindex 00000000..5029052f
---- /dev/null
++++ b/fixtures/agents.step/valid/an-answer-being-written-with-sources-and-a-card.json
@@@ -0,0 +1,51 @@
++{
++ "run_id": "c_8f3k2m",
++ "seq": 4,
++ "kind": "message",
++ "from": "agent",
++ "status": "running",
++ "text": "Three picks under $90 [1][2]:",
++ "sources": [
++ {
++ "n": 1,
++ "title": "Keychron K2 at $74",
++ "url": "https://openvibe.deals/d/keychron-k2",
++ "site": "openvibe.deals"
++ },
++ {
++ "n": 2,
++ "title": "r/MechanicalKeyboards buying guide",
++ "url": "https://www.reddit.com/r/MechanicalKeyboards/wiki/buying_guide",
++ "site": "reddit.com"
++ }
++ ],
++ "ui": {
++ "type": "table",
++ "data": {
++ "columns": [
++ "Keyboard",
++ "Price",
++ "Switches"
++ ],
++ "rows": [
++ [
++ "Keychron K2",
++ "$74",
++ "Gateron Brown"
++ ],
++ [
++ "Royal Kludge RK84",
++ "$59",
++ "Red"
++ ],
++ [
++ "Epomaker TH80",
++ "$89",
++ "Budgerigar"
++ ]
++ ]
++ }
++ },
++ "started_at": "2026-11-12T10:01:40Z",
++ "ended_at": null
++}
ddiff --git a/generated/json-schema/bundle.json b/generated/json-schema/bundle.json
iindex b199badc..73e78a45 100644
---- a/generated/json-schema/bundle.json
++++ b/generated/json-schema/bundle.json
@@@ -134957,14 +134957,14 @@
}
},
"agents.run": {
-- "version": "1.0.0",
++ "version": "1.1.0",
"owner": "actor",
"status": "active",
"schema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://openvibe.network/contracts/agents/run.v1.json",
"title": "AgentsRun",
-- "description": "agents.run@1 (one agent system, 2026-11-12): one run of an agent, the same shape on every product (Actor, Codes, Run and anything else on openvibe-sdk/agents). The owner is the person or agent the work belongs to; AGENT names the agent or harness that runs it and the product it comes from; PARENT_RUN makes sub-agent runs a tree; BUDGET is the hard limit and COST what the run has spent; STATUS is where the run is now. The run is stored by its product, not here: this contract is the wire shape. GET /api/v1/runs, /api/v1/runs/{id} and /api/v1/runs/{id}/steps serve it (OpenVibe.Actor) and the SDK's runs client reads it. The product's own id is kept, never reused. A run that ends keeps its end status. This v1 contract may grow optional fields; a step is agents.step@1 and an approval is agents.approval@1.",
++ "description": "agents.run@1 (one agent system, 2026-11-12): one run of an agent, the same shape on every product (Actor, Codes, Run and anything else on openvibe-sdk/agents). The owner is the person or agent the work belongs to; AGENT names the agent or harness that runs it and the product it comes from; PARENT_RUN makes sub-agent runs a tree; BUDGET is the hard limit and COST what the run has spent; STATUS is where the run is now. The run is stored by its product, not here: this contract is the wire shape. GET /api/v1/runs, /api/v1/runs/{id} and /api/v1/runs/{id}/steps serve it (OpenVibe.Actor) and the SDK's runs client reads it. The product's own id is kept, never reused. A run that ends keeps its end status. Since 1.1.0 (agent-engine.md) a run also says what a person calls it (TITLE), what sort it is (KIND), where it lives (REF on the Frame, URL on its product), which model runs it and where, what it is doing now (DOING), what it waits for (WAITING), its last line (PREVIEW), where it was asked (CONTEXT) and what it made (OUTPUTS); a chat with Vibe is a run of KIND chat that is waiting for a message. Every added field is optional. This v1 contract may grow optional fields; a step is agents.step@1 and an approval is agents.approval@1.",
"type": "object",
"additionalProperties": false,
"required": [
@@@ -134996,7 +134996,7 @@
"required": [
"id"
],
-- "description": "The agent or harness that runs it. ID is the product's own agent id or slug; NAME is what a person reads; PRODUCT is the product it comes from (actor, codes, run, chat, …).",
++ "description": "The agent or harness that runs it. ID is the product's own agent id or slug; NAME is what a person reads; PRODUCT is the product it comes from (actor, codes, run, chat, …). GLYPH, HUE and AVATAR_URL are its face; HARNESS is the loop that runs it.",
"properties": {
"id": {
"type": "string",
@@@ -135012,6 +135012,28 @@
"type": "string",
"minLength": 1,
"maxLength": 40
++ },
++ "glyph": {
++ "type": "string",
++ "pattern": "^[a-z][a-z0-9-]{0,40}$",
++ "description": "The agent's face when it has no picture: a glyph from the registry. A chat's persona sets it per run."
++ },
++ "hue": {
++ "type": "integer",
++ "minimum": 0,
++ "maximum": 359,
++ "description": "The hue its face is tinted with."
++ },
++ "avatar_url": {
++ "type": "string",
++ "format": "uri",
++ "maxLength": 2000,
++ "description": "The agent's picture, when it has one."
++ },
++ "harness": {
++ "type": "string",
++ "pattern": "^[a-z][a-z0-9-]{0,59}$",
++ "description": "The loop that runs it: openvibe (the SDK's own), or another harness run through an adapter (codex, claude-code, opencode, deepseek, …)."
}
}
},
@@@ -135099,240 +135121,1210 @@
"minimum": 0
}
}
-- }
-- }
-- }
-- },
-- "agents.step": {
-- "version": "1.0.0",
-- "owner": "actor",
-- "status": "active",
-- "schema": {
-- "$schema": "https://json-schema.org/draft/2020-12/schema",
-- "$id": "https://openvibe.network/contracts/agents/step.v1.json",
-- "title": "AgentsStep",
-- "description": "agents.step@1 (one agent system, 2026-11-12): one entry of a run's append-only step log, as GET /api/v1/runs/{id}/steps returns it and as agents.step.appended@1 publishes it. SEQ is the run's own order (1, 2, …), never renumbered; a reader pages with ?after=SEQ. KIND says what the entry is: think (a plan, a check, a note to self), tool (a tool call or its result), message (words for the person), approval (the run asked), child (a sub-agent or a hand-off) or file (a file the run made). TEXT is what a person reads; TOOL_CALL is the tool's name and input on a tool entry; RESULT is what came back. The product's own event may split a call and its result into two steps: both carry KIND tool and the call's seq is the earlier one. A step carries no credential, no key and no token; a secret a tool saw is redacted before it is stored.",
-- "type": "object",
-- "additionalProperties": false,
-- "required": [
-- "run_id",
-- "seq",
-- "kind",
-- "started_at"
-- ],
-- "properties": {
-- "run_id": {
++ },
++ "title": {
"type": "string",
"minLength": 1,
-- "maxLength": 160,
-- "description": "The run this step belongs to (agents.run@1's id)."
-- },
-- "seq": {
-- "type": "integer",
-- "minimum": 1,
-- "description": "The run's own order for this entry, starting at 1 and never renumbered. ?after=SEQ reads the entries after it."
++ "maxLength": 200,
++ "description": "What a person calls this run: a chat's name, a task's goal in a few words."
},
"kind": {
-- "enum": [
-- "think",
-- "tool",
-- "message",
-- "approval",
-- "child",
-- "file"
++ "type": "string",
++ "pattern": "^[a-z][a-z0-9-]{0,30}$",
++ "description": "What sort of run it is. chat: a conversation that stays open. ask: one question and its answer. task: work an agent does for its person. code: a coding task. machine: a job on a computer or a robot. goal: a standing goal that runs on its own schedule. A product may add its own; a reader treats an unknown kind as task."
++ },
++ "ref": {
++ "type": "string",
++ "maxLength": 200,
++ "pattern": "^[a-z][a-z0-9-]{0,30}:[A-Za-z0-9._~-]{1,160}$",
++ "description": "The run's address on the Frame: its product, a colon, the product's own id (chat:…, codes:tsk_…, actor:tsk_…). /api/frame/runs/{ref} reads it wherever it lives."
++ },
++ "url": {
++ "type": "string",
++ "format": "uri",
++ "maxLength": 2000,
++ "description": "The run's own page on its product."
++ },
++ "model": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "id"
],
-- "description": "think: a plan, a check or reasoning. tool: a tool call or its result. message: words for the person. approval: the run asked its person. child: a sub-agent run or a hand-off. file: a file the run made."
++ "description": "The model that runs it, as the picker chose it (frame.choices@1's choice, with the name a person reads). EFFORT is the reasoning effort where the model has one.",
++ "properties": {
++ "id": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 200,
++ "pattern": "^[A-Za-z0-9._:/@+| -]+$"
++ },
++ "source": {
++ "enum": [
++ "openvibe",
++ "keys",
++ "machines",
++ "plans"
++ ],
++ "description": "openvibe: Exchange's directory, paid in credits. keys: the person's own key. machines: a model on the person's own computer (Link). plans: a signed-in plan through a harness."
++ },
++ "machine": {
++ "type": "string",
++ "maxLength": 40
++ },
++ "name": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 200
++ },
++ "effort": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 40
++ }
++ }
},
-- "text": {
-- "type": [
-- "string",
-- "null"
++ "where": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "kind"
],
-- "maxLength": 65536,
-- "description": "What a person reads for this step: the plan line, the message, the short tool answer or the file's name. Never a prompt or a secret."
++ "description": "Where the run's work happens. openvibe: OpenVibe's own computers. machine: the person's own computer or robot through Link (ID is the device). runner: a Codes runner. this-computer: the machine that serves the run itself (Link's agent serve).",
++ "properties": {
++ "kind": {
++ "enum": [
++ "openvibe",
++ "machine",
++ "runner",
++ "this-computer"
++ ]
++ },
++ "id": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 160
++ },
++ "name": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 200
++ }
++ }
},
-- "tool_call": {
++ "target": {
++ "description": "What a code run works on. new: a new project in the person's own space. openvibe: OpenVibe itself; the orchestrator finds the repositories and opens pull requests, never merges. An object names one repository.",
++ "anyOf": [
++ {
++ "enum": [
++ "new",
++ "openvibe"
++ ]
++ },
++ {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "repo"
++ ],
++ "properties": {
++ "repo": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 300,
++ "description": "owner/name, or the repository's address."
++ },
++ "branch": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 200
++ }
++ }
++ }
++ ]
++ },
++ "doing": {
"type": [
"object",
"null"
],
"additionalProperties": false,
-- "description": "The tool this entry called. On a product that logs a call and its result as two steps, the call names the tool and the result entry has no TOOL_CALL.",
"required": [
-- "name"
++ "text"
],
++ "description": "What the run is doing now, for its agent's face: a few words and a glyph. Null when it is not working.",
"properties": {
-- "name": {
++ "text": {
"type": "string",
"minLength": 1,
-- "maxLength": 160
++ "maxLength": 200
},
-- "input": {
-- "description": "The call's input, as the product recorded it: an object, a short summary string, or null. Credential-shaped fields are already redacted."
++ "glyph": {
++ "type": "string",
++ "pattern": "^[a-z][a-z0-9-]{0,40}$",
++ "description": "A glyph's name in the openvibe-shared glyph registry (openvibe.design/icons). A reader that does not know it draws its default."
}
}
},
-- "result": {
++ "waiting": {
"type": [
-- "string",
"object",
-- "array",
-- "number",
-- "boolean",
"null"
],
-- "description": "What the step answered: a tool's output, a check's verdict, a file's reference. Any JSON; never a credential."
++ "additionalProperties": false,
++ "required": [
++ "for"
++ ],
++ "description": "Why a waiting run waits. message: it is the person's turn to speak (a conversation between turns). approval: it asked before an act (APPROVAL is the agents.approval@1 id). takeover: it met something only its person can do (a sign-in, a code). payment: it needs funds. WHAT says it in words. Null unless STATUS is waiting.",
++ "properties": {
++ "for": {
++ "enum": [
++ "message",
++ "approval",
++ "takeover",
++ "payment"
++ ]
++ },
++ "what": {
++ "type": "string",
++ "maxLength": 500
++ },
++ "approval": {
++ "type": "string",
++ "maxLength": 160
++ },
++ "since": {
++ "type": "string",
++ "format": "date-time"
++ }
++ }
},
-- "cost": {
++ "preview": {
"type": [
"object",
"null"
],
"additionalProperties": false,
-- "description": "What this step spent, when the product meters per step. Null when it meters per run only.",
++ "required": [
++ "text"
++ ],
++ "description": "The last thing said in the run, for a list: the words, who said them and when.",
"properties": {
-- "usd": {
-- "type": "number",
-- "minimum": 0
++ "text": {
++ "type": "string",
++ "maxLength": 500
},
-- "tokens": {
-- "type": "integer",
-- "minimum": 0
++ "from": {
++ "enum": [
++ "person",
++ "agent",
++ "system",
++ "tool"
++ ]
},
-- "seconds": {
-- "type": "number",
-- "minimum": 0
++ "at": {
++ "type": "string",
++ "format": "date-time"
}
}
},
-- "started_at": {
-- "type": "string",
-- "format": "date-time"
-- },
-- "ended_at": {
-- "type": [
-- "string",
-- "null"
-- ],
-- "format": "date-time",
-- "description": "When the step ended, when the product records an end. A product that logs a point event sets it to the event's time; null when the step is still open."
++ "context": {
++ "type": "object",
++ "additionalProperties": false,
++ "description": "Where the run was asked: the site, the page and what the page is about. A run may use it; it never grants access.",
++ "properties": {
++ "site": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 60
++ },
++ "url": {
++ "type": "string",
++ "format": "uri",
++ "maxLength": 2000,
++ "description": "The page's address."
++ },
++ "title": {
++ "type": "string",
++ "maxLength": 300
++ },
++ "kind": {
++ "type": "string",
++ "maxLength": 60
++ },
++ "id": {
++ "type": "string",
++ "maxLength": 160
++ }
++ }
},
-- "child_run": {
-- "type": [
++ "outputs": {
++ "type": "array",
++ "maxItems": 50,
++ "description": "What the run made, newest last: for its card, and for the feed when it is shared.",
++ "items": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "kind",
++ "title"
++ ],
++ "properties": {
++ "kind": {
++ "enum": [
++ "link",
++ "file",
++ "image",
++ "video",
++ "audio",
++ "pr",
++ "repo",
++ "page",
++ "post",
++ "run"
++ ]
++ },
++ "title": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 300
++ },
++ "url": {
++ "type": "string",
++ "format": "uri",
++ "maxLength": 2000,
++ "description": "Where it is."
++ },
++ "thumb": {
++ "type": "string",
++ "format": "uri",
++ "maxLength": 2000,
++ "description": "A small picture of it."
++ },
++ "media_id": {
++ "type": "string",
++ "maxLength": 60
++ },
++ "state": {
++ "type": "string",
++ "maxLength": 40,
++ "description": "A pull request's or a check's state in a word (open, green, red, merged)."
++ }
++ }
++ }
++ },
++ "counts": {
++ "type": "object",
++ "additionalProperties": false,
++ "description": "Counts a list shows without reading the steps.",
++ "properties": {
++ "steps": {
++ "type": "integer",
++ "minimum": 0
++ },
++ "children": {
++ "type": "integer",
++ "minimum": 0
++ },
++ "files": {
++ "type": "integer",
++ "minimum": 0
++ },
++ "approvals": {
++ "type": "integer",
++ "minimum": 0
++ },
++ "unread": {
++ "type": "integer",
++ "minimum": 0
++ }
++ }
++ },
++ "visibility": {
++ "enum": [
++ "private",
++ "shared",
++ "public"
++ ],
++ "description": "Who may read the run: its owner only, people it was shared with, or anyone with its address."
++ },
++ "ended_at": {
++ "type": [
"string",
"null"
],
-- "maxLength": 160,
-- "description": "The child run this step started, on KIND child. Null elsewhere."
++ "format": "date-time",
++ "description": "When the run reached an end status. Null while it has not."
}
}
}
},
-- "agents.approval": {
-- "version": "1.0.0",
++ "agents.step": {
++ "version": "1.1.0",
"owner": "actor",
"status": "active",
"schema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
-- "$id": "https://openvibe.network/contracts/agents/approval.v1.json",
-- "title": "AgentsApproval",
-- "description": "agents.approval@1 (one agent system, 2026-11-12): a run stopped at a step to ask its person before it acts. WHAT is the act in plain words; OPTIONS are the answers the product offers, each with an id and the words a person reads; DECIDED_BY and DECIDED_AT are absent (or null) while it waits; ANSWER is the chosen option's id (or the person's own words, when the product allows them). Nothing the approval covers runs before the answer, and an answer decided once is never decided again. The approval is attached to the run's step (STEP_SEQ), so a step log and an approval list line up. OpenVibe.Actor's approval inbox and OpenVibe.Codes' tool approvals are the same shape; the product keeps the grant.",
++ "$id": "https://openvibe.network/contracts/agents/step.v1.json",
++ "title": "AgentsStep",
++ "description": "agents.step@1 (one agent system, 2026-11-12): one entry of a run's append-only step log, as GET /api/v1/runs/{id}/steps returns it and as agents.step.appended@1 publishes it. SEQ is the run's own order (1, 2, …), never renumbered; a reader pages with ?after=SEQ. KIND says what the entry is: think (a plan, a check, a note to self), tool (a tool call or its result), message (words for the person), approval (the run asked), child (a sub-agent or a hand-off) or file (a file the run made). TEXT is what a person reads; TOOL_CALL is the tool's name and input on a tool entry; RESULT is what came back. The product's own event may split a call and its result into two steps: both carry KIND tool and the call's seq is the earlier one. A step carries no credential, no key and no token; a secret a tool saw is redacted before it is stored. Since 1.1.0 (agent-engine.md) a step also says who spoke (FROM: the person's own words are steps too), whether it is still under way (STATUS), a short TITLE and GLYPH for a tool or a thought, the files that go with it (ATTACHMENTS), numbered SOURCES, a rich card (UI) and, where a computer was used, the DESK picture and action for replay. Every added field is optional.",
"type": "object",
"additionalProperties": false,
"required": [
"run_id",
-- "step_seq",
-- "what",
-- "options"
++ "seq",
++ "kind",
++ "started_at"
],
"properties": {
-- "id": {
-- "type": "string",
-- "minLength": 1,
-- "maxLength": 160,
-- "description": "The product's own approval id (apr_…), when it has one; STEP_SEQ is still the link to the run."
-- },
"run_id": {
"type": "string",
"minLength": 1,
-- "maxLength": 160
++ "maxLength": 160,
++ "description": "The run this step belongs to (agents.run@1's id)."
},
-- "step_seq": {
++ "seq": {
"type": "integer",
"minimum": 1,
-- "description": "The seq of the run's step that asked (agents.step@1's seq)."
++ "description": "The run's own order for this entry, starting at 1 and never renumbered. ?after=SEQ reads the entries after it."
},
-- "what": {
-- "type": "string",
-- "minLength": 1,
-- "maxLength": 2000,
-- "description": "The act in plain words, with its exact target: \"post this to your feed\", \"run rm -rf build on your machine\". Never a raw tool payload."
++ "kind": {
++ "enum": [
++ "think",
++ "tool",
++ "message",
++ "approval",
++ "child",
++ "file"
++ ],
++ "description": "think: a plan, a check or reasoning. tool: a tool call or its result. message: words for the person. approval: the run asked its person. child: a sub-agent run or a hand-off. file: a file the run made."
},
-- "options": {
-- "type": "array",
-- "minItems": 1,
-- "maxItems": 8,
-- "description": "The answers the product offers, in the order to show them. The floor categories (money, a password, a deletion, a new recipient) are asked every time and have no standing permission.",
-- "items": {
-- "type": "object",
-- "additionalProperties": false,
-- "required": [
-- "id",
-- "label"
-- ],
-- "properties": {
-- "id": {
-- "type": "string",
-- "minLength": 1,
-- "maxLength": 80
-- },
-- "label": {
-- "type": "string",
-- "minLength": 1,
-- "maxLength": 80
-- }
++ "text": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "maxLength": 65536,
++ "description": "What a person reads for this step: the plan line, the message, the short tool answer or the file's name. Never a prompt or a secret."
++ },
++ "tool_call": {
++ "type": [
++ "object",
++ "null"
++ ],
++ "additionalProperties": false,
++ "description": "The tool this entry called. On a product that logs a call and its result as two steps, the call names the tool and the result entry has no TOOL_CALL.",
++ "required": [
++ "name"
++ ],
++ "properties": {
++ "name": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 160
++ },
++ "input": {
++ "description": "The call's input, as the product recorded it: an object, a short summary string, or null. Credential-shaped fields are already redacted."
}
}
},
-- "decided_by": {
-- "description": "Who answered: a person subject, a service or an agent.",
-- "anyOf": [
-- {
-- "$ref": "../identity/subject-ref.v1.json"
++ "result": {
++ "type": [
++ "string",
++ "object",
++ "array",
++ "number",
++ "boolean",
++ "null"
++ ],
++ "description": "What the step answered: a tool's output, a check's verdict, a file's reference. Any JSON; never a credential."
++ },
++ "cost": {
++ "type": [
++ "object",
++ "null"
++ ],
++ "additionalProperties": false,
++ "description": "What this step spent, when the product meters per step. Null when it meters per run only.",
++ "properties": {
++ "usd": {
++ "type": "number",
++ "minimum": 0
},
-- {
-- "type": "null"
++ "tokens": {
++ "type": "integer",
++ "minimum": 0
++ },
++ "seconds": {
++ "type": "number",
++ "minimum": 0
}
-- ]
++ }
},
-- "decided_at": {
++ "started_at": {
++ "type": "string",
++ "format": "date-time"
++ },
++ "ended_at": {
"type": [
"string",
"null"
],
-- "format": "date-time"
++ "format": "date-time",
++ "description": "When the step ended, when the product records an end. A product that logs a point event sets it to the event's time; null when the step is still open."
},
-- "answer": {
++ "child_run": {
"type": [
"string",
"null"
],
-- "maxLength": 2000,
-- "description": "The chosen option's id, or the person's own words when the product allows them. Null while it waits."
-- }
-- }
-- }
-- },
-- "agents.step.appended": {
-- "version": "1.0.0",
-- "owner": "actor",
-- "status": "active",
-- "schema": {
-- "$schema": "https://json-schema.org/draft/2020-12/schema",
-- "$id": "https://openvibe.network/contracts/events/payloads/agents.step.appended.v1.json",
-- "title": "AgentsStepAppendedPayload",
-- "description": "agents.step.appended v1 (one agent system, 2026-11-12). A step was appended to a run: the payload is the appended agents.step@1, whole. OpenVibe.Events carries it with the run's owner as the subject, the product that ran it as the source (actor, codes, run, …) and visibility subject; a reader follows a run live without polling the step log. The namespace is agents (hyphen-free: Events namespaces cannot contain a hyphen). One producer per run: the product that stores the run publishes its steps, and the step's own product names the agent.",
-- "$ref": "../../agents/step.v1.json"
++ "maxLength": 160,
++ "description": "The child run this step started, on KIND child. Null elsewhere."
++ },
++ "from": {
++ "enum": [
++ "person",
++ "agent",
++ "system",
++ "tool"
++ ],
++ "description": "Who this entry is from. person: the run's person (their message). agent: the agent. system: the product (a notice, a limit reached). tool: a tool's own words. Absent means agent."
++ },
++ "author": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "name"
++ ],
++ "description": "Who spoke, when a thread has several people or agents: a name and a picture. Absent for the run's own person and agent.",
++ "properties": {
++ "id": {
++ "type": "string",
++ "maxLength": 160
++ },
++ "name": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 160
++ },
++ "avatar_url": {
++ "type": "string",
++ "format": "uri",
++ "maxLength": 2000,
++ "description": "Their picture."
++ }
++ }
++ },
++ "status": {
++ "enum": [
++ "running",
++ "done",
++ "failed"
++ ],
++ "description": "Whether the entry is still under way (a tool that runs, a message being written). Absent means done."
++ },
++ "title": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 200,
++ "description": "The entry in a few words, for a tool or a thought: \"Searching the web\", \"Reading 3 files\"."
++ },
++ "glyph": {
++ "type": "string",
++ "pattern": "^[a-z][a-z0-9-]{0,40}$",
++ "description": "A glyph's name in the openvibe-shared glyph registry (openvibe.design/icons). A reader that does not know it draws its default."
++ },
++ "attachments": {
++ "type": "array",
++ "maxItems": 20,
++ "items": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "kind"
++ ],
++ "description": "A file that goes with a message or a start: by its OpenVibe.Media id, or by an https address.",
++ "properties": {
++ "kind": {
++ "enum": [
++ "image",
++ "file",
++ "audio",
++ "video"
++ ]
++ },
++ "media_id": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 60
++ },
++ "url": {
++ "type": "string",
++ "format": "uri",
++ "maxLength": 2000,
++ "description": "An https address the reader may fetch."
++ },
++ "name": {
++ "type": "string",
++ "maxLength": 300
++ },
++ "mime": {
++ "type": "string",
++ "maxLength": 120
++ },
++ "bytes": {
++ "type": "integer",
++ "minimum": 0
++ },
++ "width": {
++ "type": "integer",
++ "minimum": 1
++ },
++ "height": {
++ "type": "integer",
++ "minimum": 1
++ },
++ "alt": {
++ "type": "string",
++ "maxLength": 500,
++ "description": "What a picture shows, in words."
++ }
++ }
++ }
++ },
++ "sources": {
++ "type": "array",
++ "maxItems": 40,
++ "description": "The sources a message cites, numbered as its text cites them ([1], [2]).",
++ "items": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "n",
++ "url"
++ ],
++ "properties": {
++ "n": {
++ "type": "integer",
++ "minimum": 1
++ },
++ "title": {
++ "type": "string",
++ "maxLength": 300
++ },
++ "url": {
++ "type": "string",
++ "format": "uri",
++ "maxLength": 2000,
++ "description": "The source's address."
++ },
++ "site": {
++ "type": "string",
++ "maxLength": 120
++ }
++ }
++ }
++ },
++ "ui": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "type"
++ ],
++ "description": "A rich card for this entry. TYPE names it (link, table, code, diff, image, choice, timer, repo, desk, run, or a product's own, prefixed with its product: live-clip); DATA is that card's own content. A reader that does not know the type shows TEXT instead, so TEXT always says the same thing in words.",
++ "properties": {
++ "type": {
++ "type": "string",
++ "pattern": "^[a-z][a-z0-9-]{0,40}$"
++ },
++ "data": {
++ "type": "object",
++ "maxProperties": 64
++ }
++ }
++ },
++ "desk": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "id"
++ ],
++ "description": "The computer this step used, for the screen tile and the replay: the desk, the picture it saw and what it did. A secret field is blanked before a still is stored.",
++ "properties": {
++ "id": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 160
++ },
++ "still_url": {
++ "type": "string",
++ "format": "uri",
++ "maxLength": 2000,
++ "description": "The picture the step saw."
++ },
++ "action": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "type"
++ ],
++ "properties": {
++ "type": {
++ "type": "string",
++ "pattern": "^[a-z][a-z0-9-]{0,40}$"
++ },
++ "x": {
++ "type": "number"
++ },
++ "y": {
++ "type": "number"
++ },
++ "text": {
++ "type": "string",
++ "maxLength": 500
++ }
++ }
++ }
++ }
++ }
++ }
++ }
++ },
++ "agents.approval": {
++ "version": "1.0.0",
++ "owner": "actor",
++ "status": "active",
++ "schema": {
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/agents/approval.v1.json",
++ "title": "AgentsApproval",
++ "description": "agents.approval@1 (one agent system, 2026-11-12): a run stopped at a step to ask its person before it acts. WHAT is the act in plain words; OPTIONS are the answers the product offers, each with an id and the words a person reads; DECIDED_BY and DECIDED_AT are absent (or null) while it waits; ANSWER is the chosen option's id (or the person's own words, when the product allows them). Nothing the approval covers runs before the answer, and an answer decided once is never decided again. The approval is attached to the run's step (STEP_SEQ), so a step log and an approval list line up. OpenVibe.Actor's approval inbox and OpenVibe.Codes' tool approvals are the same shape; the product keeps the grant.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "run_id",
++ "step_seq",
++ "what",
++ "options"
++ ],
++ "properties": {
++ "id": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 160,
++ "description": "The product's own approval id (apr_…), when it has one; STEP_SEQ is still the link to the run."
++ },
++ "run_id": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 160
++ },
++ "step_seq": {
++ "type": "integer",
++ "minimum": 1,
++ "description": "The seq of the run's step that asked (agents.step@1's seq)."
++ },
++ "what": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 2000,
++ "description": "The act in plain words, with its exact target: \"post this to your feed\", \"run rm -rf build on your machine\". Never a raw tool payload."
++ },
++ "options": {
++ "type": "array",
++ "minItems": 1,
++ "maxItems": 8,
++ "description": "The answers the product offers, in the order to show them. The floor categories (money, a password, a deletion, a new recipient) are asked every time and have no standing permission.",
++ "items": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "id",
++ "label"
++ ],
++ "properties": {
++ "id": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 80
++ },
++ "label": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 80
++ }
++ }
++ }
++ },
++ "decided_by": {
++ "description": "Who answered: a person subject, a service or an agent.",
++ "anyOf": [
++ {
++ "$ref": "../identity/subject-ref.v1.json"
++ },
++ {
++ "type": "null"
++ }
++ ]
++ },
++ "decided_at": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "format": "date-time"
++ },
++ "answer": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "maxLength": 2000,
++ "description": "The chosen option's id, or the person's own words when the product allows them. Null while it waits."
++ }
++ }
++ }
++ },
++ "agents.step.appended": {
++ "version": "1.0.0",
++ "owner": "actor",
++ "status": "active",
++ "schema": {
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/events/payloads/agents.step.appended.v1.json",
++ "title": "AgentsStepAppendedPayload",
++ "description": "agents.step.appended v1 (one agent system, 2026-11-12). A step was appended to a run: the payload is the appended agents.step@1, whole. OpenVibe.Events carries it with the run's owner as the subject, the product that ran it as the source (actor, codes, run, …) and visibility subject; a reader follows a run live without polling the step log. The namespace is agents (hyphen-free: Events namespaces cannot contain a hyphen). One producer per run: the product that stores the run publishes its steps, and the step's own product names the agent.",
++ "$ref": "../../agents/step.v1.json"
++ }
++ },
++ "agents.run-start": {
++ "version": "1.0.0",
++ "owner": "network",
++ "status": "active",
++ "schema": {
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/agents/run-start.v1.json",
++ "title": "AgentsRunStart",
++ "description": "agents.run-start@1 (agent-engine.md, 2026-11-12): what starts a run, the same on every product's POST /api/v1/runs and on the Frame's POST /api/frame/runs. Only TEXT is required: the goal, the question or the first message, in the person's own words. KIND chooses the sort of run (agents.run@1's kinds); absent, the Frame's orchestrator decides whether to answer, plan, or hand the work to another product as a child run. AGENT names who does it (an agent's id; auto lets the product choose). MODEL and WHERE are the picker's choices; TARGET is a code run's (new, openvibe or a repository); CONTEXT is where it was asked; ATTACHMENTS are files by Media id or address; SOURCES and DEPTH are an answer's (frame.ask@1's); PARENT_RUN makes it a sub-agent's run inside its parent's budget; BUDGET is its own hard limit. An Idempotency-Key header makes a repeated start return the first run.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "text"
++ ],
++ "properties": {
++ "text": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 16000
++ },
++ "title": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 200
++ },
++ "kind": {
++ "type": "string",
++ "pattern": "^[a-z][a-z0-9-]{0,30}$"
++ },
++ "agent": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 160,
++ "description": "An agent's id on the product that will run it, or auto."
++ },
++ "model": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "id"
++ ],
++ "properties": {
++ "id": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 200,
++ "pattern": "^[A-Za-z0-9._:/@+| -]+$"
++ },
++ "source": {
++ "enum": [
++ "openvibe",
++ "keys",
++ "machines",
++ "plans"
++ ],
++ "description": "openvibe: Exchange's directory, paid in credits. keys: the person's own key. machines: a model on the person's own computer (Link). plans: a signed-in plan through a harness."
++ },
++ "machine": {
++ "type": "string",
++ "maxLength": 40
++ },
++ "name": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 200
++ },
++ "effort": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 40
++ }
++ },
++ "description": "The picker's choice (frame.choices@1). Absent: the person's default for this kind of work."
++ },
++ "where": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "kind"
++ ],
++ "description": "Where the run's work happens. openvibe: OpenVibe's own computers. machine: the person's own computer or robot through Link (ID is the device). runner: a Codes runner. this-computer: the machine that serves the run itself (Link's agent serve).",
++ "properties": {
++ "kind": {
++ "enum": [
++ "openvibe",
++ "machine",
++ "runner",
++ "this-computer"
++ ]
++ },
++ "id": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 160
++ },
++ "name": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 200
++ }
++ }
++ },
++ "target": {
++ "description": "What a code run works on. new: a new project in the person's own space. openvibe: OpenVibe itself; the orchestrator finds the repositories and opens pull requests, never merges. An object names one repository.",
++ "anyOf": [
++ {
++ "enum": [
++ "new",
++ "openvibe"
++ ]
++ },
++ {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "repo"
++ ],
++ "properties": {
++ "repo": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 300,
++ "description": "owner/name, or the repository's address."
++ },
++ "branch": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 200
++ }
++ }
++ }
++ ]
++ },
++ "context": {
++ "type": "object",
++ "additionalProperties": false,
++ "description": "Where the run was asked: the site, the page and what the page is about. A run may use it; it never grants access.",
++ "properties": {
++ "site": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 60
++ },
++ "url": {
++ "type": "string",
++ "format": "uri",
++ "maxLength": 2000,
++ "description": "The page's address."
++ },
++ "title": {
++ "type": "string",
++ "maxLength": 300
++ },
++ "kind": {
++ "type": "string",
++ "maxLength": 60
++ },
++ "id": {
++ "type": "string",
++ "maxLength": 160
++ }
++ }
++ },
++ "attachments": {
++ "type": "array",
++ "maxItems": 20,
++ "items": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "kind"
++ ],
++ "description": "A file that goes with a message or a start: by its OpenVibe.Media id, or by an https address.",
++ "properties": {
++ "kind": {
++ "enum": [
++ "image",
++ "file",
++ "audio",
++ "video"
++ ]
++ },
++ "media_id": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 60
++ },
++ "url": {
++ "type": "string",
++ "format": "uri",
++ "maxLength": 2000,
++ "description": "An https address the reader may fetch."
++ },
++ "name": {
++ "type": "string",
++ "maxLength": 300
++ },
++ "mime": {
++ "type": "string",
++ "maxLength": 120
++ },
++ "bytes": {
++ "type": "integer",
++ "minimum": 0
++ },
++ "width": {
++ "type": "integer",
++ "minimum": 1
++ },
++ "height": {
++ "type": "integer",
++ "minimum": 1
++ },
++ "alt": {
++ "type": "string",
++ "maxLength": 500,
++ "description": "What a picture shows, in words."
++ }
++ }
++ }
++ },
++ "sources": {
++ "type": "array",
++ "maxItems": 4,
++ "uniqueItems": true,
++ "items": {
++ "enum": [
++ "web",
++ "openvibe",
++ "mine",
++ "page"
++ ]
++ }
++ },
++ "depth": {
++ "enum": [
++ "quick",
++ "balanced",
++ "deep"
++ ]
++ },
++ "parent_run": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 160
++ },
++ "budget": {
++ "type": "object",
++ "additionalProperties": false,
++ "description": "The hard limit the run may not exceed. A field that is absent is not limited. USD is money; TOKENS counts model tokens in and out; SECONDS is wall time; STEPS counts the appended steps.",
++ "properties": {
++ "usd": {
++ "type": "number",
++ "minimum": 0
++ },
++ "tokens": {
++ "type": "integer",
++ "minimum": 0
++ },
++ "seconds": {
++ "type": "number",
++ "minimum": 0
++ },
++ "steps": {
++ "type": "integer",
++ "minimum": 1
++ }
++ }
++ }
++ }
++ }
++ },
++ "agents.event": {
++ "version": "1.0.0",
++ "owner": "network",
++ "status": "active",
++ "schema": {
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/agents/event.v1.json",
++ "title": "AgentsEvent",
++ "description": "agents.event@1 (agent-engine.md, 2026-11-12): one event of a run's stream, GET /api/v1/runs/{id}/events (and /api/frame/runs/{ref}/events), as server-sent events whose event name is TYPE and whose id is the newest step's seq, so Last-Event-ID resumes after it. run: the run changed; RUN is its new snapshot. step: a step was appended; STEP is it, whole. delta: more TEXT for the step SEQ that is still being written (its STATUS is running); a reader appends it. approval: an approval was asked or answered; APPROVAL is it. end: the run reached an end status; the stream closes after it. A reader ignores a type it does not know.",
++ "type": "object",
++ "required": [
++ "type"
++ ],
++ "properties": {
++ "type": {
++ "enum": [
++ "run",
++ "step",
++ "delta",
++ "approval",
++ "end"
++ ]
++ },
++ "run": {
++ "$ref": "run.v1.json"
++ },
++ "step": {
++ "$ref": "step.v1.json"
++ },
++ "approval": {
++ "$ref": "approval.v1.json"
++ },
++ "run_id": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 160
++ },
++ "seq": {
++ "type": "integer",
++ "minimum": 1
++ },
++ "text": {
++ "type": "string",
++ "maxLength": 65536
++ },
++ "status": {
++ "enum": [
++ "done",
++ "failed",
++ "stopped"
++ ]
++ }
++ },
++ "additionalProperties": false,
++ "allOf": [
++ {
++ "if": {
++ "properties": {
++ "type": {
++ "const": "run"
++ }
++ },
++ "required": [
++ "type"
++ ]
++ },
++ "then": {
++ "required": [
++ "run"
++ ]
++ }
++ },
++ {
++ "if": {
++ "properties": {
++ "type": {
++ "const": "step"
++ }
++ },
++ "required": [
++ "type"
++ ]
++ },
++ "then": {
++ "required": [
++ "step"
++ ]
++ }
++ },
++ {
++ "if": {
++ "properties": {
++ "type": {
++ "const": "delta"
++ }
++ },
++ "required": [
++ "type"
++ ]
++ },
++ "then": {
++ "required": [
++ "run_id",
++ "seq",
++ "text"
++ ]
++ }
++ },
++ {
++ "if": {
++ "properties": {
++ "type": {
++ "const": "approval"
++ }
++ },
++ "required": [
++ "type"
++ ]
++ },
++ "then": {
++ "required": [
++ "approval"
++ ]
++ }
++ },
++ {
++ "if": {
++ "properties": {
++ "type": {
++ "const": "end"
++ }
++ },
++ "required": [
++ "type"
++ ]
++ },
++ "then": {
++ "required": [
++ "run_id",
++ "status"
++ ]
++ }
++ }
++ ]
++ }
++ },
++ "agents.run.updated": {
++ "version": "1.0.0",
++ "owner": "actor",
++ "status": "active",
++ "schema": {
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/events/payloads/agents.run.updated.v1.json",
++ "title": "AgentsRunUpdatedPayload",
++ "description": "agents.run.updated v1 (agent-engine.md, 2026-11-12). A run changed in a way a list shows: it started, its status, title, doing, waiting or preview changed, or it ended. The payload is the run's agents.run@1 snapshot, whole. OpenVibe.Events carries it with the run's owner as the subject, the product that stores it as the source and visibility subject, so the person's run list anywhere stays current without polling. A step is agents.step.appended; this event is not sent for every step, only when the snapshot a list draws changed (at most about once a second per run).",
++ "$ref": "../../agents/run.v1.json"
}
}
}
ddiff --git a/generated/openapi/actor.json b/generated/openapi/actor.json
iindex ba756373..0c31e2f1 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.413.0",
-- "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.413.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.414.0",
++ "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.414.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 1c3dbcfd..0039a9e9 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.413.0",
-- "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.413.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.414.0",
++ "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.414.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 270a9370..ad6a17f6 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.413.0",
-- "description": "Routes of OpenVibe.Bench as the OpenVibe contracts describe them (openvibe-contracts 0.413.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.414.0",
++ "description": "Routes of OpenVibe.Bench as the OpenVibe contracts describe them (openvibe-contracts 0.414.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 91530e8a..f092200c 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.413.0",
-- "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.413.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.414.0",
++ "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.414.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 371186d0..0a9afb64 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.413.0",
-- "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.413.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.414.0",
++ "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.414.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 9e2f514e..94bd6a65 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.413.0",
-- "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.413.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.414.0",
++ "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.414.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 4e5cf594..5a6e5366 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.413.0",
-- "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.413.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.414.0",
++ "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.414.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 d8cbc380..8f016776 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.413.0",
-- "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.413.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.414.0",
++ "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.414.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 bcb4c8a8..c35c4a60 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.413.0",
-- "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.413.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.414.0",
++ "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.414.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/connect.json b/generated/openapi/connect.json
iindex cd77c5ad..a7ac4262 100644
---- a/generated/openapi/connect.json
++++ b/generated/openapi/connect.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe Connect API",
-- "version": "0.413.0",
-- "description": "Routes of OpenVibe Connect as the OpenVibe contracts describe them (openvibe-contracts 0.413.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.414.0",
++ "description": "Routes of OpenVibe Connect as the OpenVibe contracts describe them (openvibe-contracts 0.414.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 52b67aed..2006fd24 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.413.0",
-- "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.413.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.414.0",
++ "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.414.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 c7dfedbe..6f610da4 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.413.0",
-- "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.413.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.414.0",
++ "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.414.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/design.json b/generated/openapi/design.json
iindex e11608da..42d47979 100644
---- a/generated/openapi/design.json
++++ b/generated/openapi/design.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Design API",
-- "version": "0.413.0",
-- "description": "Routes of OpenVibe.Design as the OpenVibe contracts describe them (openvibe-contracts 0.413.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.414.0",
++ "description": "Routes of OpenVibe.Design as the OpenVibe contracts describe them (openvibe-contracts 0.414.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 2367ec48..7d4194c4 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.413.0",
-- "description": "Routes of OpenVibe.Domains as the OpenVibe contracts describe them (openvibe-contracts 0.413.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.414.0",
++ "description": "Routes of OpenVibe.Domains as the OpenVibe contracts describe them (openvibe-contracts 0.414.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 3a7c654d..dd7c1d14 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.413.0",
-- "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.413.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.414.0",
++ "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.414.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/exchange.json b/generated/openapi/exchange.json
iindex de57437c..a428b11f 100644
---- a/generated/openapi/exchange.json
++++ b/generated/openapi/exchange.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Exchange API",
-- "version": "0.413.0",
-- "description": "Routes of OpenVibe.Exchange as the OpenVibe contracts describe them (openvibe-contracts 0.413.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.414.0",
++ "description": "Routes of OpenVibe.Exchange as the OpenVibe contracts describe them (openvibe-contracts 0.414.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 e23ac0fa..65e726c2 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.413.0",
-- "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.413.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.414.0",
++ "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.414.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 72c5a7c2..14281362 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.413.0",
-- "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.413.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.414.0",
++ "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.414.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/git.json b/generated/openapi/git.json
iindex 084482d8..854777f9 100644
---- a/generated/openapi/git.json
++++ b/generated/openapi/git.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Git API",
-- "version": "0.413.0",
-- "description": "Routes of OpenVibe.Git as the OpenVibe contracts describe them (openvibe-contracts 0.413.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.414.0",
++ "description": "Routes of OpenVibe.Git as the OpenVibe contracts describe them (openvibe-contracts 0.414.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 69e3c318..90598156 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.413.0",
-- "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.413.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.414.0",
++ "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.414.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/inventory.json b/generated/openapi/inventory.json
iindex d60a3514..f403cb48 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.413.0",
-- "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.413.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.414.0",
++ "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.414.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 628a7b19..ecfbe704 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.413.0",
-- "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.413.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.414.0",
++ "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.414.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/mail.json b/generated/openapi/mail.json
iindex a78978f9..5e0a1701 100644
---- a/generated/openapi/mail.json
++++ b/generated/openapi/mail.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Mail API",
-- "version": "0.413.0",
-- "description": "Routes of OpenVibe.Mail as the OpenVibe contracts describe them (openvibe-contracts 0.413.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.414.0",
++ "description": "Routes of OpenVibe.Mail as the OpenVibe contracts describe them (openvibe-contracts 0.414.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/media-hub.json b/generated/openapi/media-hub.json
iindex cb59170d..89831ed1 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.413.0",
-- "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.413.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.414.0",
++ "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.414.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 ee2bc2cd..da57e0b9 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.413.0",
-- "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.413.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.414.0",
++ "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.414.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 1086f8ba..faaf4897 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.413.0",
-- "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.413.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.414.0",
++ "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.414.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 03846b0c..beaf0a70 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.413.0",
-- "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.413.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.414.0",
++ "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.414.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 3949ab58..61ff1a32 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.413.0",
-- "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.413.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.414.0",
++ "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.414.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 123b7134..e6a98381 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.413.0",
-- "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.413.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.414.0",
++ "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.414.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 e0c14442..bc7121d4 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.413.0",
-- "description": "Routes of OpenVibe.Quest as the OpenVibe contracts describe them (openvibe-contracts 0.413.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.414.0",
++ "description": "Routes of OpenVibe.Quest as the OpenVibe contracts describe them (openvibe-contracts 0.414.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 ae8fc420..f4eb280b 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.413.0",
-- "description": "Routes of OpenVibe.Report as the OpenVibe contracts describe them (openvibe-contracts 0.413.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.414.0",
++ "description": "Routes of OpenVibe.Report as the OpenVibe contracts describe them (openvibe-contracts 0.414.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 1723baa0..0e577f7e 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.413.0",
-- "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.413.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.414.0",
++ "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.414.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 441c50ac..e4084446 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.413.0",
-- "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.413.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.414.0",
++ "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.414.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 f7232424..7ca4dcc8 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.413.0",
-- "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.413.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.414.0",
++ "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.414.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 93fd16df..d48d90cd 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.413.0",
-- "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.413.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.414.0",
++ "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.414.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 398cbee8..3967bf59 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.413.0",
-- "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.413.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.414.0",
++ "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.414.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 92a06eba..e1381bd0 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.413.0",
-- "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.413.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.414.0",
++ "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.414.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 2e5c289a..92a050cc 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.413.0",
-- "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.413.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.414.0",
++ "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.414.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 43531132..6812352f 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.413.0",
-- "description": "Routes of OpenVibe.Today as the OpenVibe contracts describe them (openvibe-contracts 0.413.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.414.0",
++ "description": "Routes of OpenVibe.Today as the OpenVibe contracts describe them (openvibe-contracts 0.414.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 ff392083..57cbc438 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.413.0",
-- "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.413.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.414.0",
++ "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.414.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 84fa77e1..5bee18c7 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.413.0",
-- "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.413.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.414.0",
++ "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.414.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 664b517a..2a562ff5 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.413.0",
-- "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.413.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.414.0",
++ "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.414.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 3d185958..11cbc858 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.413.0",
-- "description": "Routes of OpenVibe.Vision as the OpenVibe contracts describe them (openvibe-contracts 0.413.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.414.0",
++ "description": "Routes of OpenVibe.Vision as the OpenVibe contracts describe them (openvibe-contracts 0.414.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 d7c8500f..c4be024c 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.413.0",
-- "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.413.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.414.0",
++ "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.414.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 696b760a..674f599f 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.413.0",
-- "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.413.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.414.0",
++ "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.414.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 678d70d0..285a73a8 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.413.0",
-- "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.413.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.414.0",
++ "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.414.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 350e88e1..199a4963 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.413.0",
-- "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.413.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.414.0",
++ "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.414.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 179f52d3..9403113d 100644
---- a/generated/typescript/index.d.ts
++++ b/generated/typescript/index.d.ts
@@@ -342488,9 +342488,9 @@ export interface FrameMentions {
];
}
--/** [email protected] (owner: actor) */
++/** [email protected] (owner: actor) */
/**
-- * agents.run@1 (one agent system, 2026-11-12): one run of an agent, the same shape on every product (Actor, Codes, Run and anything else on openvibe-sdk/agents). The owner is the person or agent the work belongs to; AGENT names the agent or harness that runs it and the product it comes from; PARENT_RUN makes sub-agent runs a tree; BUDGET is the hard limit and COST what the run has spent; STATUS is where the run is now. The run is stored by its product, not here: this contract is the wire shape. GET /api/v1/runs, /api/v1/runs/{id} and /api/v1/runs/{id}/steps serve it (OpenVibe.Actor) and the SDK's runs client reads it. The product's own id is kept, never reused. A run that ends keeps its end status. This v1 contract may grow optional fields; a step is agents.step@1 and an approval is agents.approval@1.
++ * agents.run@1 (one agent system, 2026-11-12): one run of an agent, the same shape on every product (Actor, Codes, Run and anything else on openvibe-sdk/agents). The owner is the person or agent the work belongs to; AGENT names the agent or harness that runs it and the product it comes from; PARENT_RUN makes sub-agent runs a tree; BUDGET is the hard limit and COST what the run has spent; STATUS is where the run is now. The run is stored by its product, not here: this contract is the wire shape. GET /api/v1/runs, /api/v1/runs/{id} and /api/v1/runs/{id}/steps serve it (OpenVibe.Actor) and the SDK's runs client reads it. The product's own id is kept, never reused. A run that ends keeps its end status. Since 1.1.0 (agent-engine.md) a run also says what a person calls it (TITLE), what sort it is (KIND), where it lives (REF on the Frame, URL on its product), which model runs it and where, what it is doing now (DOING), what it waits for (WAITING), its last line (PREVIEW), where it was asked (CONTEXT) and what it made (OUTPUTS); a chat with Vibe is a run of KIND chat that is waiting for a message. Every added field is optional. This v1 contract may grow optional fields; a step is agents.step@1 and an approval is agents.approval@1.
*/
export interface AgentsRun {
/**
@@@ -342502,12 +342502,28 @@ export interface AgentsRun {
*/
owner: SubjectRef;
/**
-- * The agent or harness that runs it. ID is the product's own agent id or slug; NAME is what a person reads; PRODUCT is the product it comes from (actor, codes, run, chat, …).
++ * The agent or harness that runs it. ID is the product's own agent id or slug; NAME is what a person reads; PRODUCT is the product it comes from (actor, codes, run, chat, …). GLYPH, HUE and AVATAR_URL are its face; HARNESS is the loop that runs it.
*/
agent: {
id: string;
name?: string;
product?: string;
++ /**
++ * The agent's face when it has no picture: a glyph from the registry. A chat's persona sets it per run.
++ */
++ glyph?: string;
++ /**
++ * The hue its face is tinted with.
++ */
++ hue?: number;
++ /**
++ * The agent's picture, when it has one.
++ */
++ avatar_url?: string;
++ /**
++ * The loop that runs it: openvibe (the SDK's own), or another harness run through an adapter (codex, claude-code, opencode, deepseek, …).
++ */
++ harness?: string;
};
/**
* The run that started this one (a sub-agent), or null. The parent's run card nests children; the child's budget is a slice of the parent's.
@@@ -342544,11 +342560,140 @@ export interface AgentsRun {
seconds?: number;
steps?: number;
} | null;
++ /**
++ * What a person calls this run: a chat's name, a task's goal in a few words.
++ */
++ title?: string;
++ /**
++ * What sort of run it is. chat: a conversation that stays open. ask: one question and its answer. task: work an agent does for its person. code: a coding task. machine: a job on a computer or a robot. goal: a standing goal that runs on its own schedule. A product may add its own; a reader treats an unknown kind as task.
++ */
++ kind?: string;
++ /**
++ * The run's address on the Frame: its product, a colon, the product's own id (chat:…, codes:tsk_…, actor:tsk_…). /api/frame/runs/{ref} reads it wherever it lives.
++ */
++ ref?: string;
++ /**
++ * The run's own page on its product.
++ */
++ url?: string;
++ /**
++ * The model that runs it, as the picker chose it (frame.choices@1's choice, with the name a person reads). EFFORT is the reasoning effort where the model has one.
++ */
++ model?: {
++ id: string;
++ /**
++ * openvibe: Exchange's directory, paid in credits. keys: the person's own key. machines: a model on the person's own computer (Link). plans: a signed-in plan through a harness.
++ */
++ source?: "openvibe" | "keys" | "machines" | "plans";
++ machine?: string;
++ name?: string;
++ effort?: string;
++ };
++ /**
++ * Where the run's work happens. openvibe: OpenVibe's own computers. machine: the person's own computer or robot through Link (ID is the device). runner: a Codes runner. this-computer: the machine that serves the run itself (Link's agent serve).
++ */
++ where?: {
++ kind: "openvibe" | "machine" | "runner" | "this-computer";
++ id?: string;
++ name?: string;
++ };
++ /**
++ * What a code run works on. new: a new project in the person's own space. openvibe: OpenVibe itself; the orchestrator finds the repositories and opens pull requests, never merges. An object names one repository.
++ */
++ target?:
++ | ("new" | "openvibe")
++ | {
++ /**
++ * owner/name, or the repository's address.
++ */
++ repo: string;
++ branch?: string;
++ };
++ /**
++ * What the run is doing now, for its agent's face: a few words and a glyph. Null when it is not working.
++ */
++ doing?: {
++ text: string;
++ /**
++ * A glyph's name in the openvibe-shared glyph registry (openvibe.design/icons). A reader that does not know it draws its default.
++ */
++ glyph?: string;
++ } | null;
++ /**
++ * Why a waiting run waits. message: it is the person's turn to speak (a conversation between turns). approval: it asked before an act (APPROVAL is the agents.approval@1 id). takeover: it met something only its person can do (a sign-in, a code). payment: it needs funds. WHAT says it in words. Null unless STATUS is waiting.
++ */
++ waiting?: {
++ for: "message" | "approval" | "takeover" | "payment";
++ what?: string;
++ approval?: string;
++ since?: string;
++ } | null;
++ /**
++ * The last thing said in the run, for a list: the words, who said them and when.
++ */
++ preview?: {
++ text: string;
++ from?: "person" | "agent" | "system" | "tool";
++ at?: string;
++ } | null;
++ /**
++ * Where the run was asked: the site, the page and what the page is about. A run may use it; it never grants access.
++ */
++ context?: {
++ site?: string;
++ /**
++ * The page's address.
++ */
++ url?: string;
++ title?: string;
++ kind?: string;
++ id?: string;
++ };
++ /**
++ * What the run made, newest last: for its card, and for the feed when it is shared.
++ *
++ * @maxItems 50
++ */
++ outputs?: {
++ kind: "link" | "file" | "image" | "video" | "audio" | "pr" | "repo" | "page" | "post" | "run";
++ title: string;
++ /**
++ * Where it is.
++ */
++ url?: string;
++ /**
++ * A small picture of it.
++ */
++ thumb?: string;
++ media_id?: string;
++ /**
++ * A pull request's or a check's state in a word (open, green, red, merged).
++ */
++ state?: string;
++ }[];
++ /**
++ * Counts a list shows without reading the steps.
++ */
++ counts?: {
++ steps?: number;
++ children?: number;
++ files?: number;
++ approvals?: number;
++ unread?: number;
++ };
++ /**
++ * Who may read the run: its owner only, people it was shared with, or anyone with its address.
++ */
++ visibility?: "private" | "shared" | "public";
++ /**
++ * When the run reached an end status. Null while it has not.
++ */
++ ended_at?: string | null;
}
--/** [email protected] (owner: actor) */
++/** [email protected] (owner: actor) */
/**
-- * agents.step@1 (one agent system, 2026-11-12): one entry of a run's append-only step log, as GET /api/v1/runs/{id}/steps returns it and as agents.step.appended@1 publishes it. SEQ is the run's own order (1, 2, …), never renumbered; a reader pages with ?after=SEQ. KIND says what the entry is: think (a plan, a check, a note to self), tool (a tool call or its result), message (words for the person), approval (the run asked), child (a sub-agent or a hand-off) or file (a file the run made). TEXT is what a person reads; TOOL_CALL is the tool's name and input on a tool entry; RESULT is what came back. The product's own event may split a call and its result into two steps: both carry KIND tool and the call's seq is the earlier one. A step carries no credential, no key and no token; a secret a tool saw is redacted before it is stored.
++ * agents.step@1 (one agent system, 2026-11-12): one entry of a run's append-only step log, as GET /api/v1/runs/{id}/steps returns it and as agents.step.appended@1 publishes it. SEQ is the run's own order (1, 2, …), never renumbered; a reader pages with ?after=SEQ. KIND says what the entry is: think (a plan, a check, a note to self), tool (a tool call or its result), message (words for the person), approval (the run asked), child (a sub-agent or a hand-off) or file (a file the run made). TEXT is what a person reads; TOOL_CALL is the tool's name and input on a tool entry; RESULT is what came back. The product's own event may split a call and its result into two steps: both carry KIND tool and the call's seq is the earlier one. A step carries no credential, no key and no token; a secret a tool saw is redacted before it is stored. Since 1.1.0 (agent-engine.md) a step also says who spoke (FROM: the person's own words are steps too), whether it is still under way (STATUS), a short TITLE and GLYPH for a tool or a thought, the files that go with it (ATTACHMENTS), numbered SOURCES, a rich card (UI) and, where a computer was used, the DESK picture and action for replay. Every added field is optional.
*/
export interface AgentsStep {
/**
@@@ -342600,256 +342745,11534 @@ export interface AgentsStep {
* The child run this step started, on KIND child. Null elsewhere.
*/
child_run?: string | null;
--}
--
--/** [email protected] (owner: actor) */
--/**
-- * agents.approval@1 (one agent system, 2026-11-12): a run stopped at a step to ask its person before it acts. WHAT is the act in plain words; OPTIONS are the answers the product offers, each with an id and the words a person reads; DECIDED_BY and DECIDED_AT are absent (or null) while it waits; ANSWER is the chosen option's id (or the person's own words, when the product allows them). Nothing the approval covers runs before the answer, and an answer decided once is never decided again. The approval is attached to the run's step (STEP_SEQ), so a step log and an approval list line up. OpenVibe.Actor's approval inbox and OpenVibe.Codes' tool approvals are the same shape; the product keeps the grant.
-- */
--export interface AgentsApproval {
/**
-- * The product's own approval id (apr_…), when it has one; STEP_SEQ is still the link to the run.
++ * Who this entry is from. person: the run's person (their message). agent: the agent. system: the product (a notice, a limit reached). tool: a tool's own words. Absent means agent.
*/
-- id?: string;
-- run_id: string;
++ from?: "person" | "agent" | "system" | "tool";
/**
-- * The seq of the run's step that asked (agents.step@1's seq).
++ * Who spoke, when a thread has several people or agents: a name and a picture. Absent for the run's own person and agent.
*/
-- step_seq: number;
++ author?: {
++ id?: string;
++ name: string;
++ /**
++ * Their picture.
++ */
++ avatar_url?: string;
++ };
/**
-- * The act in plain words, with its exact target: "post this to your feed", "run rm -rf build on your machine". Never a raw tool payload.
++ * Whether the entry is still under way (a tool that runs, a message being written). Absent means done.
*/
-- what: string;
++ status?: "running" | "done" | "failed";
/**
-- * The answers the product offers, in the order to show them. The floor categories (money, a password, a deletion, a new recipient) are asked every time and have no standing permission.
-- *
-- * @minItems 1
-- * @maxItems 8
++ * The entry in a few words, for a tool or a thought: "Searching the web", "Reading 3 files".
*/
-- options:
++ title?: string;
++ /**
++ * A glyph's name in the openvibe-shared glyph registry (openvibe.design/icons). A reader that does not know it draws its default.
++ */
++ glyph?: string;
++ /**
++ * @maxItems 20
++ */
++ attachments?:
++ | []
| [
{
-- id: string;
-- label: string;
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
}
]
| [
{
-- id: string;
-- label: string;
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
},
{
-- id: string;
-- label: string;
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
}
]
| [
{
-- id: string;
-- label: string;
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
},
{
-- id: string;
-- label: string;
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
},
{
-- id: string;
-- label: string;
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
}
]
| [
{
-- id: string;
-- label: string;
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
},
{
-- id: string;
-- label: string;
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
},
{
-- id: string;
-- label: string;
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
},
{
-- id: string;
-- label: string;
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
}
]
| [
{
-- id: string;
-- label: string;
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
},
{
-- id: string;
-- label: string;
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
},
{
-- id: string;
-- label: string;
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
},
{
-- id: string;
-- label: string;
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
},
{
-- id: string;
-- label: string;
-- }
-- ]
-- | [
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ }
++ ]
++ | [
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ }
++ ]
++ | [
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ }
++ ]
++ | [
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ }
++ ]
++ | [
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ }
++ ]
++ | [
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ }
++ ]
++ | [
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ }
++ ]
++ | [
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ }
++ ]
++ | [
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ }
++ ]
++ | [
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ }
++ ]
++ | [
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ }
++ ]
++ | [
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ }
++ ]
++ | [
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ }
++ ]
++ | [
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ }
++ ]
++ | [
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ }
++ ]
++ | [
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ }
++ ];
++ /**
++ * The sources a message cites, numbered as its text cites them ([1], [2]).
++ *
++ * @maxItems 40
++ */
++ sources?: {
++ n: number;
++ title?: string;
++ /**
++ * The source's address.
++ */
++ url: string;
++ site?: string;
++ }[];
++ /**
++ * A rich card for this entry. TYPE names it (link, table, code, diff, image, choice, timer, repo, desk, run, or a product's own, prefixed with its product: live-clip); DATA is that card's own content. A reader that does not know the type shows TEXT instead, so TEXT always says the same thing in words.
++ */
++ ui?: {
++ type: string;
++ data?: {};
++ };
++ /**
++ * The computer this step used, for the screen tile and the replay: the desk, the picture it saw and what it did. A secret field is blanked before a still is stored.
++ */
++ desk?: {
++ id: string;
++ /**
++ * The picture the step saw.
++ */
++ still_url?: string;
++ action?: {
++ type: string;
++ x?: number;
++ y?: number;
++ text?: string;
++ };
++ };
++}
++
++/** [email protected] (owner: actor) */
++/**
++ * agents.approval@1 (one agent system, 2026-11-12): a run stopped at a step to ask its person before it acts. WHAT is the act in plain words; OPTIONS are the answers the product offers, each with an id and the words a person reads; DECIDED_BY and DECIDED_AT are absent (or null) while it waits; ANSWER is the chosen option's id (or the person's own words, when the product allows them). Nothing the approval covers runs before the answer, and an answer decided once is never decided again. The approval is attached to the run's step (STEP_SEQ), so a step log and an approval list line up. OpenVibe.Actor's approval inbox and OpenVibe.Codes' tool approvals are the same shape; the product keeps the grant.
++ */
++export interface AgentsApproval {
++ /**
++ * The product's own approval id (apr_…), when it has one; STEP_SEQ is still the link to the run.
++ */
++ id?: string;
++ run_id: string;
++ /**
++ * The seq of the run's step that asked (agents.step@1's seq).
++ */
++ step_seq: number;
++ /**
++ * The act in plain words, with its exact target: "post this to your feed", "run rm -rf build on your machine". Never a raw tool payload.
++ */
++ what: string;
++ /**
++ * The answers the product offers, in the order to show them. The floor categories (money, a password, a deletion, a new recipient) are asked every time and have no standing permission.
++ *
++ * @minItems 1
++ * @maxItems 8
++ */
++ options:
++ | [
++ {
++ id: string;
++ label: string;
++ }
++ ]
++ | [
++ {
++ id: string;
++ label: string;
++ },
++ {
++ id: string;
++ label: string;
++ }
++ ]
++ | [
++ {
++ id: string;
++ label: string;
++ },
++ {
++ id: string;
++ label: string;
++ },
++ {
++ id: string;
++ label: string;
++ }
++ ]
++ | [
++ {
++ id: string;
++ label: string;
++ },
++ {
++ id: string;
++ label: string;
++ },
++ {
++ id: string;
++ label: string;
++ },
++ {
++ id: string;
++ label: string;
++ }
++ ]
++ | [
++ {
++ id: string;
++ label: string;
++ },
++ {
++ id: string;
++ label: string;
++ },
++ {
++ id: string;
++ label: string;
++ },
++ {
++ id: string;
++ label: string;
++ },
++ {
++ id: string;
++ label: string;
++ }
++ ]
++ | [
++ {
++ id: string;
++ label: string;
++ },
++ {
++ id: string;
++ label: string;
++ },
++ {
++ id: string;
++ label: string;
++ },
++ {
++ id: string;
++ label: string;
++ },
++ {
++ id: string;
++ label: string;
++ },
++ {
++ id: string;
++ label: string;
++ }
++ ]
++ | [
++ {
++ id: string;
++ label: string;
++ },
++ {
++ id: string;
++ label: string;
++ },
++ {
++ id: string;
++ label: string;
++ },
++ {
++ id: string;
++ label: string;
++ },
++ {
++ id: string;
++ label: string;
++ },
++ {
++ id: string;
++ label: string;
++ },
++ {
++ id: string;
++ label: string;
++ }
++ ]
++ | [
++ {
++ id: string;
++ label: string;
++ },
++ {
++ id: string;
++ label: string;
++ },
++ {
++ id: string;
++ label: string;
++ },
++ {
++ id: string;
++ label: string;
++ },
++ {
++ id: string;
++ label: string;
++ },
++ {
++ id: string;
++ label: string;
++ },
++ {
++ id: string;
++ label: string;
++ },
++ {
++ id: string;
++ label: string;
++ }
++ ];
++ /**
++ * Who answered: a person subject, a service or an agent.
++ */
++ decided_by?: SubjectRef | null;
++ decided_at?: string | null;
++ /**
++ * The chosen option's id, or the person's own words when the product allows them. Null while it waits.
++ */
++ answer?: string | null;
++}
++
++/** [email protected] (owner: actor) */
++/**
++ * agents.step.appended v1 (one agent system, 2026-11-12). A step was appended to a run: the payload is the appended agents.step@1, whole. OpenVibe.Events carries it with the run's owner as the subject, the product that ran it as the source (actor, codes, run, …) and visibility subject; a reader follows a run live without polling the step log. The namespace is agents (hyphen-free: Events namespaces cannot contain a hyphen). One producer per run: the product that stores the run publishes its steps, and the step's own product names the agent.
++ */
++export interface AgentsStepAppendedPayload {
++ /**
++ * The run this step belongs to (agents.run@1's id).
++ */
++ run_id: string;
++ /**
++ * The run's own order for this entry, starting at 1 and never renumbered. ?after=SEQ reads the entries after it.
++ */
++ seq: number;
++ /**
++ * think: a plan, a check or reasoning. tool: a tool call or its result. message: words for the person. approval: the run asked its person. child: a sub-agent run or a hand-off. file: a file the run made.
++ */
++ kind: "think" | "tool" | "message" | "approval" | "child" | "file";
++ /**
++ * What a person reads for this step: the plan line, the message, the short tool answer or the file's name. Never a prompt or a secret.
++ */
++ text?: string | null;
++ /**
++ * The tool this entry called. On a product that logs a call and its result as two steps, the call names the tool and the result entry has no TOOL_CALL.
++ */
++ tool_call?: {
++ name: string;
++ /**
++ * The call's input, as the product recorded it: an object, a short summary string, or null. Credential-shaped fields are already redacted.
++ */
++ input?: {
++ [k: string]: unknown | undefined;
++ };
++ } | null;
++ /**
++ * What the step answered: a tool's output, a check's verdict, a file's reference. Any JSON; never a credential.
++ */
++ result?: string | {} | unknown[] | number | boolean | null;
++ /**
++ * What this step spent, when the product meters per step. Null when it meters per run only.
++ */
++ cost?: {
++ usd?: number;
++ tokens?: number;
++ seconds?: number;
++ } | null;
++ started_at: string;
++ /**
++ * When the step ended, when the product records an end. A product that logs a point event sets it to the event's time; null when the step is still open.
++ */
++ ended_at?: string | null;
++ /**
++ * The child run this step started, on KIND child. Null elsewhere.
++ */
++ child_run?: string | null;
++ /**
++ * Who this entry is from. person: the run's person (their message). agent: the agent. system: the product (a notice, a limit reached). tool: a tool's own words. Absent means agent.
++ */
++ from?: "person" | "agent" | "system" | "tool";
++ /**
++ * Who spoke, when a thread has several people or agents: a name and a picture. Absent for the run's own person and agent.
++ */
++ author?: {
++ id?: string;
++ name: string;
++ /**
++ * Their picture.
++ */
++ avatar_url?: string;
++ };
++ /**
++ * Whether the entry is still under way (a tool that runs, a message being written). Absent means done.
++ */
++ status?: "running" | "done" | "failed";
++ /**
++ * The entry in a few words, for a tool or a thought: "Searching the web", "Reading 3 files".
++ */
++ title?: string;
++ /**
++ * A glyph's name in the openvibe-shared glyph registry (openvibe.design/icons). A reader that does not know it draws its default.
++ */
++ glyph?: string;
++ /**
++ * @maxItems 20
++ */
++ attachments?:
++ | []
++ | [
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ }
++ ]
++ | [
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ }
++ ]
++ | [
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ }
++ ]
++ | [
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ }
++ ]
++ | [
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ }
++ ]
++ | [
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ }
++ ]
++ | [
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ }
++ ]
++ | [
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ }
++ ]
++ | [
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ }
++ ]
++ | [
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ }
++ ]
++ | [
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ }
++ ]
++ | [
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ }
++ ]
++ | [
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ }
++ ]
++ | [
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ }
++ ]
++ | [
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ }
++ ]
++ | [
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ }
++ ]
++ | [
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ }
++ ]
++ | [
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ }
++ ]
++ | [
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ }
++ ]
++ | [
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ }
++ ];
++ /**
++ * The sources a message cites, numbered as its text cites them ([1], [2]).
++ *
++ * @maxItems 40
++ */
++ sources?: {
++ n: number;
++ title?: string;
++ /**
++ * The source's address.
++ */
++ url: string;
++ site?: string;
++ }[];
++ /**
++ * A rich card for this entry. TYPE names it (link, table, code, diff, image, choice, timer, repo, desk, run, or a product's own, prefixed with its product: live-clip); DATA is that card's own content. A reader that does not know the type shows TEXT instead, so TEXT always says the same thing in words.
++ */
++ ui?: {
++ type: string;
++ data?: {};
++ };
++ /**
++ * The computer this step used, for the screen tile and the replay: the desk, the picture it saw and what it did. A secret field is blanked before a still is stored.
++ */
++ desk?: {
++ id: string;
++ /**
++ * The picture the step saw.
++ */
++ still_url?: string;
++ action?: {
++ type: string;
++ x?: number;
++ y?: number;
++ text?: string;
++ };
++ };
++}
++
++/** [email protected] (owner: network) */
++/**
++ * agents.run-start@1 (agent-engine.md, 2026-11-12): what starts a run, the same on every product's POST /api/v1/runs and on the Frame's POST /api/frame/runs. Only TEXT is required: the goal, the question or the first message, in the person's own words. KIND chooses the sort of run (agents.run@1's kinds); absent, the Frame's orchestrator decides whether to answer, plan, or hand the work to another product as a child run. AGENT names who does it (an agent's id; auto lets the product choose). MODEL and WHERE are the picker's choices; TARGET is a code run's (new, openvibe or a repository); CONTEXT is where it was asked; ATTACHMENTS are files by Media id or address; SOURCES and DEPTH are an answer's (frame.ask@1's); PARENT_RUN makes it a sub-agent's run inside its parent's budget; BUDGET is its own hard limit. An Idempotency-Key header makes a repeated start return the first run.
++ */
++export interface AgentsRunStart {
++ text: string;
++ title?: string;
++ kind?: string;
++ /**
++ * An agent's id on the product that will run it, or auto.
++ */
++ agent?: string;
++ /**
++ * The picker's choice (frame.choices@1). Absent: the person's default for this kind of work.
++ */
++ model?: {
++ id: string;
++ /**
++ * openvibe: Exchange's directory, paid in credits. keys: the person's own key. machines: a model on the person's own computer (Link). plans: a signed-in plan through a harness.
++ */
++ source?: "openvibe" | "keys" | "machines" | "plans";
++ machine?: string;
++ name?: string;
++ effort?: string;
++ };
++ /**
++ * Where the run's work happens. openvibe: OpenVibe's own computers. machine: the person's own computer or robot through Link (ID is the device). runner: a Codes runner. this-computer: the machine that serves the run itself (Link's agent serve).
++ */
++ where?: {
++ kind: "openvibe" | "machine" | "runner" | "this-computer";
++ id?: string;
++ name?: string;
++ };
++ /**
++ * What a code run works on. new: a new project in the person's own space. openvibe: OpenVibe itself; the orchestrator finds the repositories and opens pull requests, never merges. An object names one repository.
++ */
++ target?:
++ | ("new" | "openvibe")
++ | {
++ /**
++ * owner/name, or the repository's address.
++ */
++ repo: string;
++ branch?: string;
++ };
++ /**
++ * Where the run was asked: the site, the page and what the page is about. A run may use it; it never grants access.
++ */
++ context?: {
++ site?: string;
++ /**
++ * The page's address.
++ */
++ url?: string;
++ title?: string;
++ kind?: string;
++ id?: string;
++ };
++ /**
++ * @maxItems 20
++ */
++ attachments?:
++ | []
++ | [
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ }
++ ]
++ | [
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ }
++ ]
++ | [
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ }
++ ]
++ | [
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ }
++ ]
++ | [
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ }
++ ]
++ | [
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ }
++ ]
++ | [
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ }
++ ]
++ | [
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ }
++ ]
++ | [
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ }
++ ]
++ | [
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ }
++ ]
++ | [
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ }
++ ]
++ | [
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ }
++ ]
++ | [
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ }
++ ]
++ | [
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ }
++ ]
++ | [
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ }
++ ]
++ | [
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ }
++ ]
++ | [
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ }
++ ]
++ | [
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ }
++ ]
++ | [
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
{
-- id: string;
-- label: string;
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
},
{
-- id: string;
-- label: string;
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
},
{
-- id: string;
-- label: string;
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
},
{
-- id: string;
-- label: string;
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
},
{
-- id: string;
-- label: string;
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
},
{
-- id: string;
-- label: string;
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
}
]
| [
{
-- id: string;
-- label: string;
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
},
{
-- id: string;
-- label: string;
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
},
{
-- id: string;
-- label: string;
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
},
{
-- id: string;
-- label: string;
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
},
{
-- id: string;
-- label: string;
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
},
{
-- id: string;
-- label: string;
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
++ },
++ {
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
},
{
-- id: string;
-- label: string;
-- }
-- ]
-- | [
-- {
-- id: string;
-- label: string;
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
},
{
-- id: string;
-- label: string;
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
},
{
-- id: string;
-- label: string;
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
},
{
-- id: string;
-- label: string;
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
},
{
-- id: string;
-- label: string;
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
},
{
-- id: string;
-- label: string;
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
},
{
-- id: string;
-- label: string;
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
},
{
-- id: string;
-- label: string;
++ kind: "image" | "file" | "audio" | "video";
++ media_id?: string;
++ /**
++ * An https address the reader may fetch.
++ */
++ url?: string;
++ name?: string;
++ mime?: string;
++ bytes?: number;
++ width?: number;
++ height?: number;
++ /**
++ * What a picture shows, in words.
++ */
++ alt?: string;
}
];
/**
-- * Who answered: a person subject, a service or an agent.
++ * @maxItems 4
*/
-- decided_by?: SubjectRef | null;
-- decided_at?: string | null;
++ sources?:
++ | []
++ | ["web" | "openvibe" | "mine" | "page"]
++ | ["web" | "openvibe" | "mine" | "page", "web" | "openvibe" | "mine" | "page"]
++ | ["web" | "openvibe" | "mine" | "page", "web" | "openvibe" | "mine" | "page", "web" | "openvibe" | "mine" | "page"]
++ | [
++ "web" | "openvibe" | "mine" | "page",
++ "web" | "openvibe" | "mine" | "page",
++ "web" | "openvibe" | "mine" | "page",
++ "web" | "openvibe" | "mine" | "page"
++ ];
++ depth?: "quick" | "balanced" | "deep";
++ parent_run?: string;
/**
-- * The chosen option's id, or the person's own words when the product allows them. Null while it waits.
++ * The hard limit the run may not exceed. A field that is absent is not limited. USD is money; TOKENS counts model tokens in and out; SECONDS is wall time; STEPS counts the appended steps.
*/
-- answer?: string | null;
++ budget?: {
++ usd?: number;
++ tokens?: number;
++ seconds?: number;
++ steps?: number;
++ };
}
--/** [email protected] (owner: actor) */
++/** [email protected] (owner: network) */
/**
-- * agents.step.appended v1 (one agent system, 2026-11-12). A step was appended to a run: the payload is the appended agents.step@1, whole. OpenVibe.Events carries it with the run's owner as the subject, the product that ran it as the source (actor, codes, run, …) and visibility subject; a reader follows a run live without polling the step log. The namespace is agents (hyphen-free: Events namespaces cannot contain a hyphen). One producer per run: the product that stores the run publishes its steps, and the step's own product names the agent.
++ * agents.event@1 (agent-engine.md, 2026-11-12): one event of a run's stream, GET /api/v1/runs/{id}/events (and /api/frame/runs/{ref}/events), as server-sent events whose event name is TYPE and whose id is the newest step's seq, so Last-Event-ID resumes after it. run: the run changed; RUN is its new snapshot. step: a step was appended; STEP is it, whole. delta: more TEXT for the step SEQ that is still being written (its STATUS is running); a reader appends it. approval: an approval was asked or answered; APPROVAL is it. end: the run reached an end status; the stream closes after it. A reader ignores a type it does not know.
*/
--export interface AgentsStepAppendedPayload {
++export type AgentsEvent = {
++ [k: string]: unknown | undefined;
++} & {
++ type: "run" | "step" | "delta" | "approval" | "end";
++ run?: AgentsRun;
++ step?: AgentsStep;
++ approval?: AgentsApproval;
++ run_id?: string;
++ seq?: number;
++ text?: string;
++ status?: "done" | "failed" | "stopped";
++};
++
++/** [email protected] (owner: actor) */
++/**
++ * agents.run.updated v1 (agent-engine.md, 2026-11-12). A run changed in a way a list shows: it started, its status, title, doing, waiting or preview changed, or it ended. The payload is the run's agents.run@1 snapshot, whole. OpenVibe.Events carries it with the run's owner as the subject, the product that stores it as the source and visibility subject, so the person's run list anywhere stays current without polling. A step is agents.step.appended; this event is not sent for every step, only when the snapshot a list draws changed (at most about once a second per run).
++ */
++export interface AgentsRunUpdatedPayload {
/**
-- * The run this step belongs to (agents.run@1's id).
++ * The product's own run id (Actor's tsk_…, Codes' tsk_…, a Run job's job_…). Unique within its product and never reused.
*/
-- run_id: string;
++ id: string;
/**
-- * The run's own order for this entry, starting at 1 and never renumbered. ?after=SEQ reads the entries after it.
++ * The person or agent the run belongs to: the subject the work is done for.
*/
-- seq: number;
++ owner: SubjectRef;
/**
-- * think: a plan, a check or reasoning. tool: a tool call or its result. message: words for the person. approval: the run asked its person. child: a sub-agent run or a hand-off. file: a file the run made.
++ * The agent or harness that runs it. ID is the product's own agent id or slug; NAME is what a person reads; PRODUCT is the product it comes from (actor, codes, run, chat, …). GLYPH, HUE and AVATAR_URL are its face; HARNESS is the loop that runs it.
*/
-- kind: "think" | "tool" | "message" | "approval" | "child" | "file";
++ agent: {
++ id: string;
++ name?: string;
++ product?: string;
++ /**
++ * The agent's face when it has no picture: a glyph from the registry. A chat's persona sets it per run.
++ */
++ glyph?: string;
++ /**
++ * The hue its face is tinted with.
++ */
++ hue?: number;
++ /**
++ * The agent's picture, when it has one.
++ */
++ avatar_url?: string;
++ /**
++ * The loop that runs it: openvibe (the SDK's own), or another harness run through an adapter (codex, claude-code, opencode, deepseek, …).
++ */
++ harness?: string;
++ };
/**
-- * What a person reads for this step: the plan line, the message, the short tool answer or the file's name. Never a prompt or a secret.
++ * The run that started this one (a sub-agent), or null. The parent's run card nests children; the child's budget is a slice of the parent's.
*/
-- text?: string | null;
++ parent_run?: string | null;
/**
-- * The tool this entry called. On a product that logs a call and its result as two steps, the call names the tool and the result entry has no TOOL_CALL.
++ * The hard limit the run may not exceed. A field that is absent is not limited. USD is money; TOKENS counts model tokens in and out; SECONDS is wall time; STEPS counts the appended steps.
*/
-- tool_call?: {
-- name: string;
-- /**
-- * The call's input, as the product recorded it: an object, a short summary string, or null. Credential-shaped fields are already redacted.
-- */
-- input?: {
-- [k: string]: unknown | undefined;
-- };
-- } | null;
++ budget?: {
++ usd?: number;
++ tokens?: number;
++ seconds?: number;
++ steps?: number;
++ };
/**
-- * What the step answered: a tool's output, a check's verdict, a file's reference. Any JSON; never a credential.
++ * planning: accepted, no step yet. running: a step is under way. waiting: the run waits for its person (an approval or a takeover) and costs nothing. done, failed and stopped are the end statuses; an end status never changes.
*/
-- result?: string | {} | unknown[] | number | boolean | null;
++ status: "planning" | "running" | "waiting" | "done" | "failed" | "stopped";
++ created_at: string;
/**
-- * What this step spent, when the product meters per step. Null when it meters per run only.
++ * When the run last changed: its newest step, its end, or its creation when nothing has happened yet.
++ */
++ updated_at: string;
++ /**
++ * What the run answered or what is left, in plain words, for a run card. The full result stays the product's (Actor's result, Codes' result.summary). Null until there is one.
++ */
++ result_summary?: string | null;
++ /**
++ * What the run has spent so far, to the product's own precision. Null before anything is known.
*/
cost?: {
usd?: number;
tokens?: number;
seconds?: number;
++ steps?: number;
} | null;
-- started_at: string;
/**
-- * When the step ended, when the product records an end. A product that logs a point event sets it to the event's time; null when the step is still open.
++ * What a person calls this run: a chat's name, a task's goal in a few words.
*/
-- ended_at?: string | null;
++ title?: string;
/**
-- * The child run this step started, on KIND child. Null elsewhere.
++ * What sort of run it is. chat: a conversation that stays open. ask: one question and its answer. task: work an agent does for its person. code: a coding task. machine: a job on a computer or a robot. goal: a standing goal that runs on its own schedule. A product may add its own; a reader treats an unknown kind as task.
*/
-- child_run?: string | null;
++ kind?: string;
++ /**
++ * The run's address on the Frame: its product, a colon, the product's own id (chat:…, codes:tsk_…, actor:tsk_…). /api/frame/runs/{ref} reads it wherever it lives.
++ */
++ ref?: string;
++ /**
++ * The run's own page on its product.
++ */
++ url?: string;
++ /**
++ * The model that runs it, as the picker chose it (frame.choices@1's choice, with the name a person reads). EFFORT is the reasoning effort where the model has one.
++ */
++ model?: {
++ id: string;
++ /**
++ * openvibe: Exchange's directory, paid in credits. keys: the person's own key. machines: a model on the person's own computer (Link). plans: a signed-in plan through a harness.
++ */
++ source?: "openvibe" | "keys" | "machines" | "plans";
++ machine?: string;
++ name?: string;
++ effort?: string;
++ };
++ /**
++ * Where the run's work happens. openvibe: OpenVibe's own computers. machine: the person's own computer or robot through Link (ID is the device). runner: a Codes runner. this-computer: the machine that serves the run itself (Link's agent serve).
++ */
++ where?: {
++ kind: "openvibe" | "machine" | "runner" | "this-computer";
++ id?: string;
++ name?: string;
++ };
++ /**
++ * What a code run works on. new: a new project in the person's own space. openvibe: OpenVibe itself; the orchestrator finds the repositories and opens pull requests, never merges. An object names one repository.
++ */
++ target?:
++ | ("new" | "openvibe")
++ | {
++ /**
++ * owner/name, or the repository's address.
++ */
++ repo: string;
++ branch?: string;
++ };
++ /**
++ * What the run is doing now, for its agent's face: a few words and a glyph. Null when it is not working.
++ */
++ doing?: {
++ text: string;
++ /**
++ * A glyph's name in the openvibe-shared glyph registry (openvibe.design/icons). A reader that does not know it draws its default.
++ */
++ glyph?: string;
++ } | null;
++ /**
++ * Why a waiting run waits. message: it is the person's turn to speak (a conversation between turns). approval: it asked before an act (APPROVAL is the agents.approval@1 id). takeover: it met something only its person can do (a sign-in, a code). payment: it needs funds. WHAT says it in words. Null unless STATUS is waiting.
++ */
++ waiting?: {
++ for: "message" | "approval" | "takeover" | "payment";
++ what?: string;
++ approval?: string;
++ since?: string;
++ } | null;
++ /**
++ * The last thing said in the run, for a list: the words, who said them and when.
++ */
++ preview?: {
++ text: string;
++ from?: "person" | "agent" | "system" | "tool";
++ at?: string;
++ } | null;
++ /**
++ * Where the run was asked: the site, the page and what the page is about. A run may use it; it never grants access.
++ */
++ context?: {
++ site?: string;
++ /**
++ * The page's address.
++ */
++ url?: string;
++ title?: string;
++ kind?: string;
++ id?: string;
++ };
++ /**
++ * What the run made, newest last: for its card, and for the feed when it is shared.
++ *
++ * @maxItems 50
++ */
++ outputs?: {
++ kind: "link" | "file" | "image" | "video" | "audio" | "pr" | "repo" | "page" | "post" | "run";
++ title: string;
++ /**
++ * Where it is.
++ */
++ url?: string;
++ /**
++ * A small picture of it.
++ */
++ thumb?: string;
++ media_id?: string;
++ /**
++ * A pull request's or a check's state in a word (open, green, red, merged).
++ */
++ state?: string;
++ }[];
++ /**
++ * Counts a list shows without reading the steps.
++ */
++ counts?: {
++ steps?: number;
++ children?: number;
++ files?: number;
++ approvals?: number;
++ unread?: number;
++ };
++ /**
++ * Who may read the run: its owner only, people it was shared with, or anyone with its address.
++ */
++ visibility?: "private" | "shared" | "public";
++ /**
++ * When the run reached an end status. Null while it has not.
++ */
++ ended_at?: string | null;
}
ddiff --git a/manifests/services/actor.json b/manifests/services/actor.json
iindex 2836fec5..58f44539 100644
---- a/manifests/services/actor.json
++++ b/manifests/services/actor.json
@@@ -39,7 +39,8 @@
"agent.step.started",
"agent.step.updated",
"agent.step.ended",
-- "agents.step.appended"
++ "agents.step.appended",
++ "agents.run.updated"
],
"eventsConsumed": [
"network.account.export_requested",
ddiff --git a/package-lock.json b/package-lock.json
iindex ec09dd6e..2ad1cc4a 100644
---- a/package-lock.json
++++ b/package-lock.json
@@@ -1,12 +1,12 @@
{
"name": "openvibe-contracts",
-- "version": "0.413.0",
++ "version": "0.414.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "openvibe-contracts",
-- "version": "0.413.0",
++ "version": "0.414.0",
"license": "AGPL-3.0-only",
"dependencies": {
"ajv": "^8.17.1",
ddiff --git a/package.json b/package.json
iindex 415e7093..0f752ee8 100644
---- a/package.json
++++ b/package.json
@@@ -1,6 +1,6 @@
{
"name": "openvibe-contracts",
-- "version": "0.413.0",
++ "version": "0.414.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",