openvibers/openvibe.contracts Commits

actor.agent@1, actor.agent-list@1, actor.level-change@1 (#330)

OP OpenVibers committed 6 days ago · 0ff0fb7d84 · 65 files, +1349 −129

* actor.agent@1, actor.agent-list@1 and actor.level-change@1: a person's agents as contacts with approval levels, and task agent_id/level fields

* Merge origin/main into contracts/agents-contacts; release 0.322.0

Changes

ddiff --git a/CHANGELOG.md b/CHANGELOG.md
iindex 8e978327..5d132df6 100644
---- a/CHANGELOG.md
++++ b/CHANGELOG.md
@@@ -1,5 +1,13 @@
# Changelog
++## 0.322.0 — 2026-11-07
++
++- Add `actor.agent@1`: one of a person's agents as a contact (plan §12 A-1) — id, owner, name, face, voice, model (`engine` runtime / own-keys / open-gpu / link, plus the model id), computer (null or a Computer kind and placement), connected app ids, OpenVibe Memory scope id (or null), approval level (`ask`, `auto-edits`, `approve-for-me`, `full`) and when it was added. Levels default to ask; money, passwords, deletions and sending to a new recipient always ask at every level, as a server-side floor.
++- Add `actor.agent-list@1`: a signed-in person's own agents (`GET /api/v1/agents`), Vibe first. Vibe is created on the first read and is not deletable. The public agent-system catalog keeps `actor.agent-list-result@2` and now has an explicit `GET /api/v1/agent-systems` for a signed-in caller.
++- Add `actor.level-change@1`: the body of `PUT /api/v1/agents/{id}/level`; optional `agent_id`, `thread_id` and `reason` are echoes, the path names the agent.
++- `actor.task-create-request@1` gains optional `agent_id` (the contact the task runs as; absent means Vibe) and `level` (the thread's own level). `platform.task@1` gains optional `agent_id`, `level`, `effective_level` and `agent_level`. The effective level is the higher of the agent's level and the person's own thread line; it never inherits from another person's or a service's work.
++- Name the contact routes in `actor.agent.manage` and the catalog and presets routes in `actor.agent.read`; add valid and invalid fixtures for the three new contracts.
++
## 0.321.0 — 2026-11-07
- Space's builder becomes a task of the person's one agent (plan 2026-10-22 §Z, stage Z1). Add the contracts of Space's builder API: `space.build-space@1` (one of a person's own spaces: its id, slug, name, description, whether it is published and where, and when it changed), `space.build-list@1` (`{ spaces }` or `{ space }`), `space.build-files@1` (the space's files, each a path and its whole content), `space.build-create@1` (the body of a request for a new space), `space.build-preview@1` (where the space can be seen now, its file paths, and whether it is live) and `space.build-publish@1` (`pending`, `published` or `declined`, with the request the person answers in the Dock).
ddiff --git a/contracts/actor/agent-list.v1.json b/contracts/actor/agent-list.v1.json
nnew file mode 100644
iindex 00000000..43005900
---- /dev/null
++++ b/contracts/actor/agent-list.v1.json
@@@ -0,0 +1,20 @@
++{
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/actor/agent-list.v1.json",
++ "title": "ActorAgentList",
++ "description": "actor.agent-list@1: GET /api/v1/agents for a signed-in person (capability actor.agent.manage): their own agent contacts, Vibe first. Vibe, the person's first agent, is created on this first read and cannot be deleted. Another person's agents are never in this list. The public agent-system catalog stays at GET /api/v1/agent-systems (actor.agent-list-result@2).",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "agents"
++ ],
++ "properties": {
++ "agents": {
++ "type": "array",
++ "maxItems": 32,
++ "items": {
++ "$ref": "agent.v1.json"
++ }
++ }
++ }
++}
ddiff --git a/contracts/actor/agent.v1.json b/contracts/actor/agent.v1.json
nnew file mode 100644
iindex 00000000..af6de237
---- /dev/null
++++ b/contracts/actor/agent.v1.json
@@@ -0,0 +1,150 @@
++{
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/actor/agent.v1.json",
++ "title": "ActorAgent",
++ "description": "actor.agent@1: one of a person's agents as a contact (plan §12, A-1). An agent has a stable id and owner, a name and face, an optional TTS voice, the model it runs on (the OpenVibe runtime, the person's own keys, a free model on OpenVibe's GPU or their own Claude Code/Codex on a Link machine), the computer it uses (null when it has none, or one of Computer's kinds and placements), the connected apps it may use, its OpenVibe Memory scope (null when it keeps none), its approval level and when it was added. The default level is ask; money, passwords, deletions and sending to a new recipient always ask at every level, as a server-side floor.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "id",
++ "owner",
++ "name",
++ "face",
++ "voice",
++ "model",
++ "computer",
++ "apps",
++ "memory",
++ "level",
++ "created_at"
++ ],
++ "properties": {
++ "id": {
++ "type": "string",
++ "pattern": "^agt_[0-9A-HJKMNP-TV-Z]{26}$",
++ "description": "agt_<ULID>, Actor's own id for the contact. Vibe, the first agent every person gets, is one of these."
++ },
++ "owner": {
++ "type": "string",
++ "pattern": "^user:usr_[0-9A-HJKMNP-TV-Z]{26}$",
++ "description": "The person the contact belongs to (identity.subject-ref@1 in one column). Another person's agent is 404."
++ },
++ "name": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 60
++ },
++ "face": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 500,
++ "description": "An avatar ref: an https image URL, a Media id, or a preset face such as preset:researcher. The UI draws it; Actor only stores and returns it."
++ },
++ "voice": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "maxLength": 80,
++ "description": "A TTS voice id, or null when the agent has no voice. Voice calls are A-6; the field is stored now so a contact keeps its voice."
++ },
++ "model": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "engine",
++ "model"
++ ],
++ "properties": {
++ "engine": {
++ "type": "string",
++ "enum": [
++ "runtime",
++ "own-keys",
++ "open-gpu",
++ "link"
++ ],
++ "description": "runtime: OpenVibe's own agent loop; own-keys: the person's provider keys through OpenVibe.AI; open-gpu: a free open model on OpenVibe's GPU; link: the person's own Claude Code or Codex on a Link machine."
++ },
++ "model": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 120,
++ "description": "The model id on that engine (a tier such as smart, a provider:model id, an open model name, or a harness name)."
++ }
++ }
++ },
++ "computer": {
++ "oneOf": [
++ {
++ "type": "null"
++ },
++ {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "kind",
++ "placement"
++ ],
++ "properties": {
++ "kind": {
++ "type": "string",
++ "enum": [
++ "browser",
++ "kept-browser",
++ "desktop",
++ "gpu-desktop",
++ "always-on",
++ "your-computer",
++ "throwaway"
++ ],
++ "description": "Computer's kinds (plan §6): a browser, a kept browser, a Linux desktop, a GPU desktop, an always-on computer, the person's own computer, or a throwaway."
++ },
++ "placement": {
++ "type": "string",
++ "enum": [
++ "auto",
++ "link",
++ "home",
++ "ovh"
++ ],
++ "description": "Where it runs: OpenVibe decides (auto), the person's Link machine, the OpenVibe home desktops, or OVH's cloud."
++ }
++ }
++ }
++ ]
++ },
++ "apps": {
++ "type": "array",
++ "maxItems": 50,
++ "uniqueItems": true,
++ "items": {
++ "type": "string",
++ "pattern": "^[a-z][a-z0-9._-]{0,63}$"
++ },
++ "description": "Connected app ids the agent may use (Connect's catalogue slugs)."
++ },
++ "memory": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "maxLength": 100,
++ "description": "The OpenVibe Memory scope id this agent reads and writes, or null when it keeps no memory."
++ },
++ "level": {
++ "type": "string",
++ "enum": [
++ "ask",
++ "auto-edits",
++ "approve-for-me",
++ "full"
++ ],
++ "description": "The approval level (plan §12): ask (the default) asks before every act; auto-edits lets the agent edit files and run its own work without asking; approve-for-me has a reviewer model of another family decide ordinary acts; full runs without asking. The floor still asks for money, passwords, deletions and sending to a new recipient at every level."
++ },
++ "created_at": {
++ "type": "string",
++ "format": "date-time"
++ }
++ }
++}
ddiff --git a/contracts/actor/level-change.v1.json b/contracts/actor/level-change.v1.json
nnew file mode 100644
iindex 00000000..6bfe7e09
---- /dev/null
++++ b/contracts/actor/level-change.v1.json
@@@ -0,0 +1,34 @@
++{
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/actor/level-change.v1.json",
++ "title": "ActorLevelChange",
++ "description": "actor.level-change@1: the body of PUT /api/v1/agents/{id}/level (capability actor.agent.manage). LEVEL is the new approval level of the person's agent; the answer is the agent (actor.agent@1) with its level. The level never widens the floor: money, passwords, deletions and sending to a new recipient ask at every level. AGENT_ID and THREAD_ID are optional echoes for a caller changing a level from a thread; Actor checks the agent in the path and stores the agent level only.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "level"
++ ],
++ "properties": {
++ "level": {
++ "type": "string",
++ "enum": [
++ "ask",
++ "auto-edits",
++ "approve-for-me",
++ "full"
++ ]
++ },
++ "agent_id": {
++ "type": "string",
++ "pattern": "^agt_[0-9A-HJKMNP-TV-Z]{26}$"
++ },
++ "thread_id": {
++ "type": "string",
++ "pattern": "^tsk_[0-9A-HJKMNP-TV-Z]{26}$"
++ },
++ "reason": {
++ "type": "string",
++ "maxLength": 300
++ }
++ }
++}
ddiff --git a/contracts/actor/task-create-request.v1.json b/contracts/actor/task-create-request.v1.json
iindex 52a19a59..79e0effa 100644
---- a/contracts/actor/task-create-request.v1.json
++++ b/contracts/actor/task-create-request.v1.json
@@@ -2,7 +2,7 @@
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://openvibe.network/contracts/actor/task-create-request.v1.json",
"title": "ActorTaskCreateRequest",
-- "description": "actor.task-create-request@1: the body of POST /api/v1/tasks on OpenVibe.Actor (capability actor.task.create), the creation subset of platform.task@1. TASK is the instruction in plain words. MODE is the planner objective (default balanced). BUDGET caps what this task may cost (per_task_usd) and what the caller's tasks may cost in one UTC day (per_day_usd); either may be left out for the person's free-allowance defaults, and a value above the person's tier is refused 422 actor.budget.over_tier, never silently lowered. AGENT pins one agent system by its id from GET /api/v1/agents (routing still checks that it can take the task). IDEMPOTENCY_KEY: a repeat from the same requester within 24 h with an identical body answers the first task (200), with a different body 409 actor.idempotency.conflict. WEBHOOKS (at most 8): each an https URL and the state changes to deliver there (the names of platform.task@1 `state`). Actor signs every delivery with a secret it mints for the task, returned once as `webhook_secret` in the answer that created it (and in an idempotent repeat), and POSTs actor.task-webhook@1 through its egress guard: public addresses only, ports 443 or 8443, no credentials in the URL, never a redirect. A URL that cannot be delivered to is refused 422 actor.webhook.refused. A webhook may instead name a project secret (`secret_ref`, ADR-056): its deliveries are then signed by OpenVibe.Network with that secret, in the same headers, and no webhook_secret is minted when every webhook names one. A secret_ref on a task outside a project is refused 422 actor.webhook.secret_unavailable.",
++ "description": "actor.task-create-request@1: the body of POST /api/v1/tasks on OpenVibe.Actor (capability actor.task.create), the creation subset of platform.task@1. TASK is the instruction in plain words. MODE is the planner objective (default balanced). BUDGET caps what this task may cost (per_task_usd) and what the caller's tasks may cost in one UTC day (per_day_usd); either may be left out for the person's free-allowance defaults, and a value above the person's tier is refused 422 actor.budget.over_tier, never silently lowered. AGENT pins one agent system by its id from GET /api/v1/agent-systems, the public catalog (routing still checks that it can take the task); AGENT_ID names one of the caller's own agent contacts from GET /api/v1/agents to run this task as (absent: Vibe, their first agent). LEVEL is the thread's approval level; the effective level is the higher of the agent's own level and this one, inherited along the person's own parent chain and never from outside work. IDEMPOTENCY_KEY: a repeat from the same requester within 24 h with an identical body answers the first task (200), with a different body 409 actor.idempotency.conflict. WEBHOOKS (at most 8): each an https URL and the state changes to deliver there (the names of platform.task@1 `state`). Actor signs every delivery with a secret it mints for the task, returned once as `webhook_secret` in the answer that created it (and in an idempotent repeat), and POSTs actor.task-webhook@1 through its egress guard: public addresses only, ports 443 or 8443, no credentials in the URL, never a redirect. A URL that cannot be delivered to is refused 422 actor.webhook.refused. A webhook may instead name a project secret (`secret_ref`, ADR-056): its deliveries are then signed by OpenVibe.Network with that secret, in the same headers, and no webhook_secret is minted when every webhook names one. A secret_ref on a task outside a project is refused 422 actor.webhook.secret_unavailable.",
"type": "object",
"additionalProperties": false,
"required": [
@@@ -99,6 +99,22 @@
}
},
"description": "Where Actor tells the caller about this task's state changes (plan T17)."
++ },
++ "agent_id": {
++ "type": "string",
++ "pattern": "^agt_[0-9A-HJKMNP-TV-Z]{26}$",
++ "description": "One of the caller's own agent contacts (actor.agent@1) the task runs as. Absent: their Vibe, created on first read. The public agent-system catalog stays in `agent`."
++ },
++ "level": {
++ "type": "string",
++ "enum": [
++ "ask",
++ "auto-edits",
++ "approve-for-me",
++ "full"
++ ],
++ "default": "ask",
++ "description": "The thread's approval level. The effective level is max(the agent's level, this level, the levels of the person's own parent tasks). The always-ask floor still applies."
}
},
"examples": [
ddiff --git a/contracts/catalog.json b/contracts/catalog.json
iindex c25f9c4c..36690bfc 100644
---- a/contracts/catalog.json
++++ b/contracts/catalog.json
@@@ -7309,6 +7309,36 @@
"status": "active",
"adr": "ADR-044"
},
++ {
++ "id": "actor.agent",
++ "version": "1.0.0",
++ "owner": "actor",
++ "schema": "actor/agent.v1.json",
++ "visibility": "public",
++ "compatibility": "backward",
++ "status": "active",
++ "adr": "ADR-044"
++ },
++ {
++ "id": "actor.agent-list",
++ "version": "1.0.0",
++ "owner": "actor",
++ "schema": "actor/agent-list.v1.json",
++ "visibility": "public",
++ "compatibility": "backward",
++ "status": "active",
++ "adr": "ADR-044"
++ },
++ {
++ "id": "actor.level-change",
++ "version": "1.0.0",
++ "owner": "actor",
++ "schema": "actor/level-change.v1.json",
++ "visibility": "public",
++ "compatibility": "backward",
++ "status": "active",
++ "adr": "ADR-044"
++ },
{
"id": "actor.wait",
"version": "1.0.0",
ddiff --git a/contracts/platform/task.v1.json b/contracts/platform/task.v1.json
iindex 3e439a25..cb22ddb9 100644
---- a/contracts/platform/task.v1.json
++++ b/contracts/platform/task.v1.json
@@@ -2,7 +2,7 @@
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://openvibe.network/contracts/platform/task.v1.json",
"title": "Task",
-- "description": "platform.task@1 (plan T17, ADR-044): one task at OpenVibe.Actor's task router. POST /api/v1/tasks (actor.task.create) creates it from a plain-language `task` plus a `mode` and a `budget`; the router mints `id`, sets `state` and `created_at`, picks a backend from the registered agent systems, runs the task, verifies the result, escalates or fails over, and answers with `result`, `cost` and `explanation`. GET /api/v1/tasks/{id} (actor.task.read) reads the same resource. Progress streams as server-sent events from `progress.stream_url` (actor.task-event@1; the task's own counter in `progress.last_seq`); `cancel` records that a cancel was requested (POST /api/v1/tasks/{id}/cancel), `error` says why a task failed, and `webhooks` are the registered endpoints the router delivers each state change to (actor.task-webhook@1, signed with `webhook_secret`, which only the creating answer carries). Owned by `network` like every other platform.* contract and implemented by OpenVibe.Actor (manifests/services/actor.json). This v1 contract may grow optional fields.",
++ "description": "platform.task@1 (plan T17, ADR-044): one task at OpenVibe.Actor's task router. POST /api/v1/tasks (actor.task.create) creates it from a plain-language `task` plus a `mode` and a `budget`; the router mints `id`, sets `state` and `created_at`, picks a backend from the registered agent systems, runs the task, verifies the result, escalates or fails over, and answers with `result`, `cost` and `explanation`. GET /api/v1/tasks/{id} (actor.task.read) reads the same resource. Progress streams as server-sent events from `progress.stream_url` (actor.task-event@1; the task's own counter in `progress.last_seq`); `cancel` records that a cancel was requested (POST /api/v1/tasks/{id}/cancel), `error` says why a task failed, and `webhooks` are the registered endpoints the router delivers each state change to (actor.task-webhook@1, signed with `webhook_secret`, which only the creating answer carries). Owned by `network` like every other platform.* contract and implemented by OpenVibe.Actor (manifests/services/actor.json). This v1 contract may grow optional fields. A-1 adds AGENT_ID (the agent contact the task runs as; absent means the person's Vibe), LEVEL (the thread's own approval level), EFFECTIVE_LEVEL (max of the agent level and the person's own inherited line) and AGENT_LEVEL (the agent contact's own level), so a reader never has to guess why a step did or did not ask.",
"$comment": "Additive optional fields may extend this v1 contract. It is the task resource, not a device frame: Actor's link is HTTP/SSE where Run's is the Node WebSocket.",
"type": "object",
"additionalProperties": false,
@@@ -279,6 +279,41 @@
"type": "string",
"pattern": "^whsec_[A-Za-z0-9_-]{43}$",
"description": "The secret every webhook delivery of this task is signed with (X-OpenVibe-Signature-V2: t=<unix seconds>,v2=<hex HMAC-SHA256 of \"<t>.<raw body>\">, verified by openvibe-sdk/events verifyDeliveryV2). Present only in the answer that created the task (and an idempotent repeat of it), never in a read or a list; erased once the task has ended and its deliveries are done."
++ },
++ "agent_id": {
++ "type": "string",
++ "pattern": "^agt_[0-9A-HJKMNP-TV-Z]{26}$",
++ "description": "The agent contact (actor.agent@1) this task runs as. Absent on a task with no person (a service or project task); a person's task defaults to their Vibe, created on first read."
++ },
++ "level": {
++ "type": "string",
++ "enum": [
++ "ask",
++ "auto-edits",
++ "approve-for-me",
++ "full"
++ ],
++ "description": "The thread's own approval level (the task is the thread). Default ask."
++ },
++ "effective_level": {
++ "type": "string",
++ "enum": [
++ "ask",
++ "auto-edits",
++ "approve-for-me",
++ "full"
++ ],
++ "description": "The level Actor applies: the higher of the agent contact's level and the thread line's levels. It inherits only along this person's own parent tasks, never from another person's or a service's work. The always-ask floor still applies."
++ },
++ "agent_level": {
++ "type": "string",
++ "enum": [
++ "ask",
++ "auto-edits",
++ "approve-for-me",
++ "full"
++ ],
++ "description": "The agent contact's own level, before the thread's level is raised above it."
}
},
"allOf": [
ddiff --git a/fixtures/actor.agent-list/invalid/unknown-engine.json b/fixtures/actor.agent-list/invalid/unknown-engine.json
nnew file mode 100644
iindex 00000000..64fea3fa
---- /dev/null
++++ b/fixtures/actor.agent-list/invalid/unknown-engine.json
@@@ -0,0 +1,17 @@
++{
++ "agents": [
++ {
++ "id": "agt_01M4C49CW34NGX7TR2TNRVFWNW",
++ "owner": "user:usr_01J8Z3Q4R5S6T7V8W9X0Y1Z2A1",
++ "name": "Vibe",
++ "face": "preset:vibe",
++ "voice": null,
++ "model": { "engine": "toaster", "model": "smart" },
++ "computer": null,
++ "apps": [],
++ "memory": null,
++ "level": "ask",
++ "created_at": "2026-11-07T09:30:00.000Z"
++ }
++ ]
++}
ddiff --git a/fixtures/actor.agent-list/valid/mine.json b/fixtures/actor.agent-list/valid/mine.json
nnew file mode 100644
iindex 00000000..30866055
---- /dev/null
++++ b/fixtures/actor.agent-list/valid/mine.json
@@@ -0,0 +1,17 @@
++{
++ "agents": [
++ {
++ "id": "agt_01M4C49CW34NGX7TR2TNRVFWNW",
++ "owner": "user:usr_01J8Z3Q4R5S6T7V8W9X0Y1Z2A1",
++ "name": "Vibe",
++ "face": "preset:vibe",
++ "voice": null,
++ "model": { "engine": "runtime", "model": "smart" },
++ "computer": null,
++ "apps": [],
++ "memory": null,
++ "level": "ask",
++ "created_at": "2026-11-07T09:30:00.000Z"
++ }
++ ]
++}
ddiff --git a/fixtures/actor.agent/invalid/bad-level.json b/fixtures/actor.agent/invalid/bad-level.json
nnew file mode 100644
iindex 00000000..d2131248
---- /dev/null
++++ b/fixtures/actor.agent/invalid/bad-level.json
@@@ -0,0 +1,13 @@
++{
++ "id": "agt_01M4C49CW34NGX7TR2TNRVFWNW",
++ "owner": "user:usr_01J8Z3Q4R5S6T7V8W9X0Y1Z2A1",
++ "name": "Vibe",
++ "face": "preset:vibe",
++ "voice": null,
++ "model": { "engine": "runtime", "model": "smart" },
++ "computer": null,
++ "apps": [],
++ "memory": null,
++ "level": "sometimes",
++ "created_at": "2026-11-07T09:30:00.000Z"
++}
ddiff --git a/fixtures/actor.agent/invalid/missing-face.json b/fixtures/actor.agent/invalid/missing-face.json
nnew file mode 100644
iindex 00000000..31fe1c73
---- /dev/null
++++ b/fixtures/actor.agent/invalid/missing-face.json
@@@ -0,0 +1,12 @@
++{
++ "id": "agt_01M4C49CW34NGX7TR2TNRVFWNW",
++ "owner": "user:usr_01J8Z3Q4R5S6T7V8W9X0Y1Z2A1",
++ "name": "Vibe",
++ "voice": null,
++ "model": { "engine": "runtime", "model": "smart" },
++ "computer": null,
++ "apps": [],
++ "memory": null,
++ "level": "ask",
++ "created_at": "2026-11-07T09:30:00.000Z"
++}
ddiff --git a/fixtures/actor.agent/valid/researcher.json b/fixtures/actor.agent/valid/researcher.json
nnew file mode 100644
iindex 00000000..08f39e6b
---- /dev/null
++++ b/fixtures/actor.agent/valid/researcher.json
@@@ -0,0 +1,16 @@
++{
++ "id": "agt_01M4C49CW34NGX7TR2TNRVFWNY",
++ "owner": "user:usr_01J8Z3Q4R5S6T7V8W9X0Y1Z2A1",
++ "name": "Researcher",
++ "face": "https://openvibe.media/avatars/researcher.png",
++ "voice": null,
++ "model": {
++ "engine": "own-keys",
++ "model": "openai:gpt-5.1"
++ },
++ "computer": null,
++ "apps": [],
++ "memory": null,
++ "level": "approve-for-me",
++ "created_at": "2026-11-07T09:31:00.000Z"
++}
ddiff --git a/fixtures/actor.agent/valid/vibe.json b/fixtures/actor.agent/valid/vibe.json
nnew file mode 100644
iindex 00000000..94c5a0fd
---- /dev/null
++++ b/fixtures/actor.agent/valid/vibe.json
@@@ -0,0 +1,19 @@
++{
++ "id": "agt_01M4C49CW34NGX7TR2TNRVFWNW",
++ "owner": "user:usr_01J8Z3Q4R5S6T7V8W9X0Y1Z2A1",
++ "name": "Vibe",
++ "face": "preset:vibe",
++ "voice": "ov-voice-aria",
++ "model": {
++ "engine": "runtime",
++ "model": "smart"
++ },
++ "computer": {
++ "kind": "kept-browser",
++ "placement": "auto"
++ },
++ "apps": ["connect.github", "connect.slack"],
++ "memory": "mems_01M4C49CW7R8S9T0A1B2C3D4E5",
++ "level": "ask",
++ "created_at": "2026-11-07T09:30:00.000Z"
++}
ddiff --git a/fixtures/actor.level-change/invalid/unknown-level.json b/fixtures/actor.level-change/invalid/unknown-level.json
nnew file mode 100644
iindex 00000000..6df63bc9
---- /dev/null
++++ b/fixtures/actor.level-change/invalid/unknown-level.json
@@@ -0,0 +1,3 @@
++{
++ "level": "everything"
++}
ddiff --git a/fixtures/actor.level-change/valid/full.json b/fixtures/actor.level-change/valid/full.json
nnew file mode 100644
iindex 00000000..a32551f7
---- /dev/null
++++ b/fixtures/actor.level-change/valid/full.json
@@@ -0,0 +1,5 @@
++{
++ "level": "full",
++ "agent_id": "agt_01M4C49CW34NGX7TR2TNRVFWNW",
++ "reason": "The person is watching this run."
++}
ddiff --git a/generated/json-schema/bundle.json b/generated/json-schema/bundle.json
iindex ba310e4c..c3721957 100644
---- a/generated/json-schema/bundle.json
++++ b/generated/json-schema/bundle.json
@@@ -74702,7 +74702,7 @@
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://openvibe.network/contracts/platform/task.v1.json",
"title": "Task",
-- "description": "platform.task@1 (plan T17, ADR-044): one task at OpenVibe.Actor's task router. POST /api/v1/tasks (actor.task.create) creates it from a plain-language `task` plus a `mode` and a `budget`; the router mints `id`, sets `state` and `created_at`, picks a backend from the registered agent systems, runs the task, verifies the result, escalates or fails over, and answers with `result`, `cost` and `explanation`. GET /api/v1/tasks/{id} (actor.task.read) reads the same resource. Progress streams as server-sent events from `progress.stream_url` (actor.task-event@1; the task's own counter in `progress.last_seq`); `cancel` records that a cancel was requested (POST /api/v1/tasks/{id}/cancel), `error` says why a task failed, and `webhooks` are the registered endpoints the router delivers each state change to (actor.task-webhook@1, signed with `webhook_secret`, which only the creating answer carries). Owned by `network` like every other platform.* contract and implemented by OpenVibe.Actor (manifests/services/actor.json). This v1 contract may grow optional fields.",
++ "description": "platform.task@1 (plan T17, ADR-044): one task at OpenVibe.Actor's task router. POST /api/v1/tasks (actor.task.create) creates it from a plain-language `task` plus a `mode` and a `budget`; the router mints `id`, sets `state` and `created_at`, picks a backend from the registered agent systems, runs the task, verifies the result, escalates or fails over, and answers with `result`, `cost` and `explanation`. GET /api/v1/tasks/{id} (actor.task.read) reads the same resource. Progress streams as server-sent events from `progress.stream_url` (actor.task-event@1; the task's own counter in `progress.last_seq`); `cancel` records that a cancel was requested (POST /api/v1/tasks/{id}/cancel), `error` says why a task failed, and `webhooks` are the registered endpoints the router delivers each state change to (actor.task-webhook@1, signed with `webhook_secret`, which only the creating answer carries). Owned by `network` like every other platform.* contract and implemented by OpenVibe.Actor (manifests/services/actor.json). This v1 contract may grow optional fields. A-1 adds AGENT_ID (the agent contact the task runs as; absent means the person's Vibe), LEVEL (the thread's own approval level), EFFECTIVE_LEVEL (max of the agent level and the person's own inherited line) and AGENT_LEVEL (the agent contact's own level), so a reader never has to guess why a step did or did not ask.",
"$comment": "Additive optional fields may extend this v1 contract. It is the task resource, not a device frame: Actor's link is HTTP/SSE where Run's is the Node WebSocket.",
"type": "object",
"additionalProperties": false,
@@@ -74979,6 +74979,41 @@
"type": "string",
"pattern": "^whsec_[A-Za-z0-9_-]{43}$",
"description": "The secret every webhook delivery of this task is signed with (X-OpenVibe-Signature-V2: t=<unix seconds>,v2=<hex HMAC-SHA256 of \"<t>.<raw body>\">, verified by openvibe-sdk/events verifyDeliveryV2). Present only in the answer that created the task (and an idempotent repeat of it), never in a read or a list; erased once the task has ended and its deliveries are done."
++ },
++ "agent_id": {
++ "type": "string",
++ "pattern": "^agt_[0-9A-HJKMNP-TV-Z]{26}$",
++ "description": "The agent contact (actor.agent@1) this task runs as. Absent on a task with no person (a service or project task); a person's task defaults to their Vibe, created on first read."
++ },
++ "level": {
++ "type": "string",
++ "enum": [
++ "ask",
++ "auto-edits",
++ "approve-for-me",
++ "full"
++ ],
++ "description": "The thread's own approval level (the task is the thread). Default ask."
++ },
++ "effective_level": {
++ "type": "string",
++ "enum": [
++ "ask",
++ "auto-edits",
++ "approve-for-me",
++ "full"
++ ],
++ "description": "The level Actor applies: the higher of the agent contact's level and the thread line's levels. It inherits only along this person's own parent tasks, never from another person's or a service's work. The always-ask floor still applies."
++ },
++ "agent_level": {
++ "type": "string",
++ "enum": [
++ "ask",
++ "auto-edits",
++ "approve-for-me",
++ "full"
++ ],
++ "description": "The agent contact's own level, before the thread's level is raised above it."
}
},
"allOf": [
@@@ -83018,7 +83053,7 @@
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://openvibe.network/contracts/actor/task-create-request.v1.json",
"title": "ActorTaskCreateRequest",
-- "description": "actor.task-create-request@1: the body of POST /api/v1/tasks on OpenVibe.Actor (capability actor.task.create), the creation subset of platform.task@1. TASK is the instruction in plain words. MODE is the planner objective (default balanced). BUDGET caps what this task may cost (per_task_usd) and what the caller's tasks may cost in one UTC day (per_day_usd); either may be left out for the person's free-allowance defaults, and a value above the person's tier is refused 422 actor.budget.over_tier, never silently lowered. AGENT pins one agent system by its id from GET /api/v1/agents (routing still checks that it can take the task). IDEMPOTENCY_KEY: a repeat from the same requester within 24 h with an identical body answers the first task (200), with a different body 409 actor.idempotency.conflict. WEBHOOKS (at most 8): each an https URL and the state changes to deliver there (the names of platform.task@1 `state`). Actor signs every delivery with a secret it mints for the task, returned once as `webhook_secret` in the answer that created it (and in an idempotent repeat), and POSTs actor.task-webhook@1 through its egress guard: public addresses only, ports 443 or 8443, no credentials in the URL, never a redirect. A URL that cannot be delivered to is refused 422 actor.webhook.refused. A webhook may instead name a project secret (`secret_ref`, ADR-056): its deliveries are then signed by OpenVibe.Network with that secret, in the same headers, and no webhook_secret is minted when every webhook names one. A secret_ref on a task outside a project is refused 422 actor.webhook.secret_unavailable.",
++ "description": "actor.task-create-request@1: the body of POST /api/v1/tasks on OpenVibe.Actor (capability actor.task.create), the creation subset of platform.task@1. TASK is the instruction in plain words. MODE is the planner objective (default balanced). BUDGET caps what this task may cost (per_task_usd) and what the caller's tasks may cost in one UTC day (per_day_usd); either may be left out for the person's free-allowance defaults, and a value above the person's tier is refused 422 actor.budget.over_tier, never silently lowered. AGENT pins one agent system by its id from GET /api/v1/agent-systems, the public catalog (routing still checks that it can take the task); AGENT_ID names one of the caller's own agent contacts from GET /api/v1/agents to run this task as (absent: Vibe, their first agent). LEVEL is the thread's approval level; the effective level is the higher of the agent's own level and this one, inherited along the person's own parent chain and never from outside work. IDEMPOTENCY_KEY: a repeat from the same requester within 24 h with an identical body answers the first task (200), with a different body 409 actor.idempotency.conflict. WEBHOOKS (at most 8): each an https URL and the state changes to deliver there (the names of platform.task@1 `state`). Actor signs every delivery with a secret it mints for the task, returned once as `webhook_secret` in the answer that created it (and in an idempotent repeat), and POSTs actor.task-webhook@1 through its egress guard: public addresses only, ports 443 or 8443, no credentials in the URL, never a redirect. A URL that cannot be delivered to is refused 422 actor.webhook.refused. A webhook may instead name a project secret (`secret_ref`, ADR-056): its deliveries are then signed by OpenVibe.Network with that secret, in the same headers, and no webhook_secret is minted when every webhook names one. A secret_ref on a task outside a project is refused 422 actor.webhook.secret_unavailable.",
"type": "object",
"additionalProperties": false,
"required": [
@@@ -83115,6 +83150,22 @@
}
},
"description": "Where Actor tells the caller about this task's state changes (plan T17)."
++ },
++ "agent_id": {
++ "type": "string",
++ "pattern": "^agt_[0-9A-HJKMNP-TV-Z]{26}$",
++ "description": "One of the caller's own agent contacts (actor.agent@1) the task runs as. Absent: their Vibe, created on first read. The public agent-system catalog stays in `agent`."
++ },
++ "level": {
++ "type": "string",
++ "enum": [
++ "ask",
++ "auto-edits",
++ "approve-for-me",
++ "full"
++ ],
++ "default": "ask",
++ "description": "The thread's approval level. The effective level is max(the agent's level, this level, the levels of the person's own parent tasks). The always-ask floor still applies."
}
},
"examples": [
@@@ -84564,6 +84615,225 @@
}
}
},
++ "actor.agent": {
++ "version": "1.0.0",
++ "owner": "actor",
++ "status": "active",
++ "schema": {
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/actor/agent.v1.json",
++ "title": "ActorAgent",
++ "description": "actor.agent@1: one of a person's agents as a contact (plan §12, A-1). An agent has a stable id and owner, a name and face, an optional TTS voice, the model it runs on (the OpenVibe runtime, the person's own keys, a free model on OpenVibe's GPU or their own Claude Code/Codex on a Link machine), the computer it uses (null when it has none, or one of Computer's kinds and placements), the connected apps it may use, its OpenVibe Memory scope (null when it keeps none), its approval level and when it was added. The default level is ask; money, passwords, deletions and sending to a new recipient always ask at every level, as a server-side floor.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "id",
++ "owner",
++ "name",
++ "face",
++ "voice",
++ "model",
++ "computer",
++ "apps",
++ "memory",
++ "level",
++ "created_at"
++ ],
++ "properties": {
++ "id": {
++ "type": "string",
++ "pattern": "^agt_[0-9A-HJKMNP-TV-Z]{26}$",
++ "description": "agt_<ULID>, Actor's own id for the contact. Vibe, the first agent every person gets, is one of these."
++ },
++ "owner": {
++ "type": "string",
++ "pattern": "^user:usr_[0-9A-HJKMNP-TV-Z]{26}$",
++ "description": "The person the contact belongs to (identity.subject-ref@1 in one column). Another person's agent is 404."
++ },
++ "name": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 60
++ },
++ "face": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 500,
++ "description": "An avatar ref: an https image URL, a Media id, or a preset face such as preset:researcher. The UI draws it; Actor only stores and returns it."
++ },
++ "voice": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "maxLength": 80,
++ "description": "A TTS voice id, or null when the agent has no voice. Voice calls are A-6; the field is stored now so a contact keeps its voice."
++ },
++ "model": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "engine",
++ "model"
++ ],
++ "properties": {
++ "engine": {
++ "type": "string",
++ "enum": [
++ "runtime",
++ "own-keys",
++ "open-gpu",
++ "link"
++ ],
++ "description": "runtime: OpenVibe's own agent loop; own-keys: the person's provider keys through OpenVibe.AI; open-gpu: a free open model on OpenVibe's GPU; link: the person's own Claude Code or Codex on a Link machine."
++ },
++ "model": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 120,
++ "description": "The model id on that engine (a tier such as smart, a provider:model id, an open model name, or a harness name)."
++ }
++ }
++ },
++ "computer": {
++ "oneOf": [
++ {
++ "type": "null"
++ },
++ {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "kind",
++ "placement"
++ ],
++ "properties": {
++ "kind": {
++ "type": "string",
++ "enum": [
++ "browser",
++ "kept-browser",
++ "desktop",
++ "gpu-desktop",
++ "always-on",
++ "your-computer",
++ "throwaway"
++ ],
++ "description": "Computer's kinds (plan §6): a browser, a kept browser, a Linux desktop, a GPU desktop, an always-on computer, the person's own computer, or a throwaway."
++ },
++ "placement": {
++ "type": "string",
++ "enum": [
++ "auto",
++ "link",
++ "home",
++ "ovh"
++ ],
++ "description": "Where it runs: OpenVibe decides (auto), the person's Link machine, the OpenVibe home desktops, or OVH's cloud."
++ }
++ }
++ }
++ ]
++ },
++ "apps": {
++ "type": "array",
++ "maxItems": 50,
++ "uniqueItems": true,
++ "items": {
++ "type": "string",
++ "pattern": "^[a-z][a-z0-9._-]{0,63}$"
++ },
++ "description": "Connected app ids the agent may use (Connect's catalogue slugs)."
++ },
++ "memory": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "maxLength": 100,
++ "description": "The OpenVibe Memory scope id this agent reads and writes, or null when it keeps no memory."
++ },
++ "level": {
++ "type": "string",
++ "enum": [
++ "ask",
++ "auto-edits",
++ "approve-for-me",
++ "full"
++ ],
++ "description": "The approval level (plan §12): ask (the default) asks before every act; auto-edits lets the agent edit files and run its own work without asking; approve-for-me has a reviewer model of another family decide ordinary acts; full runs without asking. The floor still asks for money, passwords, deletions and sending to a new recipient at every level."
++ },
++ "created_at": {
++ "type": "string",
++ "format": "date-time"
++ }
++ }
++ }
++ },
++ "actor.agent-list": {
++ "version": "1.0.0",
++ "owner": "actor",
++ "status": "active",
++ "schema": {
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/actor/agent-list.v1.json",
++ "title": "ActorAgentList",
++ "description": "actor.agent-list@1: GET /api/v1/agents for a signed-in person (capability actor.agent.manage): their own agent contacts, Vibe first. Vibe, the person's first agent, is created on this first read and cannot be deleted. Another person's agents are never in this list. The public agent-system catalog stays at GET /api/v1/agent-systems (actor.agent-list-result@2).",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "agents"
++ ],
++ "properties": {
++ "agents": {
++ "type": "array",
++ "maxItems": 32,
++ "items": {
++ "$ref": "agent.v1.json"
++ }
++ }
++ }
++ }
++ },
++ "actor.level-change": {
++ "version": "1.0.0",
++ "owner": "actor",
++ "status": "active",
++ "schema": {
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/actor/level-change.v1.json",
++ "title": "ActorLevelChange",
++ "description": "actor.level-change@1: the body of PUT /api/v1/agents/{id}/level (capability actor.agent.manage). LEVEL is the new approval level of the person's agent; the answer is the agent (actor.agent@1) with its level. The level never widens the floor: money, passwords, deletions and sending to a new recipient ask at every level. AGENT_ID and THREAD_ID are optional echoes for a caller changing a level from a thread; Actor checks the agent in the path and stores the agent level only.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "level"
++ ],
++ "properties": {
++ "level": {
++ "type": "string",
++ "enum": [
++ "ask",
++ "auto-edits",
++ "approve-for-me",
++ "full"
++ ]
++ },
++ "agent_id": {
++ "type": "string",
++ "pattern": "^agt_[0-9A-HJKMNP-TV-Z]{26}$"
++ },
++ "thread_id": {
++ "type": "string",
++ "pattern": "^tsk_[0-9A-HJKMNP-TV-Z]{26}$"
++ },
++ "reason": {
++ "type": "string",
++ "maxLength": 300
++ }
++ }
++ }
++ },
"actor.wait": {
"version": "1.0.0",
"owner": "actor",
ddiff --git a/generated/openapi/actor.json b/generated/openapi/actor.json
iindex 3eca5c19..ce4ce896 100644
---- a/generated/openapi/actor.json
++++ b/generated/openapi/actor.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Actor API",
-- "version": "0.321.0",
-- "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.322.0",
++ "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.322.0): each operation lists the capabilities it performs; a token for the 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"
@@@ -239,6 +239,52 @@
}
}
},
++ "/api/v1/agent-systems": {
++ "get": {
++ "operationId": "get_api_v1_agent_systems",
++ "summary": "The agent systems Actor routes to, with what each can do, its trust class, its rate card and whether it is available now (GET /api/v1/agent-systems, also GET /api/v1/agents for callers with no person'",
++ "description": "**actor.agent.read** (public): The agent systems Actor routes to, with what each can do, its trust class, its rate card and whether it is available now (GET /api/v1/agent-systems, also GET /api/v1/agents for callers with no person's session; actor.agent-list-result@2, whose model tiers and models say which model each tier resolved to), which one a task would go to in a mode, with the reason for every candidate (POST /api/v1/route { task, mode }, a platform.placement-result@1; nothing runs), and the four agent-contact presets a signed-in person can copy (GET /api/v1/agents/presets: Researcher, Inbox, Studio editor, Party host). Public; no token needed. A signed-in person's GET /api/v1/agents answers their own contacts (actor.agent-list@1) instead, so the catalog keeps this explicit path for them too.",
++ "tags": [
++ "actor.agent"
++ ],
++ "x-openvibe-capabilities": [
++ "actor.agent.read"
++ ],
++ "x-openvibe-visibility": [
++ "public"
++ ],
++ "x-openvibe-quota-class": "actor-read",
++ "security": [
++ {
++ "openvibeToken": [
++ "actor.agent.read"
++ ]
++ }
++ ],
++ "responses": {
++ "2XX": {
++ "description": "Success",
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/actor.agent-list-result.v2"
++ }
++ }
++ }
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ }
++ },
"/api/v1/agent/timeline": {
"get": {
"operationId": "get_api_v1_agent_timeline",
@@@ -334,8 +380,354 @@
"/api/v1/agents": {
"get": {
"operationId": "get_api_v1_agents",
-- "summary": "The agent systems Actor routes to, with what each can do, its trust class, its rate card and whether it is available now (GET /api/v1/agents, actor.agent-list-result@2, whose model tiers and models sa",
-- "description": "**actor.agent.read** (public): The agent systems Actor routes to, with what each can do, its trust class, its rate card and whether it is available now (GET /api/v1/agents, actor.agent-list-result@2, whose model tiers and models say which model each tier resolved to), and which one a task would go to in a mode, with the reason for every candidate (POST /api/v1/route { task, mode }, a platform.placement-result@1; nothing runs). Public; no token needed.",
++ "summary": "The agent systems Actor routes to, with what each can do, its trust class, its rate card and whether it is available now (GET /api/v1/agent-systems, also GET /api/v1/agents for callers with no person'",
++ "description": "**actor.agent.read** (public): The agent systems Actor routes to, with what each can do, its trust class, its rate card and whether it is available now (GET /api/v1/agent-systems, also GET /api/v1/agents for callers with no person's session; actor.agent-list-result@2, whose model tiers and models say which model each tier resolved to), which one a task would go to in a mode, with the reason for every candidate (POST /api/v1/route { task, mode }, a platform.placement-result@1; nothing runs), and the four agent-contact presets a signed-in person can copy (GET /api/v1/agents/presets: Researcher, Inbox, Studio editor, Party host). Public; no token needed. A signed-in person's GET /api/v1/agents answers their own contacts (actor.agent-list@1) instead, so the catalog keeps this explicit path for them too.",
++ "tags": [
++ "actor.agent"
++ ],
++ "x-openvibe-capabilities": [
++ "actor.agent.read"
++ ],
++ "x-openvibe-visibility": [
++ "public"
++ ],
++ "x-openvibe-quota-class": "actor-read",
++ "security": [
++ {
++ "openvibeToken": [
++ "actor.agent.read"
++ ]
++ }
++ ],
++ "responses": {
++ "2XX": {
++ "description": "Success",
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/actor.agent-list-result.v2"
++ }
++ }
++ }
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ },
++ "post": {
++ "operationId": "post_api_v1_agents",
++ "summary": "Keep your agents on OpenVibe.Actor.",
++ "description": "**actor.agent.manage** (public): Keep your agents on OpenVibe.Actor. A contact (plan §12 A-1; actor.agent@1, actor.agent-list@1): GET/POST /api/v1/agents, GET/PATCH/DELETE /api/v1/agents/:id and PUT /api/v1/agents/:id/level (actor.level-change@1), with Vibe created on the first read and never deletable and four presets at GET /api/v1/agents/presets to copy. A personal run (standing instructions, mode, a budget per run, a daily run cap and a schedule): create, read, change and delete one, read, add, edit and delete what it remembers, or forget everything, and read what it suggested adding to its instructions and apply, dismiss or undo a suggestion. A person's agents are theirs alone; another person's agent is 404.",
++ "tags": [
++ "actor.agent"
++ ],
++ "x-openvibe-capabilities": [
++ "actor.agent.manage"
++ ],
++ "x-openvibe-visibility": [
++ "public"
++ ],
++ "x-openvibe-quota-class": "actor-task",
++ "security": [
++ {
++ "openvibeToken": [
++ "actor.agent.manage"
++ ]
++ }
++ ],
++ "requestBody": {
++ "required": false,
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/actor.agent-manage-request.v1"
++ }
++ }
++ }
++ },
++ "responses": {
++ "2XX": {
++ "description": "Success",
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/actor.agent-manage-result.v1"
++ }
++ }
++ }
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ }
++ },
++ "/api/v1/agents/{id}": {
++ "delete": {
++ "operationId": "delete_api_v1_agents_id",
++ "summary": "Keep your agents on OpenVibe.Actor.",
++ "description": "**actor.agent.manage** (public): Keep your agents on OpenVibe.Actor. A contact (plan §12 A-1; actor.agent@1, actor.agent-list@1): GET/POST /api/v1/agents, GET/PATCH/DELETE /api/v1/agents/:id and PUT /api/v1/agents/:id/level (actor.level-change@1), with Vibe created on the first read and never deletable and four presets at GET /api/v1/agents/presets to copy. A personal run (standing instructions, mode, a budget per run, a daily run cap and a schedule): create, read, change and delete one, read, add, edit and delete what it remembers, or forget everything, and read what it suggested adding to its instructions and apply, dismiss or undo a suggestion. A person's agents are theirs alone; another person's agent is 404.",
++ "tags": [
++ "actor.agent"
++ ],
++ "x-openvibe-capabilities": [
++ "actor.agent.manage"
++ ],
++ "x-openvibe-visibility": [
++ "public"
++ ],
++ "x-openvibe-quota-class": "actor-task",
++ "security": [
++ {
++ "openvibeToken": [
++ "actor.agent.manage"
++ ]
++ }
++ ],
++ "x-openvibe-input": {
++ "$ref": "#/components/schemas/actor.agent-manage-request.v1"
++ },
++ "parameters": [
++ {
++ "name": "id",
++ "in": "path",
++ "required": true,
++ "schema": {
++ "type": "string"
++ }
++ }
++ ],
++ "responses": {
++ "2XX": {
++ "description": "Success",
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/actor.agent-manage-result.v1"
++ }
++ }
++ }
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ },
++ "get": {
++ "operationId": "get_api_v1_agents_id",
++ "summary": "Keep your agents on OpenVibe.Actor.",
++ "description": "**actor.agent.manage** (public): Keep your agents on OpenVibe.Actor. A contact (plan §12 A-1; actor.agent@1, actor.agent-list@1): GET/POST /api/v1/agents, GET/PATCH/DELETE /api/v1/agents/:id and PUT /api/v1/agents/:id/level (actor.level-change@1), with Vibe created on the first read and never deletable and four presets at GET /api/v1/agents/presets to copy. A personal run (standing instructions, mode, a budget per run, a daily run cap and a schedule): create, read, change and delete one, read, add, edit and delete what it remembers, or forget everything, and read what it suggested adding to its instructions and apply, dismiss or undo a suggestion. A person's agents are theirs alone; another person's agent is 404.",
++ "tags": [
++ "actor.agent"
++ ],
++ "x-openvibe-capabilities": [
++ "actor.agent.manage"
++ ],
++ "x-openvibe-visibility": [
++ "public"
++ ],
++ "x-openvibe-quota-class": "actor-task",
++ "security": [
++ {
++ "openvibeToken": [
++ "actor.agent.manage"
++ ]
++ }
++ ],
++ "x-openvibe-input": {
++ "$ref": "#/components/schemas/actor.agent-manage-request.v1"
++ },
++ "parameters": [
++ {
++ "name": "id",
++ "in": "path",
++ "required": true,
++ "schema": {
++ "type": "string"
++ }
++ }
++ ],
++ "responses": {
++ "2XX": {
++ "description": "Success",
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/actor.agent-manage-result.v1"
++ }
++ }
++ }
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ },
++ "patch": {
++ "operationId": "patch_api_v1_agents_id",
++ "summary": "Keep your agents on OpenVibe.Actor.",
++ "description": "**actor.agent.manage** (public): Keep your agents on OpenVibe.Actor. A contact (plan §12 A-1; actor.agent@1, actor.agent-list@1): GET/POST /api/v1/agents, GET/PATCH/DELETE /api/v1/agents/:id and PUT /api/v1/agents/:id/level (actor.level-change@1), with Vibe created on the first read and never deletable and four presets at GET /api/v1/agents/presets to copy. A personal run (standing instructions, mode, a budget per run, a daily run cap and a schedule): create, read, change and delete one, read, add, edit and delete what it remembers, or forget everything, and read what it suggested adding to its instructions and apply, dismiss or undo a suggestion. A person's agents are theirs alone; another person's agent is 404.",
++ "tags": [
++ "actor.agent"
++ ],
++ "x-openvibe-capabilities": [
++ "actor.agent.manage"
++ ],
++ "x-openvibe-visibility": [
++ "public"
++ ],
++ "x-openvibe-quota-class": "actor-task",
++ "security": [
++ {
++ "openvibeToken": [
++ "actor.agent.manage"
++ ]
++ }
++ ],
++ "requestBody": {
++ "required": false,
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/actor.agent-manage-request.v1"
++ }
++ }
++ }
++ },
++ "parameters": [
++ {
++ "name": "id",
++ "in": "path",
++ "required": true,
++ "schema": {
++ "type": "string"
++ }
++ }
++ ],
++ "responses": {
++ "2XX": {
++ "description": "Success",
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/actor.agent-manage-result.v1"
++ }
++ }
++ }
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ }
++ },
++ "/api/v1/agents/{id}/level": {
++ "put": {
++ "operationId": "put_api_v1_agents_id_level",
++ "summary": "Keep your agents on OpenVibe.Actor.",
++ "description": "**actor.agent.manage** (public): Keep your agents on OpenVibe.Actor. A contact (plan §12 A-1; actor.agent@1, actor.agent-list@1): GET/POST /api/v1/agents, GET/PATCH/DELETE /api/v1/agents/:id and PUT /api/v1/agents/:id/level (actor.level-change@1), with Vibe created on the first read and never deletable and four presets at GET /api/v1/agents/presets to copy. A personal run (standing instructions, mode, a budget per run, a daily run cap and a schedule): create, read, change and delete one, read, add, edit and delete what it remembers, or forget everything, and read what it suggested adding to its instructions and apply, dismiss or undo a suggestion. A person's agents are theirs alone; another person's agent is 404.",
++ "tags": [
++ "actor.agent"
++ ],
++ "x-openvibe-capabilities": [
++ "actor.agent.manage"
++ ],
++ "x-openvibe-visibility": [
++ "public"
++ ],
++ "x-openvibe-quota-class": "actor-task",
++ "security": [
++ {
++ "openvibeToken": [
++ "actor.agent.manage"
++ ]
++ }
++ ],
++ "requestBody": {
++ "required": false,
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/actor.agent-manage-request.v1"
++ }
++ }
++ }
++ },
++ "parameters": [
++ {
++ "name": "id",
++ "in": "path",
++ "required": true,
++ "schema": {
++ "type": "string"
++ }
++ }
++ ],
++ "responses": {
++ "2XX": {
++ "description": "Success",
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/actor.agent-manage-result.v1"
++ }
++ }
++ }
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ }
++ },
++ "/api/v1/agents/presets": {
++ "get": {
++ "operationId": "get_api_v1_agents_presets",
++ "summary": "The agent systems Actor routes to, with what each can do, its trust class, its rate card and whether it is available now (GET /api/v1/agent-systems, also GET /api/v1/agents for callers with no person'",
++ "description": "**actor.agent.read** (public): The agent systems Actor routes to, with what each can do, its trust class, its rate card and whether it is available now (GET /api/v1/agent-systems, also GET /api/v1/agents for callers with no person's session; actor.agent-list-result@2, whose model tiers and models say which model each tier resolved to), which one a task would go to in a mode, with the reason for every candidate (POST /api/v1/route { task, mode }, a platform.placement-result@1; nothing runs), and the four agent-contact presets a signed-in person can copy (GET /api/v1/agents/presets: Researcher, Inbox, Studio editor, Party host). Public; no token needed. A signed-in person's GET /api/v1/agents answers their own contacts (actor.agent-list@1) instead, so the catalog keeps this explicit path for them too.",
"tags": [
"actor.agent"
],
@@@ -436,8 +828,8 @@
"/api/v1/me/agents": {
"get": {
"operationId": "get_api_v1_me_agents",
-- "summary": "Keep your personal agents on OpenVibe.Actor: create, read, change and delete an agent (standing instructions, mode, a budget per run, a daily run cap and a schedule), read, add, edit and delete what i",
-- "description": "**actor.agent.manage** (public): Keep your personal agents on OpenVibe.Actor: create, read, change and delete an agent (standing instructions, mode, a budget per run, a daily run cap and a schedule), read, add, edit and delete what it remembers, or forget everything, and read what it suggested adding to its instructions and apply, dismiss or undo a suggestion. A person's agents are theirs alone; another person's agent is 404.",
++ "summary": "Keep your agents on OpenVibe.Actor.",
++ "description": "**actor.agent.manage** (public): Keep your agents on OpenVibe.Actor. A contact (plan §12 A-1; actor.agent@1, actor.agent-list@1): GET/POST /api/v1/agents, GET/PATCH/DELETE /api/v1/agents/:id and PUT /api/v1/agents/:id/level (actor.level-change@1), with Vibe created on the first read and never deletable and four presets at GET /api/v1/agents/presets to copy. A personal run (standing instructions, mode, a budget per run, a daily run cap and a schedule): create, read, change and delete one, read, add, edit and delete what it remembers, or forget everything, and read what it suggested adding to its instructions and apply, dismiss or undo a suggestion. A person's agents are theirs alone; another person's agent is 404.",
"tags": [
"actor.agent"
],
@@@ -483,8 +875,8 @@
},
"post": {
"operationId": "post_api_v1_me_agents",
-- "summary": "Keep your personal agents on OpenVibe.Actor: create, read, change and delete an agent (standing instructions, mode, a budget per run, a daily run cap and a schedule), read, add, edit and delete what i",
-- "description": "**actor.agent.manage** (public): Keep your personal agents on OpenVibe.Actor: create, read, change and delete an agent (standing instructions, mode, a budget per run, a daily run cap and a schedule), read, add, edit and delete what it remembers, or forget everything, and read what it suggested adding to its instructions and apply, dismiss or undo a suggestion. A person's agents are theirs alone; another person's agent is 404.",
++ "summary": "Keep your agents on OpenVibe.Actor.",
++ "description": "**actor.agent.manage** (public): Keep your agents on OpenVibe.Actor. A contact (plan §12 A-1; actor.agent@1, actor.agent-list@1): GET/POST /api/v1/agents, GET/PATCH/DELETE /api/v1/agents/:id and PUT /api/v1/agents/:id/level (actor.level-change@1), with Vibe created on the first read and never deletable and four presets at GET /api/v1/agents/presets to copy. A personal run (standing instructions, mode, a budget per run, a daily run cap and a schedule): create, read, change and delete one, read, add, edit and delete what it remembers, or forget everything, and read what it suggested adding to its instructions and apply, dismiss or undo a suggestion. A person's agents are theirs alone; another person's agent is 404.",
"tags": [
"actor.agent"
],
@@@ -539,8 +931,8 @@
"/api/v1/me/agents/{id}": {
"delete": {
"operationId": "delete_api_v1_me_agents_id",
-- "summary": "Keep your personal agents on OpenVibe.Actor: create, read, change and delete an agent (standing instructions, mode, a budget per run, a daily run cap and a schedule), read, add, edit and delete what i",
-- "description": "**actor.agent.manage** (public): Keep your personal agents on OpenVibe.Actor: create, read, change and delete an agent (standing instructions, mode, a budget per run, a daily run cap and a schedule), read, add, edit and delete what it remembers, or forget everything, and read what it suggested adding to its instructions and apply, dismiss or undo a suggestion. A person's agents are theirs alone; another person's agent is 404.",
++ "summary": "Keep your agents on OpenVibe.Actor.",
++ "description": "**actor.agent.manage** (public): Keep your agents on OpenVibe.Actor. A contact (plan §12 A-1; actor.agent@1, actor.agent-list@1): GET/POST /api/v1/agents, GET/PATCH/DELETE /api/v1/agents/:id and PUT /api/v1/agents/:id/level (actor.level-change@1), with Vibe created on the first read and never deletable and four presets at GET /api/v1/agents/presets to copy. A personal run (standing instructions, mode, a budget per run, a daily run cap and a schedule): create, read, change and delete one, read, add, edit and delete what it remembers, or forget everything, and read what it suggested adding to its instructions and apply, dismiss or undo a suggestion. A person's agents are theirs alone; another person's agent is 404.",
"tags": [
"actor.agent"
],
@@@ -596,8 +988,8 @@
},
"get": {
"operationId": "get_api_v1_me_agents_id",
-- "summary": "Keep your personal agents on OpenVibe.Actor: create, read, change and delete an agent (standing instructions, mode, a budget per run, a daily run cap and a schedule), read, add, edit and delete what i",
-- "description": "**actor.agent.manage** (public): Keep your personal agents on OpenVibe.Actor: create, read, change and delete an agent (standing instructions, mode, a budget per run, a daily run cap and a schedule), read, add, edit and delete what it remembers, or forget everything, and read what it suggested adding to its instructions and apply, dismiss or undo a suggestion. A person's agents are theirs alone; another person's agent is 404.",
++ "summary": "Keep your agents on OpenVibe.Actor.",
++ "description": "**actor.agent.manage** (public): Keep your agents on OpenVibe.Actor. A contact (plan §12 A-1; actor.agent@1, actor.agent-list@1): GET/POST /api/v1/agents, GET/PATCH/DELETE /api/v1/agents/:id and PUT /api/v1/agents/:id/level (actor.level-change@1), with Vibe created on the first read and never deletable and four presets at GET /api/v1/agents/presets to copy. A personal run (standing instructions, mode, a budget per run, a daily run cap and a schedule): create, read, change and delete one, read, add, edit and delete what it remembers, or forget everything, and read what it suggested adding to its instructions and apply, dismiss or undo a suggestion. A person's agents are theirs alone; another person's agent is 404.",
"tags": [
"actor.agent"
],
@@@ -653,8 +1045,8 @@
},
"patch": {
"operationId": "patch_api_v1_me_agents_id",
-- "summary": "Keep your personal agents on OpenVibe.Actor: create, read, change and delete an agent (standing instructions, mode, a budget per run, a daily run cap and a schedule), read, add, edit and delete what i",
-- "description": "**actor.agent.manage** (public): Keep your personal agents on OpenVibe.Actor: create, read, change and delete an agent (standing instructions, mode, a budget per run, a daily run cap and a schedule), read, add, edit and delete what it remembers, or forget everything, and read what it suggested adding to its instructions and apply, dismiss or undo a suggestion. A person's agents are theirs alone; another person's agent is 404.",
++ "summary": "Keep your agents on OpenVibe.Actor.",
++ "description": "**actor.agent.manage** (public): Keep your agents on OpenVibe.Actor. A contact (plan §12 A-1; actor.agent@1, actor.agent-list@1): GET/POST /api/v1/agents, GET/PATCH/DELETE /api/v1/agents/:id and PUT /api/v1/agents/:id/level (actor.level-change@1), with Vibe created on the first read and never deletable and four presets at GET /api/v1/agents/presets to copy. A personal run (standing instructions, mode, a budget per run, a daily run cap and a schedule): create, read, change and delete one, read, add, edit and delete what it remembers, or forget everything, and read what it suggested adding to its instructions and apply, dismiss or undo a suggestion. A person's agents are theirs alone; another person's agent is 404.",
"tags": [
"actor.agent"
],
@@@ -719,8 +1111,8 @@
"/api/v1/me/agents/{id}/memory": {
"delete": {
"operationId": "delete_api_v1_me_agents_id_memory",
-- "summary": "Keep your personal agents on OpenVibe.Actor: create, read, change and delete an agent (standing instructions, mode, a budget per run, a daily run cap and a schedule), read, add, edit and delete what i",
-- "description": "**actor.agent.manage** (public): Keep your personal agents on OpenVibe.Actor: create, read, change and delete an agent (standing instructions, mode, a budget per run, a daily run cap and a schedule), read, add, edit and delete what it remembers, or forget everything, and read what it suggested adding to its instructions and apply, dismiss or undo a suggestion. A person's agents are theirs alone; another person's agent is 404.",
++ "summary": "Keep your agents on OpenVibe.Actor.",
++ "description": "**actor.agent.manage** (public): Keep your agents on OpenVibe.Actor. A contact (plan §12 A-1; actor.agent@1, actor.agent-list@1): GET/POST /api/v1/agents, GET/PATCH/DELETE /api/v1/agents/:id and PUT /api/v1/agents/:id/level (actor.level-change@1), with Vibe created on the first read and never deletable and four presets at GET /api/v1/agents/presets to copy. A personal run (standing instructions, mode, a budget per run, a daily run cap and a schedule): create, read, change and delete one, read, add, edit and delete what it remembers, or forget everything, and read what it suggested adding to its instructions and apply, dismiss or undo a suggestion. A person's agents are theirs alone; another person's agent is 404.",
"tags": [
"actor.agent"
],
@@@ -776,8 +1168,8 @@
},
"get": {
"operationId": "get_api_v1_me_agents_id_memory",
-- "summary": "Keep your personal agents on OpenVibe.Actor: create, read, change and delete an agent (standing instructions, mode, a budget per run, a daily run cap and a schedule), read, add, edit and delete what i",
-- "description": "**actor.agent.manage** (public): Keep your personal agents on OpenVibe.Actor: create, read, change and delete an agent (standing instructions, mode, a budget per run, a daily run cap and a schedule), read, add, edit and delete what it remembers, or forget everything, and read what it suggested adding to its instructions and apply, dismiss or undo a suggestion. A person's agents are theirs alone; another person's agent is 404.",
++ "summary": "Keep your agents on OpenVibe.Actor.",
++ "description": "**actor.agent.manage** (public): Keep your agents on OpenVibe.Actor. A contact (plan §12 A-1; actor.agent@1, actor.agent-list@1): GET/POST /api/v1/agents, GET/PATCH/DELETE /api/v1/agents/:id and PUT /api/v1/agents/:id/level (actor.level-change@1), with Vibe created on the first read and never deletable and four presets at GET /api/v1/agents/presets to copy. A personal run (standing instructions, mode, a budget per run, a daily run cap and a schedule): create, read, change and delete one, read, add, edit and delete what it remembers, or forget everything, and read what it suggested adding to its instructions and apply, dismiss or undo a suggestion. A person's agents are theirs alone; another person's agent is 404.",
"tags": [
"actor.agent"
],
@@@ -833,8 +1225,8 @@
},
"post": {
"operationId": "post_api_v1_me_agents_id_memory",
-- "summary": "Keep your personal agents on OpenVibe.Actor: create, read, change and delete an agent (standing instructions, mode, a budget per run, a daily run cap and a schedule), read, add, edit and delete what i",
-- "description": "**actor.agent.manage** (public): Keep your personal agents on OpenVibe.Actor: create, read, change and delete an agent (standing instructions, mode, a budget per run, a daily run cap and a schedule), read, add, edit and delete what it remembers, or forget everything, and read what it suggested adding to its instructions and apply, dismiss or undo a suggestion. A person's agents are theirs alone; another person's agent is 404.",
++ "summary": "Keep your agents on OpenVibe.Actor.",
++ "description": "**actor.agent.manage** (public): Keep your agents on OpenVibe.Actor. A contact (plan §12 A-1; actor.agent@1, actor.agent-list@1): GET/POST /api/v1/agents, GET/PATCH/DELETE /api/v1/agents/:id and PUT /api/v1/agents/:id/level (actor.level-change@1), with Vibe created on the first read and never deletable and four presets at GET /api/v1/agents/presets to copy. A personal run (standing instructions, mode, a budget per run, a daily run cap and a schedule): create, read, change and delete one, read, add, edit and delete what it remembers, or forget everything, and read what it suggested adding to its instructions and apply, dismiss or undo a suggestion. A person's agents are theirs alone; another person's agent is 404.",
"tags": [
"actor.agent"
],
@@@ -899,8 +1291,8 @@
"/api/v1/me/agents/{id}/memory/{mem}": {
"delete": {
"operationId": "delete_api_v1_me_agents_id_memory_mem",
-- "summary": "Keep your personal agents on OpenVibe.Actor: create, read, change and delete an agent (standing instructions, mode, a budget per run, a daily run cap and a schedule), read, add, edit and delete what i",
-- "description": "**actor.agent.manage** (public): Keep your personal agents on OpenVibe.Actor: create, read, change and delete an agent (standing instructions, mode, a budget per run, a daily run cap and a schedule), read, add, edit and delete what it remembers, or forget everything, and read what it suggested adding to its instructions and apply, dismiss or undo a suggestion. A person's agents are theirs alone; another person's agent is 404.",
++ "summary": "Keep your agents on OpenVibe.Actor.",
++ "description": "**actor.agent.manage** (public): Keep your agents on OpenVibe.Actor. A contact (plan §12 A-1; actor.agent@1, actor.agent-list@1): GET/POST /api/v1/agents, GET/PATCH/DELETE /api/v1/agents/:id and PUT /api/v1/agents/:id/level (actor.level-change@1), with Vibe created on the first read and never deletable and four presets at GET /api/v1/agents/presets to copy. A personal run (standing instructions, mode, a budget per run, a daily run cap and a schedule): create, read, change and delete one, read, add, edit and delete what it remembers, or forget everything, and read what it suggested adding to its instructions and apply, dismiss or undo a suggestion. A person's agents are theirs alone; another person's agent is 404.",
"tags": [
"actor.agent"
],
@@@ -964,8 +1356,8 @@
},
"patch": {
"operationId": "patch_api_v1_me_agents_id_memory_mem",
-- "summary": "Keep your personal agents on OpenVibe.Actor: create, read, change and delete an agent (standing instructions, mode, a budget per run, a daily run cap and a schedule), read, add, edit and delete what i",
-- "description": "**actor.agent.manage** (public): Keep your personal agents on OpenVibe.Actor: create, read, change and delete an agent (standing instructions, mode, a budget per run, a daily run cap and a schedule), read, add, edit and delete what it remembers, or forget everything, and read what it suggested adding to its instructions and apply, dismiss or undo a suggestion. A person's agents are theirs alone; another person's agent is 404.",
++ "summary": "Keep your agents on OpenVibe.Actor.",
++ "description": "**actor.agent.manage** (public): Keep your agents on OpenVibe.Actor. A contact (plan §12 A-1; actor.agent@1, actor.agent-list@1): GET/POST /api/v1/agents, GET/PATCH/DELETE /api/v1/agents/:id and PUT /api/v1/agents/:id/level (actor.level-change@1), with Vibe created on the first read and never deletable and four presets at GET /api/v1/agents/presets to copy. A personal run (standing instructions, mode, a budget per run, a daily run cap and a schedule): create, read, change and delete one, read, add, edit and delete what it remembers, or forget everything, and read what it suggested adding to its instructions and apply, dismiss or undo a suggestion. A person's agents are theirs alone; another person's agent is 404.",
"tags": [
"actor.agent"
],
@@@ -1172,8 +1564,8 @@
"/api/v1/me/agents/{id}/suggestions": {
"get": {
"operationId": "get_api_v1_me_agents_id_suggestions",
-- "summary": "Keep your personal agents on OpenVibe.Actor: create, read, change and delete an agent (standing instructions, mode, a budget per run, a daily run cap and a schedule), read, add, edit and delete what i",
-- "description": "**actor.agent.manage** (public): Keep your personal agents on OpenVibe.Actor: create, read, change and delete an agent (standing instructions, mode, a budget per run, a daily run cap and a schedule), read, add, edit and delete what it remembers, or forget everything, and read what it suggested adding to its instructions and apply, dismiss or undo a suggestion. A person's agents are theirs alone; another person's agent is 404.",
++ "summary": "Keep your agents on OpenVibe.Actor.",
++ "description": "**actor.agent.manage** (public): Keep your agents on OpenVibe.Actor. A contact (plan §12 A-1; actor.agent@1, actor.agent-list@1): GET/POST /api/v1/agents, GET/PATCH/DELETE /api/v1/agents/:id and PUT /api/v1/agents/:id/level (actor.level-change@1), with Vibe created on the first read and never deletable and four presets at GET /api/v1/agents/presets to copy. A personal run (standing instructions, mode, a budget per run, a daily run cap and a schedule): create, read, change and delete one, read, add, edit and delete what it remembers, or forget everything, and read what it suggested adding to its instructions and apply, dismiss or undo a suggestion. A person's agents are theirs alone; another person's agent is 404.",
"tags": [
"actor.agent"
],
@@@ -1231,8 +1623,8 @@
"/api/v1/me/agents/{id}/suggestions/{pid}/{action}": {
"post": {
"operationId": "post_api_v1_me_agents_id_suggestions_pid_action",
-- "summary": "Keep your personal agents on OpenVibe.Actor: create, read, change and delete an agent (standing instructions, mode, a budget per run, a daily run cap and a schedule), read, add, edit and delete what i",
-- "description": "**actor.agent.manage** (public): Keep your personal agents on OpenVibe.Actor: create, read, change and delete an agent (standing instructions, mode, a budget per run, a daily run cap and a schedule), read, add, edit and delete what it remembers, or forget everything, and read what it suggested adding to its instructions and apply, dismiss or undo a suggestion. A person's agents are theirs alone; another person's agent is 404.",
++ "summary": "Keep your agents on OpenVibe.Actor.",
++ "description": "**actor.agent.manage** (public): Keep your agents on OpenVibe.Actor. A contact (plan §12 A-1; actor.agent@1, actor.agent-list@1): GET/POST /api/v1/agents, GET/PATCH/DELETE /api/v1/agents/:id and PUT /api/v1/agents/:id/level (actor.level-change@1), with Vibe created on the first read and never deletable and four presets at GET /api/v1/agents/presets to copy. A personal run (standing instructions, mode, a budget per run, a daily run cap and a schedule): create, read, change and delete one, read, add, edit and delete what it remembers, or forget everything, and read what it suggested adding to its instructions and apply, dismiss or undo a suggestion. A person's agents are theirs alone; another person's agent is 404.",
"tags": [
"actor.agent"
],
@@@ -1611,8 +2003,8 @@
"/api/v1/route": {
"post": {
"operationId": "post_api_v1_route",
-- "summary": "The agent systems Actor routes to, with what each can do, its trust class, its rate card and whether it is available now (GET /api/v1/agents, actor.agent-list-result@2, whose model tiers and models sa",
-- "description": "**actor.agent.read** (public): The agent systems Actor routes to, with what each can do, its trust class, its rate card and whether it is available now (GET /api/v1/agents, actor.agent-list-result@2, whose model tiers and models say which model each tier resolved to), and which one a task would go to in a mode, with the reason for every candidate (POST /api/v1/route { task, mode }, a platform.placement-result@1; nothing runs). Public; no token needed.",
++ "summary": "The agent systems Actor routes to, with what each can do, its trust class, its rate card and whether it is available now (GET /api/v1/agent-systems, also GET /api/v1/agents for callers with no person'",
++ "description": "**actor.agent.read** (public): The agent systems Actor routes to, with what each can do, its trust class, its rate card and whether it is available now (GET /api/v1/agent-systems, also GET /api/v1/agents for callers with no person's session; actor.agent-list-result@2, whose model tiers and models say which model each tier resolved to), which one a task would go to in a mode, with the reason for every candidate (POST /api/v1/route { task, mode }, a platform.placement-result@1; nothing runs), and the four agent-contact presets a signed-in person can copy (GET /api/v1/agents/presets: Researcher, Inbox, Studio editor, Party host). Public; no token needed. A signed-in person's GET /api/v1/agents answers their own contacts (actor.agent-list@1) instead, so the catalog keeps this explicit path for them too.",
"tags": [
"actor.agent"
],
@@@ -3426,7 +3818,7 @@
},
"actor.task-create-request.v1": {
"title": "ActorTaskCreateRequest",
-- "description": "actor.task-create-request@1: the body of POST /api/v1/tasks on OpenVibe.Actor (capability actor.task.create), the creation subset of platform.task@1. TASK is the instruction in plain words. MODE is the planner objective (default balanced). BUDGET caps what this task may cost (per_task_usd) and what the caller's tasks may cost in one UTC day (per_day_usd); either may be left out for the person's free-allowance defaults, and a value above the person's tier is refused 422 actor.budget.over_tier, never silently lowered. AGENT pins one agent system by its id from GET /api/v1/agents (routing still checks that it can take the task). IDEMPOTENCY_KEY: a repeat from the same requester within 24 h with an identical body answers the first task (200), with a different body 409 actor.idempotency.conflict. WEBHOOKS (at most 8): each an https URL and the state changes to deliver there (the names of platform.task@1 `state`). Actor signs every delivery with a secret it mints for the task, returned once as `webhook_secret` in the answer that created it (and in an idempotent repeat), and POSTs actor.task-webhook@1 through its egress guard: public addresses only, ports 443 or 8443, no credentials in the URL, never a redirect. A URL that cannot be delivered to is refused 422 actor.webhook.refused. A webhook may instead name a project secret (`secret_ref`, ADR-056): its deliveries are then signed by OpenVibe.Network with that secret, in the same headers, and no webhook_secret is minted when every webhook names one. A secret_ref on a task outside a project is refused 422 actor.webhook.secret_unavailable.",
++ "description": "actor.task-create-request@1: the body of POST /api/v1/tasks on OpenVibe.Actor (capability actor.task.create), the creation subset of platform.task@1. TASK is the instruction in plain words. MODE is the planner objective (default balanced). BUDGET caps what this task may cost (per_task_usd) and what the caller's tasks may cost in one UTC day (per_day_usd); either may be left out for the person's free-allowance defaults, and a value above the person's tier is refused 422 actor.budget.over_tier, never silently lowered. AGENT pins one agent system by its id from GET /api/v1/agent-systems, the public catalog (routing still checks that it can take the task); AGENT_ID names one of the caller's own agent contacts from GET /api/v1/agents to run this task as (absent: Vibe, their first agent). LEVEL is the thread's approval level; the effective level is the higher of the agent's own level and this one, inherited along the person's own parent chain and never from outside work. IDEMPOTENCY_KEY: a repeat from the same requester within 24 h with an identical body answers the first task (200), with a different body 409 actor.idempotency.conflict. WEBHOOKS (at most 8): each an https URL and the state changes to deliver there (the names of platform.task@1 `state`). Actor signs every delivery with a secret it mints for the task, returned once as `webhook_secret` in the answer that created it (and in an idempotent repeat), and POSTs actor.task-webhook@1 through its egress guard: public addresses only, ports 443 or 8443, no credentials in the URL, never a redirect. A URL that cannot be delivered to is refused 422 actor.webhook.refused. A webhook may instead name a project secret (`secret_ref`, ADR-056): its deliveries are then signed by OpenVibe.Network with that secret, in the same headers, and no webhook_secret is minted when every webhook names one. A secret_ref on a task outside a project is refused 422 actor.webhook.secret_unavailable.",
"type": "object",
"additionalProperties": false,
"required": [
@@@ -3523,6 +3915,22 @@
}
},
"description": "Where Actor tells the caller about this task's state changes (plan T17)."
++ },
++ "agent_id": {
++ "type": "string",
++ "pattern": "^agt_[0-9A-HJKMNP-TV-Z]{26}$",
++ "description": "One of the caller's own agent contacts (actor.agent@1) the task runs as. Absent: their Vibe, created on first read. The public agent-system catalog stays in `agent`."
++ },
++ "level": {
++ "type": "string",
++ "enum": [
++ "ask",
++ "auto-edits",
++ "approve-for-me",
++ "full"
++ ],
++ "default": "ask",
++ "description": "The thread's approval level. The effective level is max(the agent's level, this level, the levels of the person's own parent tasks). The always-ask floor still applies."
}
},
"examples": [
@@@ -4942,7 +5350,7 @@
},
"platform.task.v1": {
"title": "Task",
-- "description": "platform.task@1 (plan T17, ADR-044): one task at OpenVibe.Actor's task router. POST /api/v1/tasks (actor.task.create) creates it from a plain-language `task` plus a `mode` and a `budget`; the router mints `id`, sets `state` and `created_at`, picks a backend from the registered agent systems, runs the task, verifies the result, escalates or fails over, and answers with `result`, `cost` and `explanation`. GET /api/v1/tasks/{id} (actor.task.read) reads the same resource. Progress streams as server-sent events from `progress.stream_url` (actor.task-event@1; the task's own counter in `progress.last_seq`); `cancel` records that a cancel was requested (POST /api/v1/tasks/{id}/cancel), `error` says why a task failed, and `webhooks` are the registered endpoints the router delivers each state change to (actor.task-webhook@1, signed with `webhook_secret`, which only the creating answer carries). Owned by `network` like every other platform.* contract and implemented by OpenVibe.Actor (manifests/services/actor.json). This v1 contract may grow optional fields.",
++ "description": "platform.task@1 (plan T17, ADR-044): one task at OpenVibe.Actor's task router. POST /api/v1/tasks (actor.task.create) creates it from a plain-language `task` plus a `mode` and a `budget`; the router mints `id`, sets `state` and `created_at`, picks a backend from the registered agent systems, runs the task, verifies the result, escalates or fails over, and answers with `result`, `cost` and `explanation`. GET /api/v1/tasks/{id} (actor.task.read) reads the same resource. Progress streams as server-sent events from `progress.stream_url` (actor.task-event@1; the task's own counter in `progress.last_seq`); `cancel` records that a cancel was requested (POST /api/v1/tasks/{id}/cancel), `error` says why a task failed, and `webhooks` are the registered endpoints the router delivers each state change to (actor.task-webhook@1, signed with `webhook_secret`, which only the creating answer carries). Owned by `network` like every other platform.* contract and implemented by OpenVibe.Actor (manifests/services/actor.json). This v1 contract may grow optional fields. A-1 adds AGENT_ID (the agent contact the task runs as; absent means the person's Vibe), LEVEL (the thread's own approval level), EFFECTIVE_LEVEL (max of the agent level and the person's own inherited line) and AGENT_LEVEL (the agent contact's own level), so a reader never has to guess why a step did or did not ask.",
"$comment": "Additive optional fields may extend this v1 contract. It is the task resource, not a device frame: Actor's link is HTTP/SSE where Run's is the Node WebSocket.",
"type": "object",
"additionalProperties": false,
@@@ -5219,6 +5627,41 @@
"type": "string",
"pattern": "^whsec_[A-Za-z0-9_-]{43}$",
"description": "The secret every webhook delivery of this task is signed with (X-OpenVibe-Signature-V2: t=<unix seconds>,v2=<hex HMAC-SHA256 of \"<t>.<raw body>\">, verified by openvibe-sdk/events verifyDeliveryV2). Present only in the answer that created the task (and an idempotent repeat of it), never in a read or a list; erased once the task has ended and its deliveries are done."
++ },
++ "agent_id": {
++ "type": "string",
++ "pattern": "^agt_[0-9A-HJKMNP-TV-Z]{26}$",
++ "description": "The agent contact (actor.agent@1) this task runs as. Absent on a task with no person (a service or project task); a person's task defaults to their Vibe, created on first read."
++ },
++ "level": {
++ "type": "string",
++ "enum": [
++ "ask",
++ "auto-edits",
++ "approve-for-me",
++ "full"
++ ],
++ "description": "The thread's own approval level (the task is the thread). Default ask."
++ },
++ "effective_level": {
++ "type": "string",
++ "enum": [
++ "ask",
++ "auto-edits",
++ "approve-for-me",
++ "full"
++ ],
++ "description": "The level Actor applies: the higher of the agent contact's level and the thread line's levels. It inherits only along this person's own parent tasks, never from another person's or a service's work. The always-ask floor still applies."
++ },
++ "agent_level": {
++ "type": "string",
++ "enum": [
++ "ask",
++ "auto-edits",
++ "approve-for-me",
++ "full"
++ ],
++ "description": "The agent contact's own level, before the thread's level is raised above it."
}
},
"allOf": [
ddiff --git a/generated/openapi/ai.json b/generated/openapi/ai.json
iindex 144d28e4..e5669758 100644
---- a/generated/openapi/ai.json
++++ b/generated/openapi/ai.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.AI API",
-- "version": "0.321.0",
-- "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.322.0",
++ "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.322.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/bench.json b/generated/openapi/bench.json
iindex 8d7d9caf..124f4c91 100644
---- a/generated/openapi/bench.json
++++ b/generated/openapi/bench.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Bench API",
-- "version": "0.321.0",
-- "description": "Routes of OpenVibe.Bench as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.322.0",
++ "description": "Routes of OpenVibe.Bench as the OpenVibe contracts describe them (openvibe-contracts 0.322.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/billing.json b/generated/openapi/billing.json
iindex efb9a19e..4df01a32 100644
---- a/generated/openapi/billing.json
++++ b/generated/openapi/billing.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Billing API",
-- "version": "0.321.0",
-- "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.322.0",
++ "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.322.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/blog.json b/generated/openapi/blog.json
iindex 1b2aa486..32fdc9cc 100644
---- a/generated/openapi/blog.json
++++ b/generated/openapi/blog.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Blog API",
-- "version": "0.321.0",
-- "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.322.0",
++ "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.322.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/bot.json b/generated/openapi/bot.json
iindex 6678bdb0..094bd8dd 100644
---- a/generated/openapi/bot.json
++++ b/generated/openapi/bot.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Bot API",
-- "version": "0.321.0",
-- "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.322.0",
++ "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.322.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/chat.json b/generated/openapi/chat.json
iindex a4794fd0..dc830566 100644
---- a/generated/openapi/chat.json
++++ b/generated/openapi/chat.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Chat API",
-- "version": "0.321.0",
-- "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.322.0",
++ "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.322.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/codes.json b/generated/openapi/codes.json
iindex 2c04aca2..8c10ed8f 100644
---- a/generated/openapi/codes.json
++++ b/generated/openapi/codes.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Codes API",
-- "version": "0.321.0",
-- "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.322.0",
++ "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.322.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/community.json b/generated/openapi/community.json
iindex 448c3de9..bf12fa09 100644
---- a/generated/openapi/community.json
++++ b/generated/openapi/community.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Community API",
-- "version": "0.321.0",
-- "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.322.0",
++ "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.322.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/connect.json b/generated/openapi/connect.json
iindex 606e8fb7..11e970e9 100644
---- a/generated/openapi/connect.json
++++ b/generated/openapi/connect.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe Connect API",
-- "version": "0.321.0",
-- "description": "Routes of OpenVibe Connect as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.322.0",
++ "description": "Routes of OpenVibe Connect as the OpenVibe contracts describe them (openvibe-contracts 0.322.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/coupons.json b/generated/openapi/coupons.json
iindex 216b5f51..61851f58 100644
---- a/generated/openapi/coupons.json
++++ b/generated/openapi/coupons.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Coupons API",
-- "version": "0.321.0",
-- "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.322.0",
++ "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.322.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/deals.json b/generated/openapi/deals.json
iindex f9fc8b82..a209a2a8 100644
---- a/generated/openapi/deals.json
++++ b/generated/openapi/deals.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Deals API",
-- "version": "0.321.0",
-- "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.322.0",
++ "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.322.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/design.json b/generated/openapi/design.json
iindex 6b06073a..ddb11069 100644
---- a/generated/openapi/design.json
++++ b/generated/openapi/design.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Design API",
-- "version": "0.321.0",
-- "description": "Routes of OpenVibe.Design as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.322.0",
++ "description": "Routes of OpenVibe.Design as the OpenVibe contracts describe them (openvibe-contracts 0.322.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/domains.json b/generated/openapi/domains.json
iindex bb54ef36..99eaea7d 100644
---- a/generated/openapi/domains.json
++++ b/generated/openapi/domains.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Domains API",
-- "version": "0.321.0",
-- "description": "Routes of OpenVibe.Domains as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.322.0",
++ "description": "Routes of OpenVibe.Domains as the OpenVibe contracts describe them (openvibe-contracts 0.322.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/events.json b/generated/openapi/events.json
iindex 63d47428..069c6c37 100644
---- a/generated/openapi/events.json
++++ b/generated/openapi/events.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Events API",
-- "version": "0.321.0",
-- "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.322.0",
++ "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.322.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/food.json b/generated/openapi/food.json
iindex ea168f65..9120f777 100644
---- a/generated/openapi/food.json
++++ b/generated/openapi/food.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Food API",
-- "version": "0.321.0",
-- "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.322.0",
++ "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.322.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/games.json b/generated/openapi/games.json
iindex bfe22c31..af1c34b3 100644
---- a/generated/openapi/games.json
++++ b/generated/openapi/games.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Games API",
-- "version": "0.321.0",
-- "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.322.0",
++ "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.322.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/host.json b/generated/openapi/host.json
iindex fdfe5f72..fcf5c55b 100644
---- a/generated/openapi/host.json
++++ b/generated/openapi/host.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Host API",
-- "version": "0.321.0",
-- "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.322.0",
++ "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.322.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/index.json b/generated/openapi/index.json
iindex 2af4b2f6..8aa8ca74 100644
---- a/generated/openapi/index.json
++++ b/generated/openapi/index.json
@@@ -5,7 +5,7 @@
"service": "actor",
"name": "OpenVibe.Actor",
"origin": "https://openvibe.actor",
-- "operations": 39,
++ "operations": 46,
"capabilities": 14
},
{
ddiff --git a/generated/openapi/inventory.json b/generated/openapi/inventory.json
iindex 018d88d2..90c56fdb 100644
---- a/generated/openapi/inventory.json
++++ b/generated/openapi/inventory.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Inventory API",
-- "version": "0.321.0",
-- "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.322.0",
++ "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.322.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/live.json b/generated/openapi/live.json
iindex e1bbb364..c2f538d8 100644
---- a/generated/openapi/live.json
++++ b/generated/openapi/live.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Live API",
-- "version": "0.321.0",
-- "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.322.0",
++ "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.322.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/media-hub.json b/generated/openapi/media-hub.json
iindex db676712..29c8db24 100644
---- a/generated/openapi/media-hub.json
++++ b/generated/openapi/media-hub.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.MediaHub API",
-- "version": "0.321.0",
-- "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.322.0",
++ "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.322.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/media.json b/generated/openapi/media.json
iindex d4beedab..7fc21f1e 100644
---- a/generated/openapi/media.json
++++ b/generated/openapi/media.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Media API",
-- "version": "0.321.0",
-- "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.322.0",
++ "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.322.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/network.json b/generated/openapi/network.json
iindex 1fa85970..1178033d 100644
---- a/generated/openapi/network.json
++++ b/generated/openapi/network.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Network API",
-- "version": "0.321.0",
-- "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.322.0",
++ "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.322.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/news.json b/generated/openapi/news.json
iindex 3f520fc4..77c4ac47 100644
---- a/generated/openapi/news.json
++++ b/generated/openapi/news.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.News API",
-- "version": "0.321.0",
-- "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.322.0",
++ "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.322.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/openre.json b/generated/openapi/openre.json
iindex 54e3fc00..890123a9 100644
---- a/generated/openapi/openre.json
++++ b/generated/openapi/openre.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenRestream API",
-- "version": "0.321.0",
-- "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.322.0",
++ "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.322.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/play.json b/generated/openapi/play.json
iindex 3c570f3d..e494d2af 100644
---- a/generated/openapi/play.json
++++ b/generated/openapi/play.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Play API",
-- "version": "0.321.0",
-- "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.322.0",
++ "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.322.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/quest.json b/generated/openapi/quest.json
iindex d1b272b1..d52bed17 100644
---- a/generated/openapi/quest.json
++++ b/generated/openapi/quest.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Quest API",
-- "version": "0.321.0",
-- "description": "Routes of OpenVibe.Quest as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.322.0",
++ "description": "Routes of OpenVibe.Quest as the OpenVibe contracts describe them (openvibe-contracts 0.322.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/report.json b/generated/openapi/report.json
iindex 5264f59d..08cd541b 100644
---- a/generated/openapi/report.json
++++ b/generated/openapi/report.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Report API",
-- "version": "0.321.0",
-- "description": "Routes of OpenVibe.Report as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.322.0",
++ "description": "Routes of OpenVibe.Report as the OpenVibe contracts describe them (openvibe-contracts 0.322.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/reviews.json b/generated/openapi/reviews.json
iindex 05998c74..8cbdb1e1 100644
---- a/generated/openapi/reviews.json
++++ b/generated/openapi/reviews.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Reviews API",
-- "version": "0.321.0",
-- "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.322.0",
++ "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.322.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/run.json b/generated/openapi/run.json
iindex ba292627..eb7e061d 100644
---- a/generated/openapi/run.json
++++ b/generated/openapi/run.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Run API",
-- "version": "0.321.0",
-- "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.322.0",
++ "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.322.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/search.json b/generated/openapi/search.json
iindex bca2676a..7a34966a 100644
---- a/generated/openapi/search.json
++++ b/generated/openapi/search.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Search API",
-- "version": "0.321.0",
-- "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.322.0",
++ "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.322.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/services.json b/generated/openapi/services.json
iindex 602dffad..600c3cc2 100644
---- a/generated/openapi/services.json
++++ b/generated/openapi/services.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Services API",
-- "version": "0.321.0",
-- "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.322.0",
++ "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.322.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/sources.json b/generated/openapi/sources.json
iindex 90c850fd..6e9ca7b1 100644
---- a/generated/openapi/sources.json
++++ b/generated/openapi/sources.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Sources API",
-- "version": "0.321.0",
-- "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.322.0",
++ "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.322.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/space.json b/generated/openapi/space.json
iindex 686cf1ae..cba1da0c 100644
---- a/generated/openapi/space.json
++++ b/generated/openapi/space.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Space API",
-- "version": "0.321.0",
-- "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.322.0",
++ "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.322.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/tips.json b/generated/openapi/tips.json
iindex 63c90855..cf88f3c1 100644
---- a/generated/openapi/tips.json
++++ b/generated/openapi/tips.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Tips API",
-- "version": "0.321.0",
-- "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.322.0",
++ "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.322.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/today.json b/generated/openapi/today.json
iindex ede2d3b0..a8251d52 100644
---- a/generated/openapi/today.json
++++ b/generated/openapi/today.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Today API",
-- "version": "0.321.0",
-- "description": "Routes of OpenVibe.Today as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.322.0",
++ "description": "Routes of OpenVibe.Today as the OpenVibe contracts describe them (openvibe-contracts 0.322.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/tools.json b/generated/openapi/tools.json
iindex a35d5bf6..7781f0b1 100644
---- a/generated/openapi/tools.json
++++ b/generated/openapi/tools.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Tools API",
-- "version": "0.321.0",
-- "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.322.0",
++ "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.322.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/trade.json b/generated/openapi/trade.json
iindex 4d767042..874d80a4 100644
---- a/generated/openapi/trade.json
++++ b/generated/openapi/trade.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Trade API",
-- "version": "0.321.0",
-- "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.322.0",
++ "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.322.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/vip.json b/generated/openapi/vip.json
iindex 239389e2..a324f196 100644
---- a/generated/openapi/vip.json
++++ b/generated/openapi/vip.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.VIP API",
-- "version": "0.321.0",
-- "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.322.0",
++ "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.322.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/vision.json b/generated/openapi/vision.json
iindex 9c997ff0..a6ef45ba 100644
---- a/generated/openapi/vision.json
++++ b/generated/openapi/vision.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Vision API",
-- "version": "0.321.0",
-- "description": "Routes of OpenVibe.Vision as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.322.0",
++ "description": "Routes of OpenVibe.Vision as the OpenVibe contracts describe them (openvibe-contracts 0.322.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/watch.json b/generated/openapi/watch.json
iindex c73c8df3..60cc4947 100644
---- a/generated/openapi/watch.json
++++ b/generated/openapi/watch.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Watch API",
-- "version": "0.321.0",
-- "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.322.0",
++ "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.322.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/wiki.json b/generated/openapi/wiki.json
iindex c8a9f0c6..e0b06a7f 100644
---- a/generated/openapi/wiki.json
++++ b/generated/openapi/wiki.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Wiki API",
-- "version": "0.321.0",
-- "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.322.0",
++ "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.322.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/work.json b/generated/openapi/work.json
iindex 810df1c0..6f5b42e6 100644
---- a/generated/openapi/work.json
++++ b/generated/openapi/work.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Work API",
-- "version": "0.321.0",
-- "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.322.0",
++ "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.322.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/zone.json b/generated/openapi/zone.json
iindex 7b1f8a93..df468abb 100644
---- a/generated/openapi/zone.json
++++ b/generated/openapi/zone.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Zone API",
-- "version": "0.321.0",
-- "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.322.0",
++ "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.322.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/typescript/index.d.ts b/generated/typescript/index.d.ts
iindex 0882eeb0..ebbe117b 100644
---- a/generated/typescript/index.d.ts
++++ b/generated/typescript/index.d.ts
@@@ -210232,7 +210232,7 @@ export type JobFrame =
/** [email protected] (owner: network) */
/**
-- * platform.task@1 (plan T17, ADR-044): one task at OpenVibe.Actor's task router. POST /api/v1/tasks (actor.task.create) creates it from a plain-language `task` plus a `mode` and a `budget`; the router mints `id`, sets `state` and `created_at`, picks a backend from the registered agent systems, runs the task, verifies the result, escalates or fails over, and answers with `result`, `cost` and `explanation`. GET /api/v1/tasks/{id} (actor.task.read) reads the same resource. Progress streams as server-sent events from `progress.stream_url` (actor.task-event@1; the task's own counter in `progress.last_seq`); `cancel` records that a cancel was requested (POST /api/v1/tasks/{id}/cancel), `error` says why a task failed, and `webhooks` are the registered endpoints the router delivers each state change to (actor.task-webhook@1, signed with `webhook_secret`, which only the creating answer carries). Owned by `network` like every other platform.* contract and implemented by OpenVibe.Actor (manifests/services/actor.json). This v1 contract may grow optional fields.
++ * platform.task@1 (plan T17, ADR-044): one task at OpenVibe.Actor's task router. POST /api/v1/tasks (actor.task.create) creates it from a plain-language `task` plus a `mode` and a `budget`; the router mints `id`, sets `state` and `created_at`, picks a backend from the registered agent systems, runs the task, verifies the result, escalates or fails over, and answers with `result`, `cost` and `explanation`. GET /api/v1/tasks/{id} (actor.task.read) reads the same resource. Progress streams as server-sent events from `progress.stream_url` (actor.task-event@1; the task's own counter in `progress.last_seq`); `cancel` records that a cancel was requested (POST /api/v1/tasks/{id}/cancel), `error` says why a task failed, and `webhooks` are the registered endpoints the router delivers each state change to (actor.task-webhook@1, signed with `webhook_secret`, which only the creating answer carries). Owned by `network` like every other platform.* contract and implemented by OpenVibe.Actor (manifests/services/actor.json). This v1 contract may grow optional fields. A-1 adds AGENT_ID (the agent contact the task runs as; absent means the person's Vibe), LEVEL (the thread's own approval level), EFFECTIVE_LEVEL (max of the agent level and the person's own inherited line) and AGENT_LEVEL (the agent contact's own level), so a reader never has to guess why a step did or did not ask.
*/
export type Task = {
[k: string]: unknown | undefined;
@@@ -211047,6 +211047,22 @@ export type Task = {
* The secret every webhook delivery of this task is signed with (X-OpenVibe-Signature-V2: t=<unix seconds>,v2=<hex HMAC-SHA256 of "<t>.<raw body>">, verified by openvibe-sdk/events verifyDeliveryV2). Present only in the answer that created the task (and an idempotent repeat of it), never in a read or a list; erased once the task has ended and its deliveries are done.
*/
webhook_secret?: string;
++ /**
++ * The agent contact (actor.agent@1) this task runs as. Absent on a task with no person (a service or project task); a person's task defaults to their Vibe, created on first read.
++ */
++ agent_id?: string;
++ /**
++ * The thread's own approval level (the task is the thread). Default ask.
++ */
++ level?: "ask" | "auto-edits" | "approve-for-me" | "full";
++ /**
++ * The level Actor applies: the higher of the agent contact's level and the thread line's levels. It inherits only along this person's own parent tasks, never from another person's or a service's work. The always-ask floor still applies.
++ */
++ effective_level?: "ask" | "auto-edits" | "approve-for-me" | "full";
++ /**
++ * The agent contact's own level, before the thread's level is raised above it.
++ */
++ agent_level?: "ask" | "auto-edits" | "approve-for-me" | "full";
};
/** [email protected] (owner: events) */
@@@ -262578,7 +262594,7 @@ export interface SpaceModerationActionPayload {
/** [email protected] (owner: actor) */
/**
-- * actor.task-create-request@1: the body of POST /api/v1/tasks on OpenVibe.Actor (capability actor.task.create), the creation subset of platform.task@1. TASK is the instruction in plain words. MODE is the planner objective (default balanced). BUDGET caps what this task may cost (per_task_usd) and what the caller's tasks may cost in one UTC day (per_day_usd); either may be left out for the person's free-allowance defaults, and a value above the person's tier is refused 422 actor.budget.over_tier, never silently lowered. AGENT pins one agent system by its id from GET /api/v1/agents (routing still checks that it can take the task). IDEMPOTENCY_KEY: a repeat from the same requester within 24 h with an identical body answers the first task (200), with a different body 409 actor.idempotency.conflict. WEBHOOKS (at most 8): each an https URL and the state changes to deliver there (the names of platform.task@1 `state`). Actor signs every delivery with a secret it mints for the task, returned once as `webhook_secret` in the answer that created it (and in an idempotent repeat), and POSTs actor.task-webhook@1 through its egress guard: public addresses only, ports 443 or 8443, no credentials in the URL, never a redirect. A URL that cannot be delivered to is refused 422 actor.webhook.refused. A webhook may instead name a project secret (`secret_ref`, ADR-056): its deliveries are then signed by OpenVibe.Network with that secret, in the same headers, and no webhook_secret is minted when every webhook names one. A secret_ref on a task outside a project is refused 422 actor.webhook.secret_unavailable.
++ * actor.task-create-request@1: the body of POST /api/v1/tasks on OpenVibe.Actor (capability actor.task.create), the creation subset of platform.task@1. TASK is the instruction in plain words. MODE is the planner objective (default balanced). BUDGET caps what this task may cost (per_task_usd) and what the caller's tasks may cost in one UTC day (per_day_usd); either may be left out for the person's free-allowance defaults, and a value above the person's tier is refused 422 actor.budget.over_tier, never silently lowered. AGENT pins one agent system by its id from GET /api/v1/agent-systems, the public catalog (routing still checks that it can take the task); AGENT_ID names one of the caller's own agent contacts from GET /api/v1/agents to run this task as (absent: Vibe, their first agent). LEVEL is the thread's approval level; the effective level is the higher of the agent's own level and this one, inherited along the person's own parent chain and never from outside work. IDEMPOTENCY_KEY: a repeat from the same requester within 24 h with an identical body answers the first task (200), with a different body 409 actor.idempotency.conflict. WEBHOOKS (at most 8): each an https URL and the state changes to deliver there (the names of platform.task@1 `state`). Actor signs every delivery with a secret it mints for the task, returned once as `webhook_secret` in the answer that created it (and in an idempotent repeat), and POSTs actor.task-webhook@1 through its egress guard: public addresses only, ports 443 or 8443, no credentials in the URL, never a redirect. A URL that cannot be delivered to is refused 422 actor.webhook.refused. A webhook may instead name a project secret (`secret_ref`, ADR-056): its deliveries are then signed by OpenVibe.Network with that secret, in the same headers, and no webhook_secret is minted when every webhook names one. A secret_ref on a task outside a project is refused 422 actor.webhook.secret_unavailable.
*/
export interface ActorTaskCreateRequest {
/**
@@@ -264346,6 +264362,14 @@ export interface ActorTaskCreateRequest {
secret_ref?: string;
}
];
++ /**
++ * One of the caller's own agent contacts (actor.agent@1) the task runs as. Absent: their Vibe, created on first read. The public agent-system catalog stays in `agent`.
++ */
++ agent_id?: string;
++ /**
++ * The thread's approval level. The effective level is max(the agent's level, this level, the levels of the person's own parent tasks). The always-ask floor still applies.
++ */
++ level?: "ask" | "auto-edits" | "approve-for-me" | "full";
}
/** [email protected] (owner: actor) */
@@@ -265749,6 +265773,87 @@ export interface ActorAgentListResult {
/** [email protected] (owner: actor) */
++/** [email protected] (owner: actor) */
++/**
++ * actor.agent@1: one of a person's agents as a contact (plan §12, A-1). An agent has a stable id and owner, a name and face, an optional TTS voice, the model it runs on (the OpenVibe runtime, the person's own keys, a free model on OpenVibe's GPU or their own Claude Code/Codex on a Link machine), the computer it uses (null when it has none, or one of Computer's kinds and placements), the connected apps it may use, its OpenVibe Memory scope (null when it keeps none), its approval level and when it was added. The default level is ask; money, passwords, deletions and sending to a new recipient always ask at every level, as a server-side floor.
++ */
++export interface ActorAgent {
++ /**
++ * agt_<ULID>, Actor's own id for the contact. Vibe, the first agent every person gets, is one of these.
++ */
++ id: string;
++ /**
++ * The person the contact belongs to (identity.subject-ref@1 in one column). Another person's agent is 404.
++ */
++ owner: string;
++ name: string;
++ /**
++ * An avatar ref: an https image URL, a Media id, or a preset face such as preset:researcher. The UI draws it; Actor only stores and returns it.
++ */
++ face: string;
++ /**
++ * A TTS voice id, or null when the agent has no voice. Voice calls are A-6; the field is stored now so a contact keeps its voice.
++ */
++ voice: string | null;
++ model: {
++ /**
++ * runtime: OpenVibe's own agent loop; own-keys: the person's provider keys through OpenVibe.AI; open-gpu: a free open model on OpenVibe's GPU; link: the person's own Claude Code or Codex on a Link machine.
++ */
++ engine: "runtime" | "own-keys" | "open-gpu" | "link";
++ /**
++ * The model id on that engine (a tier such as smart, a provider:model id, an open model name, or a harness name).
++ */
++ model: string;
++ };
++ computer: null | {
++ /**
++ * Computer's kinds (plan §6): a browser, a kept browser, a Linux desktop, a GPU desktop, an always-on computer, the person's own computer, or a throwaway.
++ */
++ kind: "browser" | "kept-browser" | "desktop" | "gpu-desktop" | "always-on" | "your-computer" | "throwaway";
++ /**
++ * Where it runs: OpenVibe decides (auto), the person's Link machine, the OpenVibe home desktops, or OVH's cloud.
++ */
++ placement: "auto" | "link" | "home" | "ovh";
++ };
++ /**
++ * Connected app ids the agent may use (Connect's catalogue slugs).
++ *
++ * @maxItems 50
++ */
++ apps: string[];
++ /**
++ * The OpenVibe Memory scope id this agent reads and writes, or null when it keeps no memory.
++ */
++ memory: string | null;
++ /**
++ * The approval level (plan §12): ask (the default) asks before every act; auto-edits lets the agent edit files and run its own work without asking; approve-for-me has a reviewer model of another family decide ordinary acts; full runs without asking. The floor still asks for money, passwords, deletions and sending to a new recipient at every level.
++ */
++ level: "ask" | "auto-edits" | "approve-for-me" | "full";
++ created_at: string;
++}
++
++/** [email protected] (owner: actor) */
++/**
++ * actor.agent-list@1: GET /api/v1/agents for a signed-in person (capability actor.agent.manage): their own agent contacts, Vibe first. Vibe, the person's first agent, is created on this first read and cannot be deleted. Another person's agents are never in this list. The public agent-system catalog stays at GET /api/v1/agent-systems (actor.agent-list-result@2).
++ */
++export interface ActorAgentList {
++ /**
++ * @maxItems 32
++ */
++ agents: ActorAgent[];
++}
++
++/** [email protected] (owner: actor) */
++/**
++ * actor.level-change@1: the body of PUT /api/v1/agents/{id}/level (capability actor.agent.manage). LEVEL is the new approval level of the person's agent; the answer is the agent (actor.agent@1) with its level. The level never widens the floor: money, passwords, deletions and sending to a new recipient ask at every level. AGENT_ID and THREAD_ID are optional echoes for a caller changing a level from a thread; Actor checks the agent in the path and stores the agent level only.
++ */
++export interface ActorLevelChange {
++ level: "ask" | "auto-edits" | "approve-for-me" | "full";
++ agent_id?: string;
++ thread_id?: string;
++ reason?: string;
++}
++
/** [email protected] (owner: actor) */
/**
* actor.wait@1: one wait (plan A2, Watch mode): the task and the step it belongs to, whose it is, what wakes it (until), the deadline, what happens when nothing comes (on_timeout) and the short line the person reads. A wait is a record, not a running loop: while a task waits, no model runs, its desk is released and its budget clock stops. The event that woke it is untrusted input: woken_by names the event, never its payload.
ddiff --git a/manifests/capabilities/actor.agent.manage.json b/manifests/capabilities/actor.agent.manage.json
iindex 0b116d29..5e164850 100644
---- a/manifests/capabilities/actor.agent.manage.json
++++ b/manifests/capabilities/actor.agent.manage.json
@@@ -5,7 +5,7 @@
"status": "active",
"visibility": "public",
"sensitive": true,
-- "description": "Keep your personal agents on OpenVibe.Actor: create, read, change and delete an agent (standing instructions, mode, a budget per run, a daily run cap and a schedule), read, add, edit and delete what it remembers, or forget everything, and read what it suggested adding to its instructions and apply, dismiss or undo a suggestion. A person's agents are theirs alone; another person's agent is 404.",
++ "description": "Keep your agents on OpenVibe.Actor. A contact (plan §12 A-1; actor.agent@1, actor.agent-list@1): GET/POST /api/v1/agents, GET/PATCH/DELETE /api/v1/agents/:id and PUT /api/v1/agents/:id/level (actor.level-change@1), with Vibe created on the first read and never deletable and four presets at GET /api/v1/agents/presets to copy. A personal run (standing instructions, mode, a budget per run, a daily run cap and a schedule): create, read, change and delete one, read, add, edit and delete what it remembers, or forget everything, and read what it suggested adding to its instructions and apply, dismiss or undo a suggestion. A person's agents are theirs alone; another person's agent is 404.",
"inputSchema": "actor.agent-manage-request@1",
"outputSchema": "actor.agent-manage-result@1",
"permissions": [
@@@ -28,6 +28,11 @@
"DELETE /api/v1/me/agents/:id/memory/:mem",
"DELETE /api/v1/me/agents/:id/memory",
"GET /api/v1/me/agents/:id/suggestions",
-- "POST /api/v1/me/agents/:id/suggestions/:pid/:action"
++ "POST /api/v1/me/agents/:id/suggestions/:pid/:action",
++ "POST /api/v1/agents",
++ "GET /api/v1/agents/:id",
++ "PATCH /api/v1/agents/:id",
++ "DELETE /api/v1/agents/:id",
++ "PUT /api/v1/agents/:id/level"
]
}
ddiff --git a/manifests/capabilities/actor.agent.read.json b/manifests/capabilities/actor.agent.read.json
iindex d3ded7f3..4baaa13d 100644
---- a/manifests/capabilities/actor.agent.read.json
++++ b/manifests/capabilities/actor.agent.read.json
@@@ -4,7 +4,7 @@
"owner": "actor",
"status": "active",
"visibility": "public",
-- "description": "The agent systems Actor routes to, with what each can do, its trust class, its rate card and whether it is available now (GET /api/v1/agents, actor.agent-list-result@2, whose model tiers and models say which model each tier resolved to), and which one a task would go to in a mode, with the reason for every candidate (POST /api/v1/route { task, mode }, a platform.placement-result@1; nothing runs). Public; no token needed.",
++ "description": "The agent systems Actor routes to, with what each can do, its trust class, its rate card and whether it is available now (GET /api/v1/agent-systems, also GET /api/v1/agents for callers with no person's session; actor.agent-list-result@2, whose model tiers and models say which model each tier resolved to), which one a task would go to in a mode, with the reason for every candidate (POST /api/v1/route { task, mode }, a platform.placement-result@1; nothing runs), and the four agent-contact presets a signed-in person can copy (GET /api/v1/agents/presets: Researcher, Inbox, Studio editor, Party host). Public; no token needed. A signed-in person's GET /api/v1/agents answers their own contacts (actor.agent-list@1) instead, so the catalog keeps this explicit path for them too.",
"inputSchema": "common.no-body@1",
"outputSchema": "actor.agent-list-result@2",
"permissions": [
@@@ -17,6 +17,8 @@
"events": [],
"implementedBy": [
"GET /api/v1/agents",
++ "GET /api/v1/agent-systems",
++ "GET /api/v1/agents/presets",
"POST /api/v1/route"
]
}
ddiff --git a/package.json b/package.json
iindex 0b53f40f..c7f937e9 100644
---- a/package.json
++++ b/package.json
@@@ -1,6 +1,6 @@
{
"name": "openvibe-contracts",
-- "version": "0.321.0",
++ "version": "0.322.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",