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)
Changes
@@@ -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.nnew file mode 100644@@@ -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."++ }++ }++}nnew file mode 100644@@@ -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++ }++ }++ }++ }++}nnew file mode 100644@@@ -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."++ }++ }++}@@@ -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"}]}nnew file mode 100644@@@ -0,0 +1,7 @@++{++ "$schema": "https://json-schema.org/draft/2020-12/schema",++ "$id": "https://openvibe.network/contracts/events/payloads/agents.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"++}nnew file mode 100644@@@ -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.nnew file mode 100644@@@ -0,0 +1,6 @@++{++ "run_id": "tsk_01K9R2V6M8Q4T0B7C3D5E9F2GH",++ "step_seq": 7,++ "what": "Post the answer to your feed",++ "options": []++}nnew file mode 100644@@@ -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"++}nnew file mode 100644@@@ -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"++}nnew file mode 100644@@@ -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++ }++}nnew file mode 100644@@@ -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++ }++}nnew file mode 100644@@@ -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"++}nnew file mode 100644@@@ -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"++}nnew file mode 100644@@@ -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"++}nnew file mode 100644@@@ -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++}@@@ -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"++ }}}}@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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;++}@@@ -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",@@@ -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",@@@ -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",
@@ -1,5 +1,23 @@
@@ -1,5 +1,23 @@
# Changelog
# 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
## 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.
- 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.
new file mode 100644
new file mode 100644
@@ -0,0 +1,90 @@
@@ -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."
+ }
+ }
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,142 @@
@@ -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
+ }
+ }
+ }
+ }
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,120 @@
@@ -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."
+ }
+ }
+}
@@ -11710,6 +11710,46 @@
@@ -11710,6 +11710,46 @@
"visibility": "public",
"visibility": "public",
"compatibility": "backward",
"compatibility": "backward",
"status": "active"
"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"
}
}
]
]
}
}
new file mode 100644
new file mode 100644
@@ -0,0 +1,7 @@
@@ -0,0 +1,7 @@
+{
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "https://openvibe.network/contracts/events/payloads/agents.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"
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,134 @@
@@ -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.
new file mode 100644
new file mode 100644
@@ -0,0 +1,6 @@
@@ -0,0 +1,6 @@
+{
+ "run_id": "tsk_01K9R2V6M8Q4T0B7C3D5E9F2GH",
+ "step_seq": 7,
+ "what": "Post the answer to your feed",
+ "options": []
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,22 @@
@@ -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"
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,13 @@
@@ -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"
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,23 @@
@@ -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
+ }
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,29 @@
@@ -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
+ }
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,6 @@
@@ -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"
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,8 @@
@@ -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"
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,7 @@
@@ -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"
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,22 @@
@@ -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
+}
@@ -134769,6 +134769,385 @@
@@ -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"
+ }
}
}
}
}
}
}
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Actor API",
"title": "OpenVibe.Actor API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.AI API",
"title": "OpenVibe.AI API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Bench API",
"title": "OpenVibe.Bench API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Billing API",
"title": "OpenVibe.Billing API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Blog API",
"title": "OpenVibe.Blog API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Bot API",
"title": "OpenVibe.Bot API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Chat API",
"title": "OpenVibe.Chat API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Codes API",
"title": "OpenVibe.Codes API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Community API",
"title": "OpenVibe.Community API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe Connect API",
"title": "OpenVibe Connect API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Coupons API",
"title": "OpenVibe.Coupons API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Deals API",
"title": "OpenVibe.Deals API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Design API",
"title": "OpenVibe.Design API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Domains API",
"title": "OpenVibe.Domains API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Events API",
"title": "OpenVibe.Events API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Exchange API",
"title": "OpenVibe.Exchange API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Food API",
"title": "OpenVibe.Food API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Games API",
"title": "OpenVibe.Games API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Git API",
"title": "OpenVibe.Git API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Host API",
"title": "OpenVibe.Host API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Inventory API",
"title": "OpenVibe.Inventory API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Live API",
"title": "OpenVibe.Live API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Mail API",
"title": "OpenVibe.Mail API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.MediaHub API",
"title": "OpenVibe.MediaHub API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Media API",
"title": "OpenVibe.Media API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Network API",
"title": "OpenVibe.Network API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.News API",
"title": "OpenVibe.News API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenRestream API",
"title": "OpenRestream API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Play API",
"title": "OpenVibe.Play API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Quest API",
"title": "OpenVibe.Quest API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Report API",
"title": "OpenVibe.Report API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Reviews API",
"title": "OpenVibe.Reviews API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Run API",
"title": "OpenVibe.Run API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Search API",
"title": "OpenVibe.Search API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Services API",
"title": "OpenVibe.Services API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Sources API",
"title": "OpenVibe.Sources API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Space API",
"title": "OpenVibe.Space API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Tips API",
"title": "OpenVibe.Tips API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Today API",
"title": "OpenVibe.Today API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Tools API",
"title": "OpenVibe.Tools API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Trade API",
"title": "OpenVibe.Trade API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.VIP API",
"title": "OpenVibe.VIP API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Vision API",
"title": "OpenVibe.Vision API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Watch API",
"title": "OpenVibe.Watch API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Wiki API",
"title": "OpenVibe.Wiki API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Work API",
"title": "OpenVibe.Work API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Zone API",
"title": "OpenVibe.Zone API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -341444,3 +341444,369 @@ export interface FrameAskRequest {
@@ -341444,3 +341444,369 @@ export interface FrameAskRequest {
text?: string;
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;
+}
@@ -38,7 +38,8 @@
@@ -38,7 +38,8 @@
"eventsProduced": [
"eventsProduced": [
"agent.step.started",
"agent.step.started",
"agent.step.updated",
"agent.step.updated",
- "agent.step.ended"
+ "agent.step.ended",
+ "agents.step.appended"
],
],
"eventsConsumed": [
"eventsConsumed": [
"network.account.export_requested",
"network.account.export_requested",
@@ -1,12 +1,12 @@
@@ -1,12 +1,12 @@
{
{
"name": "openvibe-contracts",
"name": "openvibe-contracts",
- "version": "0.411.0",
+ "version": "0.412.0",
"lockfileVersion": 3,
"lockfileVersion": 3,
"requires": true,
"requires": true,
"packages": {
"packages": {
"": {
"": {
"name": "openvibe-contracts",
"name": "openvibe-contracts",
- "version": "0.411.0",
+ "version": "0.412.0",
"license": "AGPL-3.0-only",
"license": "AGPL-3.0-only",
"dependencies": {
"dependencies": {
"ajv": "^8.17.1",
"ajv": "^8.17.1",
@@ -1,6 +1,6 @@
@@ -1,6 +1,6 @@
{
{
"name": "openvibe-contracts",
"name": "openvibe-contracts",
- "version": "0.411.1",
+ "version": "0.412.0",
"description": "Machine-readable contracts for the OpenVibe network: schemas, manifests, ids, error envelope, capability checks.",
"description": "Machine-readable contracts for the OpenVibe network: schemas, manifests, ids, error envelope, capability checks.",
"main": "index.js",
"main": "index.js",
"types": "generated/typescript/index.d.ts",
"types": "generated/typescript/index.d.ts",