openvibers/openvibe.contracts Commits

One agent system, stage 2: agents.run@1, agents.step@1, agents.approval@1 and agents.step.appended@1 (0.412.0) (#463)

OP OpenVibers committed 1 days ago · eae99634cf · 68 files, +1531 −98

* One agent system, stage 2: agents.run, agents.step and agents.approval, and the appended step event (0.412.0)

* Merge remote-tracking branch 'origin/main' into feat/agents-runs-contracts

# Conflicts:
#	CHANGELOG.md
#	generated/openapi/actor.json
#	generated/openapi/ai.json
#	generated/openapi/bench.json
#	generated/openapi/billing.json
#	generated/openapi/blog.json
#	generated/openapi/bot.json
#	generated/openapi/chat.json
#	generated/openapi/codes.json
#	generated/openapi/community.json
#	generated/openapi/connect.json
#	generated/openapi/coupons.json
#	generated/openapi/deals.json
#	generated/openapi/design.json
#	generated/openapi/domains.json
#	generated/openapi/events.json
#	generated/openapi/exchange.json
#	generated/openapi/food.json
#	generated/openapi/games.json
#	generated/openapi/git.json
#	generated/openapi/host.json
#	generated/openapi/inventory.json
#	generated/openapi/live.json
#	generated/openapi/mail.json
#	generated/openapi/media-hub.json
#	generated/openapi/media.json
#	generated/openapi/network.json
#	generated/openapi/news.json
#	generated/openapi/openre.json
#	generated/openapi/play.json
#	generated/openapi/quest.json
#	generated/openapi/report.json
#	generated/openapi/reviews.json
#	generated/openapi/run.json
#	generated/openapi/search.json
#	generated/openapi/services.json
#	generated/openapi/sources.json
#	generated/openapi/space.json
#	generated/openapi/tips.json
#	generated/openapi/today.json
#	generated/openapi/tools.json
#	generated/openapi/trade.json
#	generated/openapi/vip.json
#	generated/openapi/vision.json
#	generated/openapi/watch.json
#	generated/openapi/wiki.json
#	generated/openapi/work.json
#	generated/openapi/zone.json
#	package.json

Changes

ddiff --git a/CHANGELOG.md b/CHANGELOG.md
iindex 632094ed..3e8be575 100644
---- a/CHANGELOG.md
++++ b/CHANGELOG.md
@@@ -1,5 +1,23 @@
# Changelog
++## 0.412.0 — 2026-11-12
++
++One agent system, stage 2: one run shape for Actor, Codes and Run, and the step event that follows it.
++
++- Add `agents.run@1`: a run's id, owner, agent and product, parent run, budget (USD, tokens, seconds and steps),
++ status (`planning`, `running`, `waiting`, `done`, `failed`, `stopped`), created and updated times, a result summary
++ and what it spent. One shape for OpenVibe.Actor, OpenVibe.Codes and OpenVibe.Run.
++- Add `agents.step@1`: one entry of a run's append-only log (run id, seq, kind `think|tool|message|approval|child|file`,
++ text, the tool call and its input, the result, the step's cost, start and end, and the child run it started).
++- Add `agents.approval@1`: an ask attached to a run's step (what, the options with their labels, who decided and when,
++ and the answer).
++- Add the event `agents.step.appended@1`: the appended step as the payload, on OpenVibe.Events. The `agents` namespace
++ is hyphen-free because an event type cannot carry a hyphen; Actor registers the producer.
++- Add valid and invalid fixtures for all four, the generated JSON Schema, TypeScript and per-service OpenAPI, and
++ `docs/agents-runs.md`: which field of Actor's `tasks`/`task_events` and Codes' `run_tasks`/`codes_session_lines`/
++ `codes_approvals` becomes which field of the new shape, and what does not fit (Actor's `needs_you`, per-step cost,
++ split tool call/result entries, and Codes' attempts as one flat run).
++
## 0.411.1 — 2026-11-12
- Add the `code` category to `sources.source@1`, `sources.item@1`, `sources.category@1` and `sources.source-write-request@1`: GitHub repositories (trending, top, new and star-gain rankings) enter OpenVibe.Sources under one category, with a 30-day item window. Additive: no existing field changes, and an older reader ignores the new enum value.
ddiff --git a/contracts/agents/approval.v1.json b/contracts/agents/approval.v1.json
nnew file mode 100644
iindex 00000000..32f213b7
---- /dev/null
++++ b/contracts/agents/approval.v1.json
@@@ -0,0 +1,90 @@
++{
++ "$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."
++ }
++ }
++}
ddiff --git a/contracts/agents/run.v1.json b/contracts/agents/run.v1.json
nnew file mode 100644
iindex 00000000..dea9679f
---- /dev/null
++++ b/contracts/agents/run.v1.json
@@@ -0,0 +1,142 @@
++{
++ "$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.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "id",
++ "owner",
++ "agent",
++ "status",
++ "created_at",
++ "updated_at"
++ ],
++ "properties": {
++ "id": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 160,
++ "description": "The product's own run id (Actor's tsk_…, Codes' tsk_…, a Run job's job_…). Unique within its product and never reused."
++ },
++ "owner": {
++ "description": "The person or agent the run belongs to: the subject the work is done for.",
++ "allOf": [
++ {
++ "$ref": "../identity/subject-ref.v1.json"
++ }
++ ]
++ },
++ "agent": {
++ "type": "object",
++ "additionalProperties": false,
++ "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, …).",
++ "properties": {
++ "id": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 160
++ },
++ "name": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 160
++ },
++ "product": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 40
++ }
++ }
++ },
++ "parent_run": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "maxLength": 160,
++ "description": "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."
++ },
++ "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
++ }
++ }
++ },
++ "status": {
++ "enum": [
++ "planning",
++ "running",
++ "waiting",
++ "done",
++ "failed",
++ "stopped"
++ ],
++ "description": "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."
++ },
++ "created_at": {
++ "type": "string",
++ "format": "date-time"
++ },
++ "updated_at": {
++ "type": "string",
++ "format": "date-time",
++ "description": "When the run last changed: its newest step, its end, or its creation when nothing has happened yet."
++ },
++ "result_summary": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "maxLength": 8000,
++ "description": "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."
++ },
++ "cost": {
++ "type": [
++ "object",
++ "null"
++ ],
++ "additionalProperties": false,
++ "description": "What the run has spent so far, to the product's own precision. Null before anything is known.",
++ "properties": {
++ "usd": {
++ "type": "number",
++ "minimum": 0
++ },
++ "tokens": {
++ "type": "integer",
++ "minimum": 0
++ },
++ "seconds": {
++ "type": "number",
++ "minimum": 0
++ },
++ "steps": {
++ "type": "integer",
++ "minimum": 0
++ }
++ }
++ }
++ }
++}
ddiff --git a/contracts/agents/step.v1.json b/contracts/agents/step.v1.json
nnew file mode 100644
iindex 00000000..9de5bd07
---- /dev/null
++++ b/contracts/agents/step.v1.json
@@@ -0,0 +1,120 @@
++{
++ "$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": {
++ "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."
++ },
++ "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."
++ },
++ "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."
++ }
++ }
++ },
++ "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
++ },
++ "tokens": {
++ "type": "integer",
++ "minimum": 0
++ },
++ "seconds": {
++ "type": "number",
++ "minimum": 0
++ }
++ }
++ },
++ "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."
++ },
++ "child_run": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "maxLength": 160,
++ "description": "The child run this step started, on KIND child. Null elsewhere."
++ }
++ }
++}
ddiff --git a/contracts/catalog.json b/contracts/catalog.json
iindex f3956db9..ef022c35 100644
---- a/contracts/catalog.json
++++ b/contracts/catalog.json
@@@ -11710,6 +11710,46 @@
"visibility": "public",
"compatibility": "backward",
"status": "active"
++ },
++ {
++ "id": "agents.run",
++ "version": "1.0.0",
++ "owner": "actor",
++ "schema": "agents/run.v1.json",
++ "visibility": "public",
++ "compatibility": "backward",
++ "status": "active",
++ "adr": "ADR-044"
++ },
++ {
++ "id": "agents.step",
++ "version": "1.0.0",
++ "owner": "actor",
++ "schema": "agents/step.v1.json",
++ "visibility": "public",
++ "compatibility": "backward",
++ "status": "active",
++ "adr": "ADR-044"
++ },
++ {
++ "id": "agents.approval",
++ "version": "1.0.0",
++ "owner": "actor",
++ "schema": "agents/approval.v1.json",
++ "visibility": "public",
++ "compatibility": "backward",
++ "status": "active",
++ "adr": "ADR-044"
++ },
++ {
++ "id": "agents.step.appended",
++ "version": "1.0.0",
++ "owner": "actor",
++ "schema": "events/payloads/agents.step.appended.v1.json",
++ "visibility": "first-party",
++ "compatibility": "backward",
++ "status": "active",
++ "adr": "ADR-044"
}
]
}
ddiff --git a/contracts/events/payloads/agents.step.appended.v1.json b/contracts/events/payloads/agents.step.appended.v1.json
nnew file mode 100644
iindex 00000000..1a77c77e
---- /dev/null
++++ b/contracts/events/payloads/agents.step.appended.v1.json
@@@ -0,0 +1,7 @@
++{
++ "$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"
++}
ddiff --git a/docs/agents-runs.md b/docs/agents-runs.md
nnew file mode 100644
iindex 00000000..a936493c
---- /dev/null
++++ b/docs/agents-runs.md
@@@ -0,0 +1,134 @@
++# One agent run: `agents.run@1`, `agents.step@1`, `agents.approval@1`
++
++2026-11-12. One run schema for OpenVibe.Actor, OpenVibe.Codes and OpenVibe.Run (design
++`~/openvibe/research-2026-11-12/one-agent-system.md` §1, stage 2). The contracts are the wire shape, not a new
++store: each product keeps its own tables and serves the same shape.
++
++- `agents.run@1` — one run: `id`, `owner` (a `subject-ref`), `agent` (`{ id, name?, product? }`), `parent_run`,
++ `budget` (`usd`, `tokens`, `seconds`, `steps`), `status` (`planning | running | waiting | done | failed |
++ stopped`), `created_at`, `updated_at`, `result_summary`, `cost`.
++- `agents.step@1` — one entry of a run's append-only log: `run_id`, `seq`, `kind` (`think | tool | message |
++ approval | child | file`), `text`, `tool_call` (`{ name, input }`), `result`, `cost`, `started_at`, `ended_at`
++ and, on a child, `child_run`.
++- `agents.approval@1` — one ask: `run_id`, `step_seq`, `what`, `options` (`[{ id, label }]`), `decided_by`,
++ `decided_at`, `answer`.
++- `agents.step.appended` (event, `@1`) — the appended step as the payload, published on OpenVibe.Events. The
++ namespace is `agents`, hyphen-free because an event type cannot carry a hyphen (`hyphenated-event-namespaces`).
++
++`GET /api/v1/runs`, `GET /api/v1/runs/:id` and `GET /api/v1/runs/:id/steps?after=` serve the run and its steps;
++`openvibe-sdk/agents` (`runs`, `approvals`, `events`) reads them. Actor serves the first read-only version: `/:id`
++answers this shape when the reader sends `Accept: application/vnd.openvibe.agents.run+json` (what the SDK sends) or
++`?shape=agents.run@1`, because the older `agent.run@1` snapshot stays the default at that path for its own callers.
++
++## Actor: `tasks` → `agents.run@1`
++
++Actor's task **is** the run. `GET /api/v1/runs` lists the person's own tasks, `/:id` reads one (with the media type
++above) and `/:id/steps` reads its task events. The person's `user:usr_…` requester is the owner, so no other person's run is readable.
++
++| `agents.run` | Actor (`tasks`, `task_events`) |
++|---|---|
++| `id` | `tasks.id` (`tsk_…`) |
++| `owner` | `identity.subject-ref` made from `tasks.requester` (`user:usr_…` → `{ type: "user", id: "usr_…" }`) |
++| `agent.id` | `tasks.agent_id` (the contact, `agt_…`), else `tasks.agent` (the pinned system slug), else `openvibe-runtime` |
++| `agent.name` | `actor_agents.name` for `agent_id`; otherwise the catalog's name for `tasks.agent` |
++| `agent.product` | `actor` |
++| `parent_run` | `tasks.parent_id` (a follow-up or fork's parent), else null |
++| `budget.usd` | `tasks.budget_task` |
++| `budget.seconds` | `tasks.timeout_ms / 1000`; absent for a row from before migration 0014 |
++| `budget.tokens`, `budget.steps` | absent: Actor has no per-task token or step cap |
++| `status` | `queued` → `planning`; `running`, `verifying` → `running`; `needs_you` → `waiting`; `succeeded` → `done`; `failed` → `failed`; `cancelled` → `stopped` |
++| `created_at` | `tasks.created_at` |
++| `updated_at` | the newest `task_events.at`, else `finished_at`, else `created_at` |
++| `result_summary` | `result.answer` on `succeeded`; `error_detail` on `failed`; null otherwise |
++| `cost.usd` | `tasks.cost_usd` (null before it is metered) |
++| `cost.tokens` | absent from the run row (the per-call spans in `actor_spans` carry them) |
++| `cost.seconds` | `finished_at - created_at`, or now − `created_at` while open |
++| `cost.steps` | `tasks.last_seq`, the number of appended events |
++
++## Codes: `run_tasks` → `agents.run@1`
++
++Codes' task is the run too. A **continuation or a switch is the same task** (an attempt), never a child run:
++`parent_run` is null, and the attempts' costs add up on the one run.
++
++| `agents.run` | Codes (`run_tasks`, `codes_attempts`) |
++|---|---|
++| `id` | `run_tasks.id` (`tsk_…`) |
++| `owner` | `{ type: "user", id: run_tasks.subject }` |
++| `agent.id` | `run_tasks.agent` (the harness slug), else the newest attempt's `agent`, else `auto` |
++| `agent.name` | the harness catalog's name (`server/data/harness-offers.json`) |
++| `agent.product` | `codes` |
++| `parent_run` | null: an attempt is the same run, not a child |
++| `budget` | absent: Codes' limits are the machine and the project policy, not a run column |
++| `status` | `queued`, `placed` → `planning`; `running` → `running`; `succeeded` → `done`; `failed`, `expired` → `failed`; `cancelled` → `stopped` |
++| `created_at` | `run_tasks.created_at` (bigint ms → ISO) |
++| `updated_at` | `run_tasks.updated_at` (bigint ms → ISO) |
++| `result_summary` | `result.summary` on `succeeded`; `result.error` or `outcome_note` on `failed`/stopped |
++| `cost.usd` | `sum(codes_attempts.cost_usd)` (or `result.cost_usd` for an old task) |
++| `cost.tokens` | `sum(codes_attempts.tokens)` |
++| `cost.seconds` | `sum(attempt.finished_at - attempt.started_at)` (or `result.duration_ms / 1000`) |
++| `cost.steps` | `sum(codes_attempts.steps)` |
++
++## Steps: `task_events` / `codes_session_lines` → `agents.step@1`
++
++Both products already keep an append-only log with a monotonic `seq`. One log entry becomes one step; `seq` is the
++product's own and is never renumbered, so `?after=` is the same cursor a reconnect uses.
++
++| `agents.step` | Actor (`task_events.body`) | Codes (`codes_session_lines.body`) |
++|---|---|---|
++| `run_id` | `task_events.task_id` | `codes_session_lines.task_id` (the task, not the attempt) |
++| `seq` | `task_events.seq` | `codes_session_lines.seq` (bigint; event seq × 250000 + line) |
++| `kind` | `step: plan`, `check` → `think`; `text` → `message`; `tool_call`, `tool_result` → `tool`; `handoff` (the person took the desk), `trigger`, `trigger-run` → `message` | `t: agent`, `step` → `think`; `t: text`, `note` → `message`; `t: tool`, `tool_progress`, `tool_result` → `tool`; `t: handoff` → `message`; `t: proof` → `file`; `state`, `end`, `usage`, `done` are not steps |
++| `text` | `body.text` | `body.text`, or `body.what` / `body.name` |
++| `tool_call.name` | `body.tool` on a `tool_call` | `body.name` on `t: tool` |
++| `tool_call.input` | `body.input` (the short summary Actor stores) | `body.input` |
++| `result` | `body.text` on `tool_result` | `body.text` or `body.output` on `tool_result` |
++| `cost` | null: Actor meters per call in `actor_spans`, not per event | `body.cost_usd` / `body.tokens` when the line carries them |
++| `started_at` | `body.at` | `codes_session_lines.at` |
++| `ended_at` | `body.at` | `codes_session_lines.at` |
++| `child_run` | null: a hand-off is a product, not a child run | null |
++
++Actor writes a tool **call** and its **result** as two events with two seqs; both map to `kind: tool`, the call's
++entry carries `tool_call`, the result's carries `result`. That keeps `seq` append-only; a reader pairs them by
++`tool_call.name` and time, not by changing an earlier step. Codes has the same split for `t: tool` / `t:
++tool_result`.
++
++## Approvals: `actor_approvals` / `codes_approvals` → `agents.approval@1`
++
++| `agents.approval` | Actor (`actor_approvals`) | Codes (`codes_approvals`) |
++|---|---|---|
++| `id` | `id` (`apr_…`) | `id` (`apr_…`) |
++| `run_id` | `task_id` | `task_id` |
++| `step_seq` | the seq of the `task_events` row whose `ui_approval.id` is this approval | not stored: the adapter matches the `t: tool` line by tool and time, the nearest before `created_at` (lossy) |
++| `what` | `summary`, else the event's `ui_approval.question` | `summary` |
++| `options` | fixed `approve` / `decline` (Actor's row does not store its actions) | fixed `allow` / `deny` |
++| `decided_by` | `owner` when `decided_at` is set | the task's `subject` when `decision` is set |
++| `decided_at` | `decided_at` | `decided_at` |
++| `answer` | `state`: `approved` → `approve`, `declined` → `decline`, `expired` → null | `decision` (`allow` / `deny`) |
++
++## What does not fit
++
++- **A waiting run is not the same thing on both sides.** Actor has an explicit `needs_you` state and a pending
++ approval row; Codes keeps `run_tasks.state = running` while an approval waits, so a Codes run can only be called
++ `waiting` by joining `codes_approvals`. Actor's waits (`actor_waits`) are also `waiting`, but a run that waits on
++ an event is not waiting for its person; the schema has one `waiting` status for both.
++- **No per-step cost.** Actor meters model and tool calls in `actor_spans`; its task events carry no cost. Codes
++ carries cost on some session lines (and on the attempt), not on every line.
++- **Calls and results are separate log entries.** The schema's one step has `tool_call` and `result`, but both
++ products append a call and a result as two entries. The adapter keeps them as two steps rather than rewriting
++ the log, so a card pairs them by tool and time.
++- **`started_at` is a point, not a span.** Both logs store one `at` per entry. A step's `ended_at` is that same
++ time (or null when the product has no end), not a measured duration.
++- **Actor's budget is money and time only.** There is no token or step budget on `tasks`; `budget.seconds` comes
++ from `timeout_ms` and is absent on old rows. Actor's `budget_day` is a daily ceiling, not the run's own budget.
++- **Codes has no run budget and no parent run.** Its limits are the machine and the project/attempt policy; a
++ continue or a switch is a new attempt on the same task, so the run tree stays flat (attempts carry the costs).
++- **Actor approvals do not store their step seq.** The approval id is on the event (`ui_approval.id`), so the
++ adapter finds the seq; Codes does not store either, and its match is lossy.
++- **No `child` step fits today.** Actor's delegated work is an assignment tree beside `task_events`, and Codes'
++ hand-off is a new attempt on the same task; neither is a child run in the step log. A child run is a new task with
++ `parent_run` set, not a step kind that exists in either product yet.
++- **Actor approvals are not served by the read-only run API.** `GET /api/v1/runs` returns runs and steps only;
++ the approval contract is ready for `approvals.answer` when the engine writes approvals.
++- **The event is a contract, not yet a producer.** OpenVibe.Events accepts `agents.step.appended`; Actor's
++ read-only API does not publish it yet. The engine that appends the step is the publisher (one producer per run),
++ with the run's owner as the subject and the product as the source.
ddiff --git a/fixtures/agents.approval/invalid/no-options.json b/fixtures/agents.approval/invalid/no-options.json
nnew file mode 100644
iindex 00000000..ad31b013
---- /dev/null
++++ b/fixtures/agents.approval/invalid/no-options.json
@@@ -0,0 +1,6 @@
++{
++ "run_id": "tsk_01K9R2V6M8Q4T0B7C3D5E9F2GH",
++ "step_seq": 7,
++ "what": "Post the answer to your feed",
++ "options": []
++}
ddiff --git a/fixtures/agents.approval/valid/approved.json b/fixtures/agents.approval/valid/approved.json
nnew file mode 100644
iindex 00000000..64281e19
---- /dev/null
++++ b/fixtures/agents.approval/valid/approved.json
@@@ -0,0 +1,22 @@
++{
++ "id": "apr_01K9R2V6M8Q4T0B7C3D5E9F2GH",
++ "run_id": "tsk_01K9R2V6M8Q4T0B7C3D5E9F2GH",
++ "step_seq": 7,
++ "what": "Push the branch and open a pull request on your machine's repository",
++ "options": [
++ {
++ "id": "approve",
++ "label": "Approve"
++ },
++ {
++ "id": "decline",
++ "label": "Decline"
++ }
++ ],
++ "decided_by": {
++ "type": "user",
++ "id": "usr_01K9R2V6M8Q4T0B7C3D5E9F2GH"
++ },
++ "decided_at": "2026-11-12T10:01:00Z",
++ "answer": "approve"
++}
ddiff --git a/fixtures/agents.run/invalid/unknown-status.json b/fixtures/agents.run/invalid/unknown-status.json
nnew file mode 100644
iindex 00000000..c5891085
---- /dev/null
++++ b/fixtures/agents.run/invalid/unknown-status.json
@@@ -0,0 +1,13 @@
++{
++ "id": "run_01K9R2V6M8Q4T0B7C3D5E9F2GH",
++ "owner": {
++ "type": "user",
++ "id": "usr_01K9R2V6M8Q4T0B7C3D5E9F2GH"
++ },
++ "agent": {
++ "id": "actor"
++ },
++ "status": "queued",
++ "created_at": "2026-11-12T09:00:00Z",
++ "updated_at": "2026-11-12T09:00:00Z"
++}
ddiff --git a/fixtures/agents.run/valid/done.json b/fixtures/agents.run/valid/done.json
nnew file mode 100644
iindex 00000000..b108b676
---- /dev/null
++++ b/fixtures/agents.run/valid/done.json
@@@ -0,0 +1,23 @@
++{
++ "id": "job_01K9R2V6M8Q4T0B7C3D5E9F2GH",
++ "owner": {
++ "type": "user",
++ "id": "usr_01K9R2V6M8Q4T0B7C3D5E9F2GH"
++ },
++ "agent": {
++ "id": "codes",
++ "name": "Claude Code",
++ "product": "codes"
++ },
++ "parent_run": null,
++ "status": "done",
++ "created_at": "2026-11-12T09:00:00Z",
++ "updated_at": "2026-11-12T09:04:30Z",
++ "result_summary": "Opened a pull request with the two fixes.",
++ "cost": {
++ "usd": 0.42,
++ "tokens": 88000,
++ "seconds": 270,
++ "steps": 18
++ }
++}
ddiff --git a/fixtures/agents.run/valid/running.json b/fixtures/agents.run/valid/running.json
nnew file mode 100644
iindex 00000000..64776faa
---- /dev/null
++++ b/fixtures/agents.run/valid/running.json
@@@ -0,0 +1,29 @@
++{
++ "id": "tsk_01K9R2V6M8Q4T0B7C3D5E9F2GH",
++ "owner": {
++ "type": "user",
++ "id": "usr_01K9R2V6M8Q4T0B7C3D5E9F2GH"
++ },
++ "agent": {
++ "id": "agt_01K9R2V6M8Q4T0B7C3D5E9F2GH",
++ "name": "Vibe",
++ "product": "actor"
++ },
++ "parent_run": null,
++ "budget": {
++ "usd": 2.5,
++ "tokens": 200000,
++ "seconds": 600,
++ "steps": 40
++ },
++ "status": "running",
++ "created_at": "2026-11-12T10:00:00Z",
++ "updated_at": "2026-11-12T10:00:12Z",
++ "result_summary": null,
++ "cost": {
++ "usd": 0.031,
++ "tokens": 4210,
++ "seconds": 12,
++ "steps": 3
++ }
++}
ddiff --git a/fixtures/agents.step.appended/invalid/missing-seq.json b/fixtures/agents.step.appended/invalid/missing-seq.json
nnew file mode 100644
iindex 00000000..c2e71138
---- /dev/null
++++ b/fixtures/agents.step.appended/invalid/missing-seq.json
@@@ -0,0 +1,6 @@
++{
++ "run_id": "tsk_01K9R2V6M8Q4T0B7C3D5E9F2GH",
++ "kind": "message",
++ "text": "A step without its place in the log.",
++ "started_at": "2026-11-12T10:00:30Z"
++}
ddiff --git a/fixtures/agents.step.appended/valid/message.json b/fixtures/agents.step.appended/valid/message.json
nnew file mode 100644
iindex 00000000..5f6ce0e7
---- /dev/null
++++ b/fixtures/agents.step.appended/valid/message.json
@@@ -0,0 +1,8 @@
++{
++ "run_id": "tsk_01K9R2V6M8Q4T0B7C3D5E9F2GH",
++ "seq": 6,
++ "kind": "message",
++ "text": "I found the failing test and am fixing it.",
++ "started_at": "2026-11-12T10:00:30Z",
++ "ended_at": "2026-11-12T10:00:30Z"
++}
ddiff --git a/fixtures/agents.step/invalid/unknown-kind.json b/fixtures/agents.step/invalid/unknown-kind.json
nnew file mode 100644
iindex 00000000..d934763f
---- /dev/null
++++ b/fixtures/agents.step/invalid/unknown-kind.json
@@@ -0,0 +1,7 @@
++{
++ "run_id": "tsk_01K9R2V6M8Q4T0B7C3D5E9F2GH",
++ "seq": 5,
++ "kind": "thought",
++ "text": "The test suite is the next thing to run.",
++ "started_at": "2026-11-12T10:00:09Z"
++}
ddiff --git a/fixtures/agents.step/valid/tool.json b/fixtures/agents.step/valid/tool.json
nnew file mode 100644
iindex 00000000..76a6721a
---- /dev/null
++++ b/fixtures/agents.step/valid/tool.json
@@@ -0,0 +1,22 @@
++{
++ "run_id": "tsk_01K9R2V6M8Q4T0B7C3D5E9F2GH",
++ "seq": 4,
++ "kind": "tool",
++ "text": "Ran the test suite",
++ "tool_call": {
++ "name": "terminal",
++ "input": {
++ "command": "npm test",
++ "cwd": "/home/person/app"
++ }
++ },
++ "result": "124 checks passed",
++ "cost": {
++ "usd": 0.002,
++ "tokens": 310,
++ "seconds": 18
++ },
++ "started_at": "2026-11-12T10:00:10Z",
++ "ended_at": "2026-11-12T10:00:28Z",
++ "child_run": null
++}
ddiff --git a/generated/json-schema/bundle.json b/generated/json-schema/bundle.json
iindex e0ece5b2..624aa5f6 100644
---- a/generated/json-schema/bundle.json
++++ b/generated/json-schema/bundle.json
@@@ -134769,6 +134769,385 @@
}
}
}
++ },
++ "agents.run": {
++ "version": "1.0.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.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "id",
++ "owner",
++ "agent",
++ "status",
++ "created_at",
++ "updated_at"
++ ],
++ "properties": {
++ "id": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 160,
++ "description": "The product's own run id (Actor's tsk_…, Codes' tsk_…, a Run job's job_…). Unique within its product and never reused."
++ },
++ "owner": {
++ "description": "The person or agent the run belongs to: the subject the work is done for.",
++ "allOf": [
++ {
++ "$ref": "../identity/subject-ref.v1.json"
++ }
++ ]
++ },
++ "agent": {
++ "type": "object",
++ "additionalProperties": false,
++ "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, …).",
++ "properties": {
++ "id": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 160
++ },
++ "name": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 160
++ },
++ "product": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 40
++ }
++ }
++ },
++ "parent_run": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "maxLength": 160,
++ "description": "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."
++ },
++ "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
++ }
++ }
++ },
++ "status": {
++ "enum": [
++ "planning",
++ "running",
++ "waiting",
++ "done",
++ "failed",
++ "stopped"
++ ],
++ "description": "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."
++ },
++ "created_at": {
++ "type": "string",
++ "format": "date-time"
++ },
++ "updated_at": {
++ "type": "string",
++ "format": "date-time",
++ "description": "When the run last changed: its newest step, its end, or its creation when nothing has happened yet."
++ },
++ "result_summary": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "maxLength": 8000,
++ "description": "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."
++ },
++ "cost": {
++ "type": [
++ "object",
++ "null"
++ ],
++ "additionalProperties": false,
++ "description": "What the run has spent so far, to the product's own precision. Null before anything is known.",
++ "properties": {
++ "usd": {
++ "type": "number",
++ "minimum": 0
++ },
++ "tokens": {
++ "type": "integer",
++ "minimum": 0
++ },
++ "seconds": {
++ "type": "number",
++ "minimum": 0
++ },
++ "steps": {
++ "type": "integer",
++ "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": {
++ "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."
++ },
++ "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."
++ },
++ "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."
++ }
++ }
++ },
++ "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
++ },
++ "tokens": {
++ "type": "integer",
++ "minimum": 0
++ },
++ "seconds": {
++ "type": "number",
++ "minimum": 0
++ }
++ }
++ },
++ "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."
++ },
++ "child_run": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "maxLength": 160,
++ "description": "The child run this step started, on KIND child. Null elsewhere."
++ }
++ }
++ }
++ },
++ "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"
++ }
}
}
}
ddiff --git a/generated/openapi/actor.json b/generated/openapi/actor.json
iindex 6025d78f..2683d2ad 100644
---- a/generated/openapi/actor.json
++++ b/generated/openapi/actor.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Actor API",
-- "version": "0.411.1",
-- "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.411.1): each operation lists the capabilities it performs; a token for 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.412.0",
++ "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.412.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/ai.json b/generated/openapi/ai.json
iindex 34331bd6..d6b5f5d6 100644
---- a/generated/openapi/ai.json
++++ b/generated/openapi/ai.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.AI API",
-- "version": "0.411.1",
-- "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.411.1): each operation lists the capabilities it performs; a token for 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.412.0",
++ "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.412.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/bench.json b/generated/openapi/bench.json
iindex 80283ef0..654921c7 100644
---- a/generated/openapi/bench.json
++++ b/generated/openapi/bench.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Bench API",
-- "version": "0.411.1",
-- "description": "Routes of OpenVibe.Bench as the OpenVibe contracts describe them (openvibe-contracts 0.411.1): each operation lists the capabilities it performs; a token for 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.412.0",
++ "description": "Routes of OpenVibe.Bench as the OpenVibe contracts describe them (openvibe-contracts 0.412.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/billing.json b/generated/openapi/billing.json
iindex 29c7f43d..726be6ae 100644
---- a/generated/openapi/billing.json
++++ b/generated/openapi/billing.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Billing API",
-- "version": "0.411.1",
-- "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.411.1): each operation lists the capabilities it performs; a token for 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.412.0",
++ "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.412.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/blog.json b/generated/openapi/blog.json
iindex 4872048b..22e898da 100644
---- a/generated/openapi/blog.json
++++ b/generated/openapi/blog.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Blog API",
-- "version": "0.411.1",
-- "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.411.1): each operation lists the capabilities it performs; a token for 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.412.0",
++ "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.412.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/bot.json b/generated/openapi/bot.json
iindex 4e46fd09..a4822a12 100644
---- a/generated/openapi/bot.json
++++ b/generated/openapi/bot.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Bot API",
-- "version": "0.411.1",
-- "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.411.1): each operation lists the capabilities it performs; a token for 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.412.0",
++ "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.412.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/chat.json b/generated/openapi/chat.json
iindex b8ba8133..6db8434d 100644
---- a/generated/openapi/chat.json
++++ b/generated/openapi/chat.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Chat API",
-- "version": "0.411.1",
-- "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.411.1): each operation lists the capabilities it performs; a token for 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.412.0",
++ "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.412.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/codes.json b/generated/openapi/codes.json
iindex f192b8d1..51d6f452 100644
---- a/generated/openapi/codes.json
++++ b/generated/openapi/codes.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Codes API",
-- "version": "0.411.1",
-- "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.411.1): each operation lists the capabilities it performs; a token for 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.412.0",
++ "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.412.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/community.json b/generated/openapi/community.json
iindex 3db683c5..ec54bc5e 100644
---- a/generated/openapi/community.json
++++ b/generated/openapi/community.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Community API",
-- "version": "0.411.1",
-- "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.411.1): each operation lists the capabilities it performs; a token for 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.412.0",
++ "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.412.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/connect.json b/generated/openapi/connect.json
iindex d32f896a..0e726b78 100644
---- a/generated/openapi/connect.json
++++ b/generated/openapi/connect.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe Connect API",
-- "version": "0.411.1",
-- "description": "Routes of OpenVibe Connect as the OpenVibe contracts describe them (openvibe-contracts 0.411.1): each operation lists the capabilities it performs; a token for 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.412.0",
++ "description": "Routes of OpenVibe Connect as the OpenVibe contracts describe them (openvibe-contracts 0.412.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/coupons.json b/generated/openapi/coupons.json
iindex 843ebea1..0dc0b908 100644
---- a/generated/openapi/coupons.json
++++ b/generated/openapi/coupons.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Coupons API",
-- "version": "0.411.1",
-- "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.411.1): each operation lists the capabilities it performs; a token for 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.412.0",
++ "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.412.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/deals.json b/generated/openapi/deals.json
iindex 8a5807d5..f3438c23 100644
---- a/generated/openapi/deals.json
++++ b/generated/openapi/deals.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Deals API",
-- "version": "0.411.1",
-- "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.411.1): each operation lists the capabilities it performs; a token for 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.412.0",
++ "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.412.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/design.json b/generated/openapi/design.json
iindex 86fc9396..703f38db 100644
---- a/generated/openapi/design.json
++++ b/generated/openapi/design.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Design API",
-- "version": "0.411.1",
-- "description": "Routes of OpenVibe.Design as the OpenVibe contracts describe them (openvibe-contracts 0.411.1): each operation lists the capabilities it performs; a token for 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.412.0",
++ "description": "Routes of OpenVibe.Design as the OpenVibe contracts describe them (openvibe-contracts 0.412.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/domains.json b/generated/openapi/domains.json
iindex a1458f3a..7eb59242 100644
---- a/generated/openapi/domains.json
++++ b/generated/openapi/domains.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Domains API",
-- "version": "0.411.1",
-- "description": "Routes of OpenVibe.Domains as the OpenVibe contracts describe them (openvibe-contracts 0.411.1): each operation lists the capabilities it performs; a token for 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.412.0",
++ "description": "Routes of OpenVibe.Domains as the OpenVibe contracts describe them (openvibe-contracts 0.412.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/events.json b/generated/openapi/events.json
iindex 55fbb3dd..2fa99164 100644
---- a/generated/openapi/events.json
++++ b/generated/openapi/events.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Events API",
-- "version": "0.411.1",
-- "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.411.1): each operation lists the capabilities it performs; a token for 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.412.0",
++ "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.412.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/exchange.json b/generated/openapi/exchange.json
iindex 79f118de..4c3e56db 100644
---- a/generated/openapi/exchange.json
++++ b/generated/openapi/exchange.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Exchange API",
-- "version": "0.411.1",
-- "description": "Routes of OpenVibe.Exchange as the OpenVibe contracts describe them (openvibe-contracts 0.411.1): each operation lists the capabilities it performs; a token for 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.412.0",
++ "description": "Routes of OpenVibe.Exchange as the OpenVibe contracts describe them (openvibe-contracts 0.412.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/food.json b/generated/openapi/food.json
iindex 2d48c129..1141ede9 100644
---- a/generated/openapi/food.json
++++ b/generated/openapi/food.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Food API",
-- "version": "0.411.1",
-- "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.411.1): each operation lists the capabilities it performs; a token for 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.412.0",
++ "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.412.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/games.json b/generated/openapi/games.json
iindex 2ed367b9..dd1fb731 100644
---- a/generated/openapi/games.json
++++ b/generated/openapi/games.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Games API",
-- "version": "0.411.1",
-- "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.411.1): each operation lists the capabilities it performs; a token for 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.412.0",
++ "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.412.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/git.json b/generated/openapi/git.json
iindex b3104576..dfbe57bc 100644
---- a/generated/openapi/git.json
++++ b/generated/openapi/git.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Git API",
-- "version": "0.411.1",
-- "description": "Routes of OpenVibe.Git as the OpenVibe contracts describe them (openvibe-contracts 0.411.1): each operation lists the capabilities it performs; a token for 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.412.0",
++ "description": "Routes of OpenVibe.Git as the OpenVibe contracts describe them (openvibe-contracts 0.412.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/host.json b/generated/openapi/host.json
iindex a8f84dda..f6a6f4e4 100644
---- a/generated/openapi/host.json
++++ b/generated/openapi/host.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Host API",
-- "version": "0.411.1",
-- "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.411.1): each operation lists the capabilities it performs; a token for 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.412.0",
++ "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.412.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/inventory.json b/generated/openapi/inventory.json
iindex c45688a0..5a37b70c 100644
---- a/generated/openapi/inventory.json
++++ b/generated/openapi/inventory.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Inventory API",
-- "version": "0.411.1",
-- "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.411.1): each operation lists the capabilities it performs; a token for 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.412.0",
++ "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.412.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/live.json b/generated/openapi/live.json
iindex 63686847..8d528078 100644
---- a/generated/openapi/live.json
++++ b/generated/openapi/live.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Live API",
-- "version": "0.411.1",
-- "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.411.1): each operation lists the capabilities it performs; a token for 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.412.0",
++ "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.412.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/mail.json b/generated/openapi/mail.json
iindex 76bb1d80..5fe18461 100644
---- a/generated/openapi/mail.json
++++ b/generated/openapi/mail.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Mail API",
-- "version": "0.411.1",
-- "description": "Routes of OpenVibe.Mail as the OpenVibe contracts describe them (openvibe-contracts 0.411.1): each operation lists the capabilities it performs; a token for 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.412.0",
++ "description": "Routes of OpenVibe.Mail as the OpenVibe contracts describe them (openvibe-contracts 0.412.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/media-hub.json b/generated/openapi/media-hub.json
iindex cf8d84c7..09f78f7f 100644
---- a/generated/openapi/media-hub.json
++++ b/generated/openapi/media-hub.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.MediaHub API",
-- "version": "0.411.1",
-- "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.411.1): each operation lists the capabilities it performs; a token for 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.412.0",
++ "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.412.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/media.json b/generated/openapi/media.json
iindex 9b913439..e3a40a63 100644
---- a/generated/openapi/media.json
++++ b/generated/openapi/media.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Media API",
-- "version": "0.411.1",
-- "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.411.1): each operation lists the capabilities it performs; a token for 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.412.0",
++ "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.412.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/network.json b/generated/openapi/network.json
iindex b02c1666..9699f107 100644
---- a/generated/openapi/network.json
++++ b/generated/openapi/network.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Network API",
-- "version": "0.411.1",
-- "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.411.1): each operation lists the capabilities it performs; a token for 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.412.0",
++ "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.412.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/news.json b/generated/openapi/news.json
iindex 550faf2d..cc597c26 100644
---- a/generated/openapi/news.json
++++ b/generated/openapi/news.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.News API",
-- "version": "0.411.1",
-- "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.411.1): each operation lists the capabilities it performs; a token for 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.412.0",
++ "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.412.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/openre.json b/generated/openapi/openre.json
iindex 4598d02e..a6abd9ce 100644
---- a/generated/openapi/openre.json
++++ b/generated/openapi/openre.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenRestream API",
-- "version": "0.411.1",
-- "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.411.1): each operation lists the capabilities it performs; a token for 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.412.0",
++ "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.412.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/play.json b/generated/openapi/play.json
iindex 7381a1af..b2047350 100644
---- a/generated/openapi/play.json
++++ b/generated/openapi/play.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Play API",
-- "version": "0.411.1",
-- "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.411.1): each operation lists the capabilities it performs; a token for 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.412.0",
++ "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.412.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/quest.json b/generated/openapi/quest.json
iindex dd5818ea..7c6673cb 100644
---- a/generated/openapi/quest.json
++++ b/generated/openapi/quest.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Quest API",
-- "version": "0.411.1",
-- "description": "Routes of OpenVibe.Quest as the OpenVibe contracts describe them (openvibe-contracts 0.411.1): each operation lists the capabilities it performs; a token for 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.412.0",
++ "description": "Routes of OpenVibe.Quest as the OpenVibe contracts describe them (openvibe-contracts 0.412.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/report.json b/generated/openapi/report.json
iindex 124bbc75..2c8e1b5e 100644
---- a/generated/openapi/report.json
++++ b/generated/openapi/report.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Report API",
-- "version": "0.411.1",
-- "description": "Routes of OpenVibe.Report as the OpenVibe contracts describe them (openvibe-contracts 0.411.1): each operation lists the capabilities it performs; a token for 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.412.0",
++ "description": "Routes of OpenVibe.Report as the OpenVibe contracts describe them (openvibe-contracts 0.412.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/reviews.json b/generated/openapi/reviews.json
iindex 22fc7ec2..1230c448 100644
---- a/generated/openapi/reviews.json
++++ b/generated/openapi/reviews.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Reviews API",
-- "version": "0.411.1",
-- "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.411.1): each operation lists the capabilities it performs; a token for 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.412.0",
++ "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.412.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/run.json b/generated/openapi/run.json
iindex 9a9a62af..0290cfb8 100644
---- a/generated/openapi/run.json
++++ b/generated/openapi/run.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Run API",
-- "version": "0.411.1",
-- "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.411.1): each operation lists the capabilities it performs; a token for 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.412.0",
++ "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.412.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/search.json b/generated/openapi/search.json
iindex 3ae6ff7f..7a849615 100644
---- a/generated/openapi/search.json
++++ b/generated/openapi/search.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Search API",
-- "version": "0.411.1",
-- "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.411.1): each operation lists the capabilities it performs; a token for 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.412.0",
++ "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.412.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/services.json b/generated/openapi/services.json
iindex 5df07515..27acad9b 100644
---- a/generated/openapi/services.json
++++ b/generated/openapi/services.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Services API",
-- "version": "0.411.1",
-- "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.411.1): each operation lists the capabilities it performs; a token for 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.412.0",
++ "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.412.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/sources.json b/generated/openapi/sources.json
iindex de5ae291..0478db22 100644
---- a/generated/openapi/sources.json
++++ b/generated/openapi/sources.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Sources API",
-- "version": "0.411.1",
-- "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.411.1): each operation lists the capabilities it performs; a token for 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.412.0",
++ "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.412.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/space.json b/generated/openapi/space.json
iindex e76e0ff7..d0a3849b 100644
---- a/generated/openapi/space.json
++++ b/generated/openapi/space.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Space API",
-- "version": "0.411.1",
-- "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.411.1): each operation lists the capabilities it performs; a token for 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.412.0",
++ "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.412.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/tips.json b/generated/openapi/tips.json
iindex a2a83c03..34bdfdf1 100644
---- a/generated/openapi/tips.json
++++ b/generated/openapi/tips.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Tips API",
-- "version": "0.411.1",
-- "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.411.1): each operation lists the capabilities it performs; a token for 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.412.0",
++ "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.412.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/today.json b/generated/openapi/today.json
iindex de57c603..065ff630 100644
---- a/generated/openapi/today.json
++++ b/generated/openapi/today.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Today API",
-- "version": "0.411.1",
-- "description": "Routes of OpenVibe.Today as the OpenVibe contracts describe them (openvibe-contracts 0.411.1): each operation lists the capabilities it performs; a token for 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.412.0",
++ "description": "Routes of OpenVibe.Today as the OpenVibe contracts describe them (openvibe-contracts 0.412.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/tools.json b/generated/openapi/tools.json
iindex 1dc8bdcf..4ac31f09 100644
---- a/generated/openapi/tools.json
++++ b/generated/openapi/tools.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Tools API",
-- "version": "0.411.1",
-- "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.411.1): each operation lists the capabilities it performs; a token for 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.412.0",
++ "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.412.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/trade.json b/generated/openapi/trade.json
iindex f3b38db8..bc7a07e2 100644
---- a/generated/openapi/trade.json
++++ b/generated/openapi/trade.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Trade API",
-- "version": "0.411.1",
-- "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.411.1): each operation lists the capabilities it performs; a token for 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.412.0",
++ "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.412.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/vip.json b/generated/openapi/vip.json
iindex a22ebe5e..98cfe1e1 100644
---- a/generated/openapi/vip.json
++++ b/generated/openapi/vip.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.VIP API",
-- "version": "0.411.1",
-- "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.411.1): each operation lists the capabilities it performs; a token for 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.412.0",
++ "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.412.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/vision.json b/generated/openapi/vision.json
iindex b905109f..d4efd4fe 100644
---- a/generated/openapi/vision.json
++++ b/generated/openapi/vision.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Vision API",
-- "version": "0.411.1",
-- "description": "Routes of OpenVibe.Vision as the OpenVibe contracts describe them (openvibe-contracts 0.411.1): each operation lists the capabilities it performs; a token for 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.412.0",
++ "description": "Routes of OpenVibe.Vision as the OpenVibe contracts describe them (openvibe-contracts 0.412.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/watch.json b/generated/openapi/watch.json
iindex 6c996a81..db214915 100644
---- a/generated/openapi/watch.json
++++ b/generated/openapi/watch.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Watch API",
-- "version": "0.411.1",
-- "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.411.1): each operation lists the capabilities it performs; a token for 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.412.0",
++ "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.412.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/wiki.json b/generated/openapi/wiki.json
iindex 037500ca..afbb65da 100644
---- a/generated/openapi/wiki.json
++++ b/generated/openapi/wiki.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Wiki API",
-- "version": "0.411.1",
-- "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.411.1): each operation lists the capabilities it performs; a token for 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.412.0",
++ "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.412.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/work.json b/generated/openapi/work.json
iindex 192bf28d..ab05fa3a 100644
---- a/generated/openapi/work.json
++++ b/generated/openapi/work.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Work API",
-- "version": "0.411.1",
-- "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.411.1): each operation lists the capabilities it performs; a token for 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.412.0",
++ "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.412.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/zone.json b/generated/openapi/zone.json
iindex ef2b9828..20a4fe23 100644
---- a/generated/openapi/zone.json
++++ b/generated/openapi/zone.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Zone API",
-- "version": "0.411.1",
-- "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.411.1): each operation lists the capabilities it performs; a token for 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.412.0",
++ "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.412.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/typescript/index.d.ts b/generated/typescript/index.d.ts
iindex cecedcd2..1b38c600 100644
---- a/generated/typescript/index.d.ts
++++ b/generated/typescript/index.d.ts
@@@ -341444,3 +341444,369 @@ export interface FrameAskRequest {
text?: string;
};
}
++
++/** [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.
++ */
++export interface AgentsRun {
++ /**
++ * The product's own run id (Actor's tsk_…, Codes' tsk_…, a Run job's job_…). Unique within its product and never reused.
++ */
++ id: string;
++ /**
++ * The person or agent the run belongs to: the subject the work is done for.
++ */
++ 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, …).
++ */
++ agent: {
++ id: string;
++ name?: string;
++ product?: 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.
++ */
++ parent_run?: string | null;
++ /**
++ * 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.
++ */
++ budget?: {
++ usd?: number;
++ tokens?: number;
++ seconds?: number;
++ steps?: number;
++ };
++ /**
++ * 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.
++ */
++ status: "planning" | "running" | "waiting" | "done" | "failed" | "stopped";
++ created_at: string;
++ /**
++ * 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;
++}
++
++/** [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.
++ */
++export interface AgentsStep {
++ /**
++ * 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;
++}
++
++/** [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;
++}
ddiff --git a/manifests/services/actor.json b/manifests/services/actor.json
iindex 96981776..2836fec5 100644
---- a/manifests/services/actor.json
++++ b/manifests/services/actor.json
@@@ -38,7 +38,8 @@
"eventsProduced": [
"agent.step.started",
"agent.step.updated",
-- "agent.step.ended"
++ "agent.step.ended",
++ "agents.step.appended"
],
"eventsConsumed": [
"network.account.export_requested",
ddiff --git a/package-lock.json b/package-lock.json
iindex 8546b190..f5205cbd 100644
---- a/package-lock.json
++++ b/package-lock.json
@@@ -1,12 +1,12 @@
{
"name": "openvibe-contracts",
-- "version": "0.411.0",
++ "version": "0.412.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "openvibe-contracts",
-- "version": "0.411.0",
++ "version": "0.412.0",
"license": "AGPL-3.0-only",
"dependencies": {
"ajv": "^8.17.1",
ddiff --git a/package.json b/package.json
iindex 480a0440..8df754fb 100644
---- a/package.json
++++ b/package.json
@@@ -1,6 +1,6 @@
{
"name": "openvibe-contracts",
-- "version": "0.411.1",
++ "version": "0.412.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",