openvibers/openvibe.contracts Commits
openvibe-contracts 0.414.0: the whole run (the agent engine) (#467)
Changes
@@@ -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-12The composer's Reach (Post · Ask · Do, stage R3; Network R3): what its `/` and `@` menus offer.nnew file mode 100644@@@ -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"++ ]++ }++ }++ ]++}nnew file mode 100644@@@ -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++ }++ }++ }++ }++}@@@ -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."}}}@@@ -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++ }++ }++ }++ }}}}@@@ -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"}]}nnew file mode 100644@@@ -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"++}@@@ -132,3 +132,49 @@ tool_result`.- **The event is a contract, not yet a producer.** OpenVibe.Events accepts `agents.step.appended`; Actor'sread-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.nnew file mode 100644@@@ -0,0 +1,4 @@++{++ "type": "end",++ "run_id": "c_8f3k2m"++}nnew file mode 100644@@@ -0,0 +1,5 @@++{++ "type": "delta",++ "run_id": "c_8f3k2m",++ "text": "…"++}nnew file mode 100644@@@ -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++ }++}nnew file mode 100644@@@ -0,0 +1,6 @@++{++ "type": "delta",++ "run_id": "c_8f3k2m",++ "seq": 4,++ "text": " the Keychron K2 is the best value"++}nnew file mode 100644@@@ -0,0 +1,5 @@++{++ "type": "end",++ "run_id": "tsk_01K9R2V6M8Q4T0B7C3D5E9F2GH",++ "status": "done"++}nnew file mode 100644@@@ -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"++ }++}nnew file mode 100644@@@ -0,0 +1,5 @@++{++ "text": "fix it",++ "kind": "code",++ "target": "everything"++}nnew file mode 100644@@@ -0,0 +1,3 @@++{++ "kind": "chat"++}nnew file mode 100644@@@ -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++ }++}nnew file mode 100644@@@ -0,0 +1,9 @@++{++ "text": "What happened in tech news today?",++ "kind": "ask",++ "sources": [++ "web",++ "openvibe"++ ],++ "depth": "balanced"++}nnew file mode 100644@@@ -0,0 +1,3 @@++{++ "text": "A goal bar for my sub goal"++}nnew file mode 100644@@@ -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"++}nnew file mode 100644@@@ -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"++}nnew file mode 100644@@@ -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"++}nnew file mode 100644@@@ -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"++}nnew file mode 100644@@@ -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"++}nnew file mode 100644@@@ -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++}nnew file mode 100644@@@ -0,0 +1,10 @@++{++ "run_id": "c_8f3k2m",++ "seq": 2,++ "kind": "message",++ "text": "hi",++ "ui": {++ "data": {}++ },++ "started_at": "2026-11-12T10:00:00Z"++}nnew file mode 100644@@@ -0,0 +1,8 @@++{++ "run_id": "c_8f3k2m",++ "seq": 2,++ "kind": "message",++ "from": "narrator",++ "text": "hi",++ "started_at": "2026-11-12T10:00:00Z"++}nnew file mode 100644@@@ -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"++}nnew file mode 100644@@@ -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"++}nnew file mode 100644@@@ -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++}@@@ -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"}}}@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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;}@@@ -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",@@@ -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",@@@ -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",
@@ -1,5 +1,25 @@
@@ -1,5 +1,25 @@
# Changelog
# 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
## 0.413.0 — 2026-11-12
The composer's Reach (Post · Ask · Do, stage R3; Network R3): what its `/` and `@` menus offer.
The composer's Reach (Post · Ask · Do, stage R3; Network R3): what its `/` and `@` menus offer.
new file mode 100644
new file mode 100644
@@ -0,0 +1,141 @@
@@ -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"
+ ]
+ }
+ }
+ ]
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,267 @@
@@ -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
+ }
+ }
+ }
+ }
+}
@@ -2,7 +2,7 @@
@@ -2,7 +2,7 @@
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://openvibe.network/contracts/agents/run.v1.json",
"$id": "https://openvibe.network/contracts/agents/run.v1.json",
"title": "AgentsRun",
"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",
"type": "object",
"additionalProperties": false,
"additionalProperties": false,
"required": [
"required": [
@@ -34,7 +34,7 @@
@@ -34,7 +34,7 @@
"required": [
"required": [
"id"
"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": {
"properties": {
"id": {
"id": {
"type": "string",
"type": "string",
@@ -50,6 +50,28 @@
@@ -50,6 +50,28 @@
"type": "string",
"type": "string",
"minLength": 1,
"minLength": 1,
"maxLength": 40
"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 @@
@@ -137,6 +159,340 @@
"minimum": 0
"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."
}
}
}
}
}
}
@@ -2,7 +2,7 @@
@@ -2,7 +2,7 @@
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://openvibe.network/contracts/agents/step.v1.json",
"$id": "https://openvibe.network/contracts/agents/step.v1.json",
"title": "AgentsStep",
"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",
"type": "object",
"additionalProperties": false,
"additionalProperties": false,
"required": [
"required": [
@@ -115,6 +115,212 @@
@@ -115,6 +115,212 @@
],
],
"maxLength": 160,
"maxLength": 160,
"description": "The child run this step started, on KIND child. Null elsewhere."
"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
+ }
+ }
+ }
+ }
}
}
}
}
}
}
@@ -11731,7 +11731,7 @@
@@ -11731,7 +11731,7 @@
},
},
{
{
"id": "agents.run",
"id": "agents.run",
- "version": "1.0.0",
+ "version": "1.1.0",
"owner": "actor",
"owner": "actor",
"schema": "agents/run.v1.json",
"schema": "agents/run.v1.json",
"visibility": "public",
"visibility": "public",
@@ -11741,7 +11741,7 @@
@@ -11741,7 +11741,7 @@
},
},
{
{
"id": "agents.step",
"id": "agents.step",
- "version": "1.0.0",
+ "version": "1.1.0",
"owner": "actor",
"owner": "actor",
"schema": "agents/step.v1.json",
"schema": "agents/step.v1.json",
"visibility": "public",
"visibility": "public",
@@ -11768,6 +11768,36 @@
@@ -11768,6 +11768,36 @@
"compatibility": "backward",
"compatibility": "backward",
"status": "active",
"status": "active",
"adr": "ADR-044"
"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"
}
}
]
]
}
}
new file mode 100644
new file mode 100644
@@ -0,0 +1,7 @@
@@ -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"
+}
@@ -132,3 +132,49 @@ tool_result`.
@@ -132,3 +132,49 @@ tool_result`.
- **The event is a contract, not yet a producer.** OpenVibe.Events accepts `agents.step.appended`; Actor's
- **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),
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.
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.
new file mode 100644
new file mode 100644
@@ -0,0 +1,4 @@
@@ -0,0 +1,4 @@
+{
+ "type": "end",
+ "run_id": "c_8f3k2m"
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,5 @@
@@ -0,0 +1,5 @@
+{
+ "type": "delta",
+ "run_id": "c_8f3k2m",
+ "text": "…"
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,25 @@
@@ -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
+ }
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,6 @@
@@ -0,0 +1,6 @@
+{
+ "type": "delta",
+ "run_id": "c_8f3k2m",
+ "seq": 4,
+ "text": " the Keychron K2 is the best value"
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,5 @@
@@ -0,0 +1,5 @@
+{
+ "type": "end",
+ "run_id": "tsk_01K9R2V6M8Q4T0B7C3D5E9F2GH",
+ "status": "done"
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,52 @@
@@ -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"
+ }
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,5 @@
@@ -0,0 +1,5 @@
+{
+ "text": "fix it",
+ "kind": "code",
+ "target": "everything"
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,3 @@
@@ -0,0 +1,3 @@
+{
+ "kind": "chat"
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,28 @@
@@ -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
+ }
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,9 @@
@@ -0,0 +1,9 @@
+{
+ "text": "What happened in tech news today?",
+ "kind": "ask",
+ "sources": [
+ "web",
+ "openvibe"
+ ],
+ "depth": "balanced"
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,3 @@
@@ -0,0 +1,3 @@
+{
+ "text": "A goal bar for my sub goal"
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,48 @@
@@ -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"
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,49 @@
@@ -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"
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,49 @@
@@ -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"
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,48 @@
@@ -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"
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,49 @@
@@ -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"
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,59 @@
@@ -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
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,10 @@
@@ -0,0 +1,10 @@
+{
+ "run_id": "c_8f3k2m",
+ "seq": 2,
+ "kind": "message",
+ "text": "hi",
+ "ui": {
+ "data": {}
+ },
+ "started_at": "2026-11-12T10:00:00Z"
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,8 @@
@@ -0,0 +1,8 @@
+{
+ "run_id": "c_8f3k2m",
+ "seq": 2,
+ "kind": "message",
+ "from": "narrator",
+ "text": "hi",
+ "started_at": "2026-11-12T10:00:00Z"
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,21 @@
@@ -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"
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,28 @@
@@ -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"
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,51 @@
@@ -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
+}
@@ -134957,14 +134957,14 @@
@@ -134957,14 +134957,14 @@
}
}
},
},
"agents.run": {
"agents.run": {
- "version": "1.0.0",
+ "version": "1.1.0",
"owner": "actor",
"owner": "actor",
"status": "active",
"status": "active",
"schema": {
"schema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://openvibe.network/contracts/agents/run.v1.json",
"$id": "https://openvibe.network/contracts/agents/run.v1.json",
"title": "AgentsRun",
"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",
"type": "object",
"additionalProperties": false,
"additionalProperties": false,
"required": [
"required": [
@@ -134996,7 +134996,7 @@
@@ -134996,7 +134996,7 @@
"required": [
"required": [
"id"
"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": {
"properties": {
"id": {
"id": {
"type": "string",
"type": "string",
@@ -135012,6 +135012,28 @@
@@ -135012,6 +135012,28 @@
"type": "string",
"type": "string",
"minLength": 1,
"minLength": 1,
"maxLength": 40
"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 @@
@@ -135099,240 +135121,1210 @@
"minimum": 0
"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",
"type": "string",
"minLength": 1,
"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": {
"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": [
"type": [
"object",
"object",
"null"
"null"
],
],
"additionalProperties": false,
"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": [
"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": {
"properties": {
- "name": {
+ "text": {
"type": "string",
"type": "string",
"minLength": 1,
"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": [
"type": [
- "string",
"object",
"object",
- "array",
- "number",
- "boolean",
"null"
"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": [
"type": [
"object",
"object",
"null"
"null"
],
],
"additionalProperties": false,
"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": {
"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",
"string",
"null"
"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",
"owner": "actor",
"status": "active",
"status": "active",
"schema": {
"schema": {
"$schema": "https://json-schema.org/draft/2020-12/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",
"type": "object",
"additionalProperties": false,
"additionalProperties": false,
"required": [
"required": [
"run_id",
"run_id",
- "step_seq",
- "what",
- "options"
+ "seq",
+ "kind",
+ "started_at"
],
],
"properties": {
"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": {
"run_id": {
"type": "string",
"type": "string",
"minLength": 1,
"minLength": 1,
- "maxLength": 160
+ "maxLength": 160,
+ "description": "The run this step belongs to (agents.run@1's id)."
},
},
- "step_seq": {
+ "seq": {
"type": "integer",
"type": "integer",
"minimum": 1,
"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": [
"type": [
"string",
"string",
"null"
"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": [
"type": [
"string",
"string",
"null"
"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"
}
}
}
}
}
}
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Actor API",
"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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.AI API",
"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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Bench API",
"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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Billing API",
"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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Blog API",
"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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Bot API",
"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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Chat API",
"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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Codes API",
"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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Community API",
"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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe Connect API",
"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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Coupons API",
"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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Deals API",
"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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Design API",
"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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Domains API",
"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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Events API",
"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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Exchange API",
"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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Food API",
"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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Games API",
"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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Git API",
"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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Host API",
"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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Inventory API",
"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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Live API",
"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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Mail API",
"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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.MediaHub API",
"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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Media API",
"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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Network API",
"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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.News API",
"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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenRestream API",
"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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Play API",
"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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Quest API",
"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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Report API",
"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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Reviews API",
"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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Run API",
"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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Search API",
"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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Services API",
"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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Sources API",
"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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Space API",
"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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Tips API",
"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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Today API",
"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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Tools API",
"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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Trade API",
"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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.VIP API",
"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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Vision API",
"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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Watch API",
"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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Wiki API",
"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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Work API",
"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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Zone API",
"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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -342488,9 +342488,9 @@ export interface FrameMentions {
@@ -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 {
export interface AgentsRun {
/**
/**
@@ -342502,12 +342502,28 @@ export interface AgentsRun {
@@ -342502,12 +342502,28 @@ export interface AgentsRun {
*/
*/
owner: SubjectRef;
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: {
agent: {
id: string;
id: string;
name?: string;
name?: string;
product?: 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.
* 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 {
@@ -342544,11 +342560,140 @@ export interface AgentsRun {
seconds?: number;
seconds?: number;
steps?: number;
steps?: number;
} | null;
} | 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 {
export interface AgentsStep {
/**
/**
@@ -342600,256 +342745,11534 @@ export interface AgentsStep {
@@ -342600,256 +342745,11534 @@ export interface AgentsStep {
* The child run this step started, on KIND child. Null elsewhere.
* The child run this step started, on KIND child. Null elsewhere.
*/
*/
child_run?: string | null;
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?: {
cost?: {
usd?: number;
usd?: number;
tokens?: number;
tokens?: number;
seconds?: number;
seconds?: number;
+ steps?: number;
} | null;
} | 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;
}
}
@@ -39,7 +39,8 @@
@@ -39,7 +39,8 @@
"agent.step.started",
"agent.step.started",
"agent.step.updated",
"agent.step.updated",
"agent.step.ended",
"agent.step.ended",
- "agents.step.appended"
+ "agents.step.appended",
+ "agents.run.updated"
],
],
"eventsConsumed": [
"eventsConsumed": [
"network.account.export_requested",
"network.account.export_requested",
@@ -1,12 +1,12 @@
@@ -1,12 +1,12 @@
{
{
"name": "openvibe-contracts",
"name": "openvibe-contracts",
- "version": "0.413.0",
+ "version": "0.414.0",
"lockfileVersion": 3,
"lockfileVersion": 3,
"requires": true,
"requires": true,
"packages": {
"packages": {
"": {
"": {
"name": "openvibe-contracts",
"name": "openvibe-contracts",
- "version": "0.413.0",
+ "version": "0.414.0",
"license": "AGPL-3.0-only",
"license": "AGPL-3.0-only",
"dependencies": {
"dependencies": {
"ajv": "^8.17.1",
"ajv": "^8.17.1",
@@ -1,6 +1,6 @@
@@ -1,6 +1,6 @@
{
{
"name": "openvibe-contracts",
"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.",
"description": "Machine-readable contracts for the OpenVibe network: schemas, manifests, ids, error envelope, capability checks.",
"main": "index.js",
"main": "index.js",
"types": "generated/typescript/index.d.ts",
"types": "generated/typescript/index.d.ts",