openvibers/openvibe.contracts Commits
Dock v2: the run row's words, the subject and the synced choice (#380)
Changes
@@@ -1,5 +1,9 @@# Changelog++## 0.365.0 — 2026-11-09++++- Dock v2: action-item words, ai.run-error@1, skill runs and Vibe conversations++## 0.364.0 — 2026-11-09- The Feed of everything: community.feed-item@1nnew file mode 100644@@@ -0,0 +1,38 @@++{++ "$schema": "https://json-schema.org/draft/2020-12/schema",++ "$id": "https://openvibe.network/contracts/actor/skill-run-request.v1.json",++ "title": "ActorSkillRunRequest",++ "description": "actor.skill-run-request@1: POST /api/v1/runs starts a public prompt skill as this person, using normal task approvals and budget.",++ "type": "object",++ "additionalProperties": false,++ "required": [++ "skill"++ ],++ "properties": {++ "skill": {++ "type": "string",++ "minLength": 1,++ "maxLength": 80++ },++ "input": {++ "type": "object",++ "additionalProperties": true,++ "maxProperties": 30++ },++ "choice": {++ "type": "object",++ "additionalProperties": false,++ "properties": {++ "mode": {++ "enum": [++ "cheapest",++ "balanced",++ "best",++ "fastest",++ "private"++ ]++ }++ }++ }++ }++}nnew file mode 100644@@@ -0,0 +1,34 @@++{++ "$schema": "https://json-schema.org/draft/2020-12/schema",++ "$id": "https://openvibe.network/contracts/actor/skill-run-result.v1.json",++ "title": "ActorSkillRunResult",++ "description": "actor.skill-run-result@1: a catalogue run is an ordinary Actor task, with its skill and subject labelled.",++ "type": "object",++ "additionalProperties": false,++ "required": [++ "run"++ ],++ "properties": {++ "run": {++ "type": "object",++ "required": [++ "id",++ "skill",++ "subject"++ ],++ "additionalProperties": true,++ "properties": {++ "id": {++ "type": "string",++ "pattern": "^tsk_"++ },++ "skill": {++ "type": "string"++ },++ "subject": {++ "type": "string"++ }++ }++ }++ }++}nnew file mode 100644@@@ -0,0 +1,44 @@++{++ "$schema": "https://json-schema.org/draft/2020-12/schema",++ "$id": "https://openvibe.network/contracts/ai/run-error.v1.json",++ "title": "AiRunError",++ "description": "ai.run-error@1: safe, actionable words for an AI or Actor run. Raw provider responses are never display text. The code map is shared across products.",++ "type": "object",++ "additionalProperties": false,++ "required": [++ "code",++ "words",++ "next",++ "action"++ ],++ "properties": {++ "code": {++ "type": "string",++ "maxLength": 80++ },++ "words": {++ "type": "string",++ "maxLength": 240++ },++ "next": {++ "type": "string",++ "maxLength": 240++ },++ "action": {++ "enum": [++ "pick_model",++ "add_key",++ "retry",++ "retry_later",++ "open"++ ]++ },++ "retry_at": {++ "type": [++ "string",++ "null"++ ],++ "format": "date-time"++ }++ }++}@@@ -1571,6 +1571,15 @@"status": "active","adr": "ADR-015"},++ {++ "id": "ai.run-error",++ "version": "1.0.0",++ "owner": "ai",++ "schema": "ai/run-error.v1.json",++ "visibility": "public",++ "compatibility": "backward",++ "status": "active"++ },{"id": "ai.call.recorded","version": "1.0.0",@@@ -5702,6 +5711,15 @@"compatibility": "backward","status": "active"},++ {++ "id": "chat.vibe-conversations-result",++ "version": "1.0.0",++ "owner": "chat",++ "schema": "chat/vibe-conversations-result.v1.json",++ "visibility": "public",++ "compatibility": "backward",++ "status": "active"++ },{"id": "chat.vibe-deliver-request","version": "1.0.0",@@@ -8701,7 +8719,7 @@},{"id": "common.action-item",-- "version": "1.0.0",++ "version": "1.1.0","owner": "contracts","schema": "common/action-item.v1.json","visibility": "public",@@@ -8710,7 +8728,7 @@},{"id": "common.action-list-result",-- "version": "1.0.0",++ "version": "1.1.0","owner": "contracts","schema": "common/action-list-result.v1.json","visibility": "public",@@@ -8719,7 +8737,7 @@},{"id": "network.me-actions-result",-- "version": "1.0.0",++ "version": "1.1.0","owner": "network","schema": "network/me-actions-result.v1.json","visibility": "public",@@@ -8728,7 +8746,7 @@},{"id": "network.dock-state",-- "version": "1.0.0",++ "version": "1.1.0","owner": "network","schema": "network/dock-state.v1.json","visibility": "public",@@@ -10279,6 +10297,24 @@"status": "active","adr": "ADR-058"},++ {++ "id": "actor.skill-run-request",++ "version": "1.0.0",++ "owner": "actor",++ "schema": "actor/skill-run-request.v1.json",++ "visibility": "public",++ "compatibility": "backward",++ "status": "active"++ },++ {++ "id": "actor.skill-run-result",++ "version": "1.0.0",++ "owner": "actor",++ "schema": "actor/skill-run-result.v1.json",++ "visibility": "public",++ "compatibility": "backward",++ "status": "active"++ },{"id": "actor.skill","version": "2.1.0",nnew file mode 100644@@@ -0,0 +1,72 @@++{++ "$schema": "https://json-schema.org/draft/2020-12/schema",++ "$id": "https://openvibe.network/contracts/chat/vibe-conversations-result.v1.json",++ "title": "ChatVibeConversationsResult",++ "description": "chat.vibe-conversations-result@1: GET /api/vibe/conversations for a person, newest first. The last line and origin site are omitted when none is known.",++ "type": "object",++ "additionalProperties": false,++ "required": [++ "conversations",++ "count"++ ],++ "properties": {++ "count": {++ "type": "integer",++ "minimum": 0++ },++ "conversations": {++ "type": "array",++ "maxItems": 100,++ "items": {++ "type": "object",++ "additionalProperties": false,++ "required": [++ "slug",++ "name",++ "last_message_at",++ "created_at",++ "last_line",++ "last_answer_at",++ "site"++ ],++ "properties": {++ "slug": {++ "type": "string"++ },++ "name": {++ "type": "string"++ },++ "last_message_at": {++ "type": "string",++ "format": "date-time"++ },++ "created_at": {++ "type": "string",++ "format": "date-time"++ },++ "last_line": {++ "type": [++ "string",++ "null"++ ],++ "maxLength": 160++ },++ "last_answer_at": {++ "type": [++ "string",++ "null"++ ],++ "format": "date-time"++ },++ "site": {++ "type": [++ "string",++ "null"++ ],++ "maxLength": 120++ }++ }++ }++ }++ }++}@@@ -143,6 +143,85 @@"retry"]}++ },++ "skill": {++ "type": [++ "string",++ "null"++ ],++ "maxLength": 120,++ "description": "Catalogue skill key, when this run came from a skill."++ },++ "subject": {++ "type": [++ "object",++ "null"++ ],++ "additionalProperties": false,++ "required": [++ "kind",++ "title",++ "url"++ ],++ "properties": {++ "kind": {++ "type": "string",++ "maxLength": 60++ },++ "title": {++ "type": "string",++ "maxLength": 160++ },++ "url": {++ "type": [++ "string",++ "null"++ ],++ "format": "uri",++ "pattern": "^https://"++ }++ },++ "description": "The content this run is about, with its canonical page when known."++ },++ "model": {++ "type": [++ "string",++ "null"++ ],++ "maxLength": 120++ },++ "maker": {++ "type": [++ "string",++ "null"++ ],++ "maxLength": 80++ },++ "duration_ms": {++ "type": [++ "integer",++ "null"++ ],++ "minimum": 0++ },++ "run_error": {++ "oneOf": [++ {++ "type": "null"++ },++ {++ "$ref": "../ai/run-error.v1.json"++ }++ ],++ "description": "Safe error words and the next useful action. Never a raw provider response."++ },++ "step": {++ "type": [++ "string",++ "null"++ ],++ "maxLength": 240,++ "description": "The latest live step in plain words."}}}@@@ -35,6 +35,17 @@"maxLength": 80,"description": "The conversation the Chats tab has open, or null."},++ "vibe": {++ "description": "The Vibe conversation selected across sites, and when the person last opened it. An older selection opens the list instead.",++ "oneOf": [++ { "type": "null" },++ { "type": "object", "additionalProperties": false, "required": ["slug", "at"], "properties": {++ "slug": { "type": "string", "minLength": 1, "maxLength": 80, "pattern": "^[A-Za-z0-9_-]+$" },++ "at": { "type": "string", "format": "date-time" }++ } }++ ]++ },++ "agent_filter": { "enum": ["all", "running", "waiting", "scheduled", "done", "failed"], "description": "The last Agents list filter chosen by this person." },"timer": {"description": "The person's timer (plan L48 R2): it counts down in the Dock's pill on every site and rings at its end. Absent or null: none. A focus timer of rounds alternates focus and break by itself.","oneOf": [nnew file mode 100644@@@ -0,0 +1 @@++{"skill":"research-brief","choice":{"mode":"surprise"}}nnew file mode 100644@@@ -0,0 +1 @@++{"skill":"research-brief","input":{"title":"Trip"},"choice":{"mode":"balanced"}}nnew file mode 100644@@@ -0,0 +1 @@++{"run":{"id":"wrong","skill":"research-brief","subject":"Trip"}}nnew file mode 100644@@@ -0,0 +1 @@++{"run":{"id":"tsk_example","skill":"research-brief","subject":"Trip"}}nnew file mode 100644@@@ -0,0 +1 @@++{"code":"route.unavailable","words":"Unavailable","next":"Retry","action":"retry","raw":"provider payload"}nnew file mode 100644@@@ -0,0 +1 @@++{"code":"route.unavailable","words":"No model could take this task.","next":"Choose a model and retry.","action":"pick_model"}nnew file mode 100644@@@ -0,0 +1 @@++{"count":-1,"conversations":[]}nnew file mode 100644@@@ -0,0 +1 @@++{"count":1,"conversations":[{"slug":"v1","name":"Trip","last_message_at":"2026-11-09T08:00:00Z","created_at":"2026-11-09T07:00:00Z","last_line":"Hello","last_answer_at":null,"site":"openvibe.today"}]}@@@ -16942,6 +16942,55 @@}}},++ "ai.run-error": {++ "version": "1.0.0",++ "owner": "ai",++ "status": "active",++ "schema": {++ "$schema": "https://json-schema.org/draft/2020-12/schema",++ "$id": "https://openvibe.network/contracts/ai/run-error.v1.json",++ "title": "AiRunError",++ "description": "ai.run-error@1: safe, actionable words for an AI or Actor run. Raw provider responses are never display text. The code map is shared across products.",++ "type": "object",++ "additionalProperties": false,++ "required": [++ "code",++ "words",++ "next",++ "action"++ ],++ "properties": {++ "code": {++ "type": "string",++ "maxLength": 80++ },++ "words": {++ "type": "string",++ "maxLength": 240++ },++ "next": {++ "type": "string",++ "maxLength": 240++ },++ "action": {++ "enum": [++ "pick_model",++ "add_key",++ "retry",++ "retry_later",++ "open"++ ]++ },++ "retry_at": {++ "type": [++ "string",++ "null"++ ],++ "format": "date-time"++ }++ }++ }++ },"ai.call.recorded": {"version": "1.0.0","owner": "ai",@@@ -63486,6 +63535,83 @@}}},++ "chat.vibe-conversations-result": {++ "version": "1.0.0",++ "owner": "chat",++ "status": "active",++ "schema": {++ "$schema": "https://json-schema.org/draft/2020-12/schema",++ "$id": "https://openvibe.network/contracts/chat/vibe-conversations-result.v1.json",++ "title": "ChatVibeConversationsResult",++ "description": "chat.vibe-conversations-result@1: GET /api/vibe/conversations for a person, newest first. The last line and origin site are omitted when none is known.",++ "type": "object",++ "additionalProperties": false,++ "required": [++ "conversations",++ "count"++ ],++ "properties": {++ "count": {++ "type": "integer",++ "minimum": 0++ },++ "conversations": {++ "type": "array",++ "maxItems": 100,++ "items": {++ "type": "object",++ "additionalProperties": false,++ "required": [++ "slug",++ "name",++ "last_message_at",++ "created_at",++ "last_line",++ "last_answer_at",++ "site"++ ],++ "properties": {++ "slug": {++ "type": "string"++ },++ "name": {++ "type": "string"++ },++ "last_message_at": {++ "type": "string",++ "format": "date-time"++ },++ "created_at": {++ "type": "string",++ "format": "date-time"++ },++ "last_line": {++ "type": [++ "string",++ "null"++ ],++ "maxLength": 160++ },++ "last_answer_at": {++ "type": [++ "string",++ "null"++ ],++ "format": "date-time"++ },++ "site": {++ "type": [++ "string",++ "null"++ ],++ "maxLength": 120++ }++ }++ }++ }++ }++ }++ },"chat.vibe-deliver-request": {"version": "1.0.0","owner": "chat",@@@ -96354,7 +96480,7 @@}},"common.action-item": {-- "version": "1.0.0",++ "version": "1.1.0","owner": "contracts","status": "active","schema": {@@@ -96502,12 +96628,91 @@"retry"]}++ },++ "skill": {++ "type": [++ "string",++ "null"++ ],++ "maxLength": 120,++ "description": "Catalogue skill key, when this run came from a skill."++ },++ "subject": {++ "type": [++ "object",++ "null"++ ],++ "additionalProperties": false,++ "required": [++ "kind",++ "title",++ "url"++ ],++ "properties": {++ "kind": {++ "type": "string",++ "maxLength": 60++ },++ "title": {++ "type": "string",++ "maxLength": 160++ },++ "url": {++ "type": [++ "string",++ "null"++ ],++ "format": "uri",++ "pattern": "^https://"++ }++ },++ "description": "The content this run is about, with its canonical page when known."++ },++ "model": {++ "type": [++ "string",++ "null"++ ],++ "maxLength": 120++ },++ "maker": {++ "type": [++ "string",++ "null"++ ],++ "maxLength": 80++ },++ "duration_ms": {++ "type": [++ "integer",++ "null"++ ],++ "minimum": 0++ },++ "run_error": {++ "oneOf": [++ {++ "type": "null"++ },++ {++ "$ref": "../ai/run-error.v1.json"++ }++ ],++ "description": "Safe error words and the next useful action. Never a raw provider response."++ },++ "step": {++ "type": [++ "string",++ "null"++ ],++ "maxLength": 240,++ "description": "The latest live step in plain words."}}}},"common.action-list-result": {-- "version": "1.0.0",++ "version": "1.1.0","owner": "contracts","status": "active","schema": {@@@ -96532,7 +96737,7 @@}},"network.me-actions-result": {-- "version": "1.0.0",++ "version": "1.1.0","owner": "network","status": "active","schema": {@@@ -96658,7 +96863,7 @@}},"network.dock-state": {-- "version": "1.0.0",++ "version": "1.1.0","owner": "network","status": "active","schema": {@@@ -96731,6 +96936,45 @@"maxLength": 80,"description": "The conversation the Chats tab has open, or null."},++ "vibe": {++ "description": "The Vibe conversation selected across sites, and when the person last opened it. An older selection opens the list instead.",++ "oneOf": [++ {++ "type": "null"++ },++ {++ "type": "object",++ "additionalProperties": false,++ "required": [++ "slug",++ "at"++ ],++ "properties": {++ "slug": {++ "type": "string",++ "minLength": 1,++ "maxLength": 80,++ "pattern": "^[A-Za-z0-9_-]+$"++ },++ "at": {++ "type": "string",++ "format": "date-time"++ }++ }++ }++ ]++ },++ "agent_filter": {++ "enum": [++ "all",++ "running",++ "waiting",++ "scheduled",++ "done",++ "failed"++ ],++ "description": "The last Agents list filter chosen by this person."++ },"timer": {"description": "The person's timer (plan L48 R2): it counts down in the Dock's pill on every site and rings at its end. Absent or null: none. A focus timer of rounds alternates focus and break by itself.","oneOf": [@@@ -113478,6 +113722,88 @@}}},++ "actor.skill-run-request": {++ "version": "1.0.0",++ "owner": "actor",++ "status": "active",++ "schema": {++ "$schema": "https://json-schema.org/draft/2020-12/schema",++ "$id": "https://openvibe.network/contracts/actor/skill-run-request.v1.json",++ "title": "ActorSkillRunRequest",++ "description": "actor.skill-run-request@1: POST /api/v1/runs starts a public prompt skill as this person, using normal task approvals and budget.",++ "type": "object",++ "additionalProperties": false,++ "required": [++ "skill"++ ],++ "properties": {++ "skill": {++ "type": "string",++ "minLength": 1,++ "maxLength": 80++ },++ "input": {++ "type": "object",++ "additionalProperties": true,++ "maxProperties": 30++ },++ "choice": {++ "type": "object",++ "additionalProperties": false,++ "properties": {++ "mode": {++ "enum": [++ "cheapest",++ "balanced",++ "best",++ "fastest",++ "private"++ ]++ }++ }++ }++ }++ }++ },++ "actor.skill-run-result": {++ "version": "1.0.0",++ "owner": "actor",++ "status": "active",++ "schema": {++ "$schema": "https://json-schema.org/draft/2020-12/schema",++ "$id": "https://openvibe.network/contracts/actor/skill-run-result.v1.json",++ "title": "ActorSkillRunResult",++ "description": "actor.skill-run-result@1: a catalogue run is an ordinary Actor task, with its skill and subject labelled.",++ "type": "object",++ "additionalProperties": false,++ "required": [++ "run"++ ],++ "properties": {++ "run": {++ "type": "object",++ "required": [++ "id",++ "skill",++ "subject"++ ],++ "additionalProperties": true,++ "properties": {++ "id": {++ "type": "string",++ "pattern": "^tsk_"++ },++ "skill": {++ "type": "string"++ },++ "subject": {++ "type": "string"++ }++ }++ }++ }++ }++ },"actor.skill@2": {"version": "2.1.0","owner": "actor",@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Actor API",-- "version": "0.364.0",-- "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.364.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.365.0",++ "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.365.0): each operation lists the capabilities it performs; a token for the 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"@@@ -2326,6 +2326,62 @@}}},++ "/api/v1/runs": {++ "post": {++ "operationId": "post_api_v1_runs",++ "summary": "Start a catalogue skill as this person (plan 2026-11-09 §7): POST /api/v1/runs with the skill key, its input and a choice (cheapest, balanced, best, fastest, private).",++ "description": "**actor.skill.run** (public): Start a catalogue skill as this person (plan 2026-11-09 §7): POST /api/v1/runs with the skill key, its input and a choice (cheapest, balanced, best, fastest, private). The run is an ordinary Actor task with the skill's instructions pinned to it, so editing the catalogue later never changes a task already under way. A skill that needs a sandbox runner cannot start here, and the person still approves what it does.",++ "tags": [++ "actor.skill"++ ],++ "x-openvibe-capabilities": [++ "actor.skill.run"++ ],++ "x-openvibe-visibility": [++ "public"++ ],++ "x-openvibe-quota-class": "actor-task",++ "security": [++ {++ "openvibeToken": [++ "actor.skill.run"++ ]++ }++ ],++ "requestBody": {++ "required": false,++ "content": {++ "application/json": {++ "schema": {++ "$ref": "#/components/schemas/actor.skill-run-request.v1"++ }++ }++ }++ },++ "responses": {++ "2XX": {++ "description": "Success",++ "content": {++ "application/json": {++ "schema": {++ "$ref": "#/components/schemas/actor.skill-run-result.v1"++ }++ }++ }++ },++ "default": {++ "description": "An error (RFC 9457 problem details)",++ "content": {++ "application/problem+json": {++ "schema": {++ "$ref": "#/components/schemas/errors.problem.v1"++ }++ }++ }++ }++ }++ }++ },"/api/v1/tasks": {"get": {"operationId": "get_api_v1_tasks",@@@ -2734,6 +2790,72 @@}}},++ "/api/v1/tasks/{id}/retry": {++ "post": {++ "operationId": "post_api_v1_tasks_id_retry",++ "summary": "Give OpenVibe.Actor a task: POST /api/v1/tasks with the task in plain words, a mode (cheapest, balanced, best, fastest, private) and a budget.",++ "description": "**actor.task.create** (public): Give OpenVibe.Actor a task: POST /api/v1/tasks with the task in plain words, a mode (cheapest, balanced, best, fastest, private) and a budget. Actor picks the agent system for it with openvibe-sdk/placement, runs it, has a second model family check the result, and records the result, the cost to the cent and the explanation on the task (platform.task@1, answered 201 with state queued). POST /api/v1/tasks/:id/cancel stops a task that has not ended. POST /api/v1/tasks/:id/takeover gives the person the Computer the task opened (the agent's input is refused while they drive) and POST /api/v1/tasks/:id/giveback hands it back; both are the task's own person's, built on the same hand-off the agent's hand_to_person tool uses. A person's tasks are theirs; a token that names a project puts the task in that project. Each person has a daily free allowance; a task whose cheapest eligible agent would cost more than its budget fails with actor.budget.exceeded instead of running. A task may register webhooks: Actor POSTs actor.task-webhook@1 to each on the state changes it asked for, signed with a secret minted for the task and returned once, as webhook_secret, in the answer that created it. A canvas (actor.canvas@1, HO9) is also the person's own: POST /api/v1/me/canvases/:id/events with kind \"ask\" posts a button's label as the person's own message (a normal turn, at the agent's level and approvals), and with kind \"check\" flips one checklist item and tells the next turn which item changed.",++ "tags": [++ "actor.task"++ ],++ "x-openvibe-capabilities": [++ "actor.task.create"++ ],++ "x-openvibe-visibility": [++ "public"++ ],++ "x-openvibe-quota-class": "actor-task",++ "security": [++ {++ "openvibeToken": [++ "actor.task.create"++ ]++ }++ ],++ "requestBody": {++ "required": false,++ "content": {++ "application/json": {++ "schema": {++ "$ref": "#/components/schemas/actor.task-create-request.v1"++ }++ }++ }++ },++ "parameters": [++ {++ "name": "id",++ "in": "path",++ "required": true,++ "schema": {++ "type": "string"++ }++ }++ ],++ "responses": {++ "2XX": {++ "description": "Success",++ "content": {++ "application/json": {++ "schema": {++ "$ref": "#/components/schemas/platform.task.v1"++ }++ }++ }++ },++ "default": {++ "description": "An error (RFC 9457 problem details)",++ "content": {++ "application/problem+json": {++ "schema": {++ "$ref": "#/components/schemas/errors.problem.v1"++ }++ }++ }++ }++ }++ }++ },"/api/v1/tasks/{id}/still": {"get": {"operationId": "get_api_v1_tasks_id_still",@@@ -4541,6 +4663,74 @@}}},++ "actor.skill-run-request.v1": {++ "title": "ActorSkillRunRequest",++ "description": "actor.skill-run-request@1: POST /api/v1/runs starts a public prompt skill as this person, using normal task approvals and budget.",++ "type": "object",++ "additionalProperties": false,++ "required": [++ "skill"++ ],++ "properties": {++ "skill": {++ "type": "string",++ "minLength": 1,++ "maxLength": 80++ },++ "input": {++ "type": "object",++ "additionalProperties": true,++ "maxProperties": 30++ },++ "choice": {++ "type": "object",++ "additionalProperties": false,++ "properties": {++ "mode": {++ "enum": [++ "cheapest",++ "balanced",++ "best",++ "fastest",++ "private"++ ]++ }++ }++ }++ }++ },++ "actor.skill-run-result.v1": {++ "title": "ActorSkillRunResult",++ "description": "actor.skill-run-result@1: a catalogue run is an ordinary Actor task, with its skill and subject labelled.",++ "type": "object",++ "additionalProperties": false,++ "required": [++ "run"++ ],++ "properties": {++ "run": {++ "type": "object",++ "required": [++ "id",++ "skill",++ "subject"++ ],++ "additionalProperties": true,++ "properties": {++ "id": {++ "type": "string",++ "pattern": "^tsk_"++ },++ "skill": {++ "type": "string"++ },++ "subject": {++ "type": "string"++ }++ }++ }++ }++ },"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/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.",@@@ -4960,6 +5150,48 @@}}},++ "ai.run-error.v1": {++ "title": "AiRunError",++ "description": "ai.run-error@1: safe, actionable words for an AI or Actor run. Raw provider responses are never display text. The code map is shared across products.",++ "type": "object",++ "additionalProperties": false,++ "required": [++ "code",++ "words",++ "next",++ "action"++ ],++ "properties": {++ "code": {++ "type": "string",++ "maxLength": 80++ },++ "words": {++ "type": "string",++ "maxLength": 240++ },++ "next": {++ "type": "string",++ "maxLength": 240++ },++ "action": {++ "enum": [++ "pick_model",++ "add_key",++ "retry",++ "retry_later",++ "open"++ ]++ },++ "retry_at": {++ "type": [++ "string",++ "null"++ ],++ "format": "date-time"++ }++ }++ },"common.action-item.v1": {"title": "ActionItem","description": "One piece of a person's agent work in the Action Center (plan 2026-10-28 §3.10): an agent task, a coding task, an AI run, or an approval waiting on them. Each authority answers its own items in this shape (common.action-list-result@1); OpenVibe.Network merges them into buckets (network.me-actions-result@1). Text is plain (no markup); a cost is what the person was charged in USD, null when unknown or free; href is a page on the authority's own public site.",@@@ -5103,6 +5335,85 @@"retry"]}++ },++ "skill": {++ "type": [++ "string",++ "null"++ ],++ "maxLength": 120,++ "description": "Catalogue skill key, when this run came from a skill."++ },++ "subject": {++ "type": [++ "object",++ "null"++ ],++ "additionalProperties": false,++ "required": [++ "kind",++ "title",++ "url"++ ],++ "properties": {++ "kind": {++ "type": "string",++ "maxLength": 60++ },++ "title": {++ "type": "string",++ "maxLength": 160++ },++ "url": {++ "type": [++ "string",++ "null"++ ],++ "format": "uri",++ "pattern": "^https://"++ }++ },++ "description": "The content this run is about, with its canonical page when known."++ },++ "model": {++ "type": [++ "string",++ "null"++ ],++ "maxLength": 120++ },++ "maker": {++ "type": [++ "string",++ "null"++ ],++ "maxLength": 80++ },++ "duration_ms": {++ "type": [++ "integer",++ "null"++ ],++ "minimum": 0++ },++ "run_error": {++ "oneOf": [++ {++ "type": "null"++ },++ {++ "$ref": "#/components/schemas/ai.run-error.v1"++ }++ ],++ "description": "Safe error words and the next useful action. Never a raw provider response."++ },++ "step": {++ "type": [++ "string",++ "null"++ ],++ "maxLength": 240,++ "description": "The latest live step in plain words."}}},@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.AI API",-- "version": "0.364.0",-- "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.364.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.365.0",++ "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.365.0): each operation lists the capabilities it performs; a token for the 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"@@@ -7332,6 +7332,48 @@}]},++ "ai.run-error.v1": {++ "title": "AiRunError",++ "description": "ai.run-error@1: safe, actionable words for an AI or Actor run. Raw provider responses are never display text. The code map is shared across products.",++ "type": "object",++ "additionalProperties": false,++ "required": [++ "code",++ "words",++ "next",++ "action"++ ],++ "properties": {++ "code": {++ "type": "string",++ "maxLength": 80++ },++ "words": {++ "type": "string",++ "maxLength": 240++ },++ "next": {++ "type": "string",++ "maxLength": 240++ },++ "action": {++ "enum": [++ "pick_model",++ "add_key",++ "retry",++ "retry_later",++ "open"++ ]++ },++ "retry_at": {++ "type": [++ "string",++ "null"++ ],++ "format": "date-time"++ }++ }++ },"ai.run-read-result.v1": {"title": "AiRunReadResult","description": "ai.run-read-result@1: answers of ai.run.read on OpenVibe.AI (the caller's own runs; usage readers may ask for all). GET /api/v1/runs?status=&workflow=&target=&limit=&before= → { runs }; GET /api/v1/runs/:id → { run, citations, requests } (the request log is metadata only: hashes, tokens, cost, latency, never prompts); GET /api/v1/runs/:id/citations → { citations }. Someone else's run is 404 run.not_found.",@@@ -8537,6 +8579,85 @@"retry"]}++ },++ "skill": {++ "type": [++ "string",++ "null"++ ],++ "maxLength": 120,++ "description": "Catalogue skill key, when this run came from a skill."++ },++ "subject": {++ "type": [++ "object",++ "null"++ ],++ "additionalProperties": false,++ "required": [++ "kind",++ "title",++ "url"++ ],++ "properties": {++ "kind": {++ "type": "string",++ "maxLength": 60++ },++ "title": {++ "type": "string",++ "maxLength": 160++ },++ "url": {++ "type": [++ "string",++ "null"++ ],++ "format": "uri",++ "pattern": "^https://"++ }++ },++ "description": "The content this run is about, with its canonical page when known."++ },++ "model": {++ "type": [++ "string",++ "null"++ ],++ "maxLength": 120++ },++ "maker": {++ "type": [++ "string",++ "null"++ ],++ "maxLength": 80++ },++ "duration_ms": {++ "type": [++ "integer",++ "null"++ ],++ "minimum": 0++ },++ "run_error": {++ "oneOf": [++ {++ "type": "null"++ },++ {++ "$ref": "#/components/schemas/ai.run-error.v1"++ }++ ],++ "description": "Safe error words and the next useful action. Never a raw provider response."++ },++ "step": {++ "type": [++ "string",++ "null"++ ],++ "maxLength": 240,++ "description": "The latest live step in plain words."}}},@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Bench API",-- "version": "0.364.0",-- "description": "Routes of OpenVibe.Bench as the OpenVibe contracts describe them (openvibe-contracts 0.364.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.365.0",++ "description": "Routes of OpenVibe.Bench as the OpenVibe contracts describe them (openvibe-contracts 0.365.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Billing API",-- "version": "0.364.0",-- "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.364.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.365.0",++ "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.365.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Blog API",-- "version": "0.364.0",-- "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.364.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.365.0",++ "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.365.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Bot API",-- "version": "0.364.0",-- "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.364.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.365.0",++ "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.365.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Chat API",-- "version": "0.364.0",-- "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.364.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.365.0",++ "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.365.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Codes API",-- "version": "0.364.0",-- "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.364.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.365.0",++ "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.365.0): each operation lists the capabilities it performs; a token for the 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"@@@ -788,6 +788,48 @@},"components": {"schemas": {++ "ai.run-error.v1": {++ "title": "AiRunError",++ "description": "ai.run-error@1: safe, actionable words for an AI or Actor run. Raw provider responses are never display text. The code map is shared across products.",++ "type": "object",++ "additionalProperties": false,++ "required": [++ "code",++ "words",++ "next",++ "action"++ ],++ "properties": {++ "code": {++ "type": "string",++ "maxLength": 80++ },++ "words": {++ "type": "string",++ "maxLength": 240++ },++ "next": {++ "type": "string",++ "maxLength": 240++ },++ "action": {++ "enum": [++ "pick_model",++ "add_key",++ "retry",++ "retry_later",++ "open"++ ]++ },++ "retry_at": {++ "type": [++ "string",++ "null"++ ],++ "format": "date-time"++ }++ }++ },"codes.task-start-request.v1": {"title": "CodesTaskStartRequest","description": "codes.task-start-request@1: the body of POST /api/v1/tasks on OpenVibe.Codes (capability codes.task.start). A first-party service (OpenVibe.Actor) starts a coding task for a person, named with X-OV-Subject: Codes runs it on that person's own machine through OpenVibe.Run (openvibe.codes/run, plan T16), in the project of their latest task there, so the person has used openvibe.codes/run once before a service can start one for them (else 409 codes.no_project). REPO is an https git URL with no credentials; REF a branch or tag to start from (default: the repository's default branch). PROMPT is the task. AGENT names one of Codes' agents (GET /harnesses), absent for Codes' router to pick. PERMISSION: review (read-only: research, audits, reviews; nothing is changed), edit (default; the agents edit files) or full (they may also run commands: tests, installs). PUSH asks for the change on a new branch (GitHub, with the machine's GITHUB_TOKEN; never the branch it started from), PULL_REQUEST also opens a pull request. IDEMPOTENCY_KEY: a repeat for the same person with the same key answers the first task (200, created false).",@@@ -1596,6 +1638,85 @@"retry"]}++ },++ "skill": {++ "type": [++ "string",++ "null"++ ],++ "maxLength": 120,++ "description": "Catalogue skill key, when this run came from a skill."++ },++ "subject": {++ "type": [++ "object",++ "null"++ ],++ "additionalProperties": false,++ "required": [++ "kind",++ "title",++ "url"++ ],++ "properties": {++ "kind": {++ "type": "string",++ "maxLength": 60++ },++ "title": {++ "type": "string",++ "maxLength": 160++ },++ "url": {++ "type": [++ "string",++ "null"++ ],++ "format": "uri",++ "pattern": "^https://"++ }++ },++ "description": "The content this run is about, with its canonical page when known."++ },++ "model": {++ "type": [++ "string",++ "null"++ ],++ "maxLength": 120++ },++ "maker": {++ "type": [++ "string",++ "null"++ ],++ "maxLength": 80++ },++ "duration_ms": {++ "type": [++ "integer",++ "null"++ ],++ "minimum": 0++ },++ "run_error": {++ "oneOf": [++ {++ "type": "null"++ },++ {++ "$ref": "#/components/schemas/ai.run-error.v1"++ }++ ],++ "description": "Safe error words and the next useful action. Never a raw provider response."++ },++ "step": {++ "type": [++ "string",++ "null"++ ],++ "maxLength": 240,++ "description": "The latest live step in plain words."}}},@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Community API",-- "version": "0.364.0",-- "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.364.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.365.0",++ "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.365.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe Connect API",-- "version": "0.364.0",-- "description": "Routes of OpenVibe Connect as the OpenVibe contracts describe them (openvibe-contracts 0.364.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.365.0",++ "description": "Routes of OpenVibe Connect as the OpenVibe contracts describe them (openvibe-contracts 0.365.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Coupons API",-- "version": "0.364.0",-- "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.364.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.365.0",++ "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.365.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Deals API",-- "version": "0.364.0",-- "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.364.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.365.0",++ "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.365.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Design API",-- "version": "0.364.0",-- "description": "Routes of OpenVibe.Design as the OpenVibe contracts describe them (openvibe-contracts 0.364.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.365.0",++ "description": "Routes of OpenVibe.Design as the OpenVibe contracts describe them (openvibe-contracts 0.365.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Domains API",-- "version": "0.364.0",-- "description": "Routes of OpenVibe.Domains as the OpenVibe contracts describe them (openvibe-contracts 0.364.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.365.0",++ "description": "Routes of OpenVibe.Domains as the OpenVibe contracts describe them (openvibe-contracts 0.365.0): each operation lists the capabilities it performs; a token for the 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"@@@ -676,6 +676,48 @@},"components": {"schemas": {++ "ai.run-error.v1": {++ "title": "AiRunError",++ "description": "ai.run-error@1: safe, actionable words for an AI or Actor run. Raw provider responses are never display text. The code map is shared across products.",++ "type": "object",++ "additionalProperties": false,++ "required": [++ "code",++ "words",++ "next",++ "action"++ ],++ "properties": {++ "code": {++ "type": "string",++ "maxLength": 80++ },++ "words": {++ "type": "string",++ "maxLength": 240++ },++ "next": {++ "type": "string",++ "maxLength": 240++ },++ "action": {++ "enum": [++ "pick_model",++ "add_key",++ "retry",++ "retry_later",++ "open"++ ]++ },++ "retry_at": {++ "type": [++ "string",++ "null"++ ],++ "format": "date-time"++ }++ }++ },"common.action-item.v1": {"title": "ActionItem","description": "One piece of a person's agent work in the Action Center (plan 2026-10-28 §3.10): an agent task, a coding task, an AI run, or an approval waiting on them. Each authority answers its own items in this shape (common.action-list-result@1); OpenVibe.Network merges them into buckets (network.me-actions-result@1). Text is plain (no markup); a cost is what the person was charged in USD, null when unknown or free; href is a page on the authority's own public site.",@@@ -819,6 +861,85 @@"retry"]}++ },++ "skill": {++ "type": [++ "string",++ "null"++ ],++ "maxLength": 120,++ "description": "Catalogue skill key, when this run came from a skill."++ },++ "subject": {++ "type": [++ "object",++ "null"++ ],++ "additionalProperties": false,++ "required": [++ "kind",++ "title",++ "url"++ ],++ "properties": {++ "kind": {++ "type": "string",++ "maxLength": 60++ },++ "title": {++ "type": "string",++ "maxLength": 160++ },++ "url": {++ "type": [++ "string",++ "null"++ ],++ "format": "uri",++ "pattern": "^https://"++ }++ },++ "description": "The content this run is about, with its canonical page when known."++ },++ "model": {++ "type": [++ "string",++ "null"++ ],++ "maxLength": 120++ },++ "maker": {++ "type": [++ "string",++ "null"++ ],++ "maxLength": 80++ },++ "duration_ms": {++ "type": [++ "integer",++ "null"++ ],++ "minimum": 0++ },++ "run_error": {++ "oneOf": [++ {++ "type": "null"++ },++ {++ "$ref": "#/components/schemas/ai.run-error.v1"++ }++ ],++ "description": "Safe error words and the next useful action. Never a raw provider response."++ },++ "step": {++ "type": [++ "string",++ "null"++ ],++ "maxLength": 240,++ "description": "The latest live step in plain words."}}},@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Events API",-- "version": "0.364.0",-- "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.364.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.365.0",++ "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.365.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Exchange API",-- "version": "0.364.0",-- "description": "Routes of OpenVibe.Exchange as the OpenVibe contracts describe them (openvibe-contracts 0.364.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.365.0",++ "description": "Routes of OpenVibe.Exchange as the OpenVibe contracts describe them (openvibe-contracts 0.365.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Food API",-- "version": "0.364.0",-- "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.364.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.365.0",++ "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.365.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Games API",-- "version": "0.364.0",-- "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.364.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.365.0",++ "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.365.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Host API",-- "version": "0.364.0",-- "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.364.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.365.0",++ "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.365.0): each operation lists the capabilities it performs; a token for the 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"@@@ -5,8 +5,8 @@"service": "actor","name": "OpenVibe.Actor","origin": "https://openvibe.actor",-- "operations": 55,-- "capabilities": 17++ "operations": 57,++ "capabilities": 18},{"service": "ai",@@@ -173,8 +173,8 @@"service": "network","name": "OpenVibe.Network","origin": "https://openvibe.network",-- "operations": 67,-- "capabilities": 38++ "operations": 68,++ "capabilities": 39},{"service": "news",@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Inventory API",-- "version": "0.364.0",-- "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.364.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.365.0",++ "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.365.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Live API",-- "version": "0.364.0",-- "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.364.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.365.0",++ "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.365.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Mail API",-- "version": "0.364.0",-- "description": "Routes of OpenVibe.Mail as the OpenVibe contracts describe them (openvibe-contracts 0.364.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.365.0",++ "description": "Routes of OpenVibe.Mail as the OpenVibe contracts describe them (openvibe-contracts 0.365.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.MediaHub API",-- "version": "0.364.0",-- "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.364.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.365.0",++ "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.365.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Media API",-- "version": "0.364.0",-- "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.364.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.365.0",++ "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.365.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Network API",-- "version": "0.364.0",-- "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.364.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.365.0",++ "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.365.0): each operation lists the capabilities it performs; a token for the 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"@@@ -596,7 +596,7 @@"get": {"operationId": "get_api_v1_me_actions","summary": "The Action Center for the signed-in person (plan 2026-10-28 §3.10): GET /api/v1/me/actions merges Actor, Codes and AI items and Network's own confirmations into running, waiting, scheduled, done and f",-- "description": "**network.actions.read** (public): The Action Center for the signed-in person (plan 2026-10-28 §3.10): GET /api/v1/me/actions merges Actor, Codes and AI items and Network's own confirmations into running, waiting, scheduled, done and failed (network.me-actions-result@1); POST /api/v1/me/actions/:service/:id/:action approves, declines or cancels through the owning authority. Readable from every OpenVibe site with the person's Network token, like the bell.",++ "description": "**network.actions.read** (public): The Action Center for the signed-in person (plan 2026-10-28 §3.10): GET /api/v1/me/actions merges Actor, Codes and AI items and Network's own confirmations into running, waiting, scheduled, done and failed (network.me-actions-result@1); POST /api/v1/me/actions/:service/:id/:action approves, declines, cancels or retries through the owning authority. Readable from every OpenVibe site with the person's Network token, like the bell.","tags": ["network.actions"],@@@ -642,7 +642,7 @@"post": {"operationId": "post_api_v1_me_actions_service_id_action","summary": "The Action Center for the signed-in person (plan 2026-10-28 §3.10): GET /api/v1/me/actions merges Actor, Codes and AI items and Network's own confirmations into running, waiting, scheduled, done and f",-- "description": "**network.actions.read** (public): The Action Center for the signed-in person (plan 2026-10-28 §3.10): GET /api/v1/me/actions merges Actor, Codes and AI items and Network's own confirmations into running, waiting, scheduled, done and failed (network.me-actions-result@1); POST /api/v1/me/actions/:service/:id/:action approves, declines or cancels through the owning authority. Readable from every OpenVibe site with the person's Network token, like the bell.",++ "description": "**network.actions.read** (public): The Action Center for the signed-in person (plan 2026-10-28 §3.10): GET /api/v1/me/actions merges Actor, Codes and AI items and Network's own confirmations into running, waiting, scheduled, done and failed (network.me-actions-result@1); POST /api/v1/me/actions/:service/:id/:action approves, declines, cancels or retries through the owning authority. Readable from every OpenVibe site with the person's Network token, like the bell.","tags": ["network.actions"],@@@ -710,6 +710,72 @@}}},++ "/api/v1/me/actions/skills/{id}/run": {++ "post": {++ "operationId": "post_api_v1_me_actions_skills_id_run",++ "summary": "Start one of Actor's catalogue skills as the signed-in person (plan 2026-11-09 §7): POST /api/v1/me/actions/skills/:id/run asks Actor to run that skill for them, with the input and the choice.",++ "description": "**network.skill.run** (public): Start one of Actor's catalogue skills as the signed-in person (plan 2026-11-09 §7): POST /api/v1/me/actions/skills/:id/run asks Actor to run that skill for them, with the input and the choice. Network never runs the skill itself; Actor does, under the person's own approvals and budget.",++ "tags": [++ "network.skill"++ ],++ "x-openvibe-capabilities": [++ "network.skill.run"++ ],++ "x-openvibe-visibility": [++ "public"++ ],++ "x-openvibe-quota-class": "standard",++ "security": [++ {++ "openvibeToken": [++ "network.skill.run"++ ]++ }++ ],++ "requestBody": {++ "required": false,++ "content": {++ "application/json": {++ "schema": {++ "$ref": "#/components/schemas/actor.skill-run-request.v1"++ }++ }++ }++ },++ "parameters": [++ {++ "name": "id",++ "in": "path",++ "required": true,++ "schema": {++ "type": "string"++ }++ }++ ],++ "responses": {++ "2XX": {++ "description": "Success",++ "content": {++ "application/json": {++ "schema": {++ "$ref": "#/components/schemas/actor.skill-run-result.v1"++ }++ }++ }++ },++ "default": {++ "description": "An error (RFC 9457 problem details)",++ "content": {++ "application/problem+json": {++ "schema": {++ "$ref": "#/components/schemas/errors.problem.v1"++ }++ }++ }++ }++ }++ }++ },"/api/v1/me/consent": {"get": {"operationId": "get_api_v1_me_consent",@@@ -4138,6 +4204,116 @@},"components": {"schemas": {++ "actor.skill-run-request.v1": {++ "title": "ActorSkillRunRequest",++ "description": "actor.skill-run-request@1: POST /api/v1/runs starts a public prompt skill as this person, using normal task approvals and budget.",++ "type": "object",++ "additionalProperties": false,++ "required": [++ "skill"++ ],++ "properties": {++ "skill": {++ "type": "string",++ "minLength": 1,++ "maxLength": 80++ },++ "input": {++ "type": "object",++ "additionalProperties": true,++ "maxProperties": 30++ },++ "choice": {++ "type": "object",++ "additionalProperties": false,++ "properties": {++ "mode": {++ "enum": [++ "cheapest",++ "balanced",++ "best",++ "fastest",++ "private"++ ]++ }++ }++ }++ }++ },++ "actor.skill-run-result.v1": {++ "title": "ActorSkillRunResult",++ "description": "actor.skill-run-result@1: a catalogue run is an ordinary Actor task, with its skill and subject labelled.",++ "type": "object",++ "additionalProperties": false,++ "required": [++ "run"++ ],++ "properties": {++ "run": {++ "type": "object",++ "required": [++ "id",++ "skill",++ "subject"++ ],++ "additionalProperties": true,++ "properties": {++ "id": {++ "type": "string",++ "pattern": "^tsk_"++ },++ "skill": {++ "type": "string"++ },++ "subject": {++ "type": "string"++ }++ }++ }++ }++ },++ "ai.run-error.v1": {++ "title": "AiRunError",++ "description": "ai.run-error@1: safe, actionable words for an AI or Actor run. Raw provider responses are never display text. The code map is shared across products.",++ "type": "object",++ "additionalProperties": false,++ "required": [++ "code",++ "words",++ "next",++ "action"++ ],++ "properties": {++ "code": {++ "type": "string",++ "maxLength": 80++ },++ "words": {++ "type": "string",++ "maxLength": 240++ },++ "next": {++ "type": "string",++ "maxLength": 240++ },++ "action": {++ "enum": [++ "pick_model",++ "add_key",++ "retry",++ "retry_later",++ "open"++ ]++ },++ "retry_at": {++ "type": [++ "string",++ "null"++ ],++ "format": "date-time"++ }++ }++ },"bot.machine-manage-request.v1": {"title": "BotMachineManageRequest","description": "bot.machine-manage-request@1: what a caller changes on a machine (plan L34, step M2). A rename gives a name; a roles change gives the whole set of roles (network.machine-roles-put@1's shape). The same body is what the network's hub sends to Bot, so both sides speak one shape.",@@@ -4317,6 +4493,85 @@"retry"]}++ },++ "skill": {++ "type": [++ "string",++ "null"++ ],++ "maxLength": 120,++ "description": "Catalogue skill key, when this run came from a skill."++ },++ "subject": {++ "type": [++ "object",++ "null"++ ],++ "additionalProperties": false,++ "required": [++ "kind",++ "title",++ "url"++ ],++ "properties": {++ "kind": {++ "type": "string",++ "maxLength": 60++ },++ "title": {++ "type": "string",++ "maxLength": 160++ },++ "url": {++ "type": [++ "string",++ "null"++ ],++ "format": "uri",++ "pattern": "^https://"++ }++ },++ "description": "The content this run is about, with its canonical page when known."++ },++ "model": {++ "type": [++ "string",++ "null"++ ],++ "maxLength": 120++ },++ "maker": {++ "type": [++ "string",++ "null"++ ],++ "maxLength": 80++ },++ "duration_ms": {++ "type": [++ "integer",++ "null"++ ],++ "minimum": 0++ },++ "run_error": {++ "oneOf": [++ {++ "type": "null"++ },++ {++ "$ref": "#/components/schemas/ai.run-error.v1"++ }++ ],++ "description": "Safe error words and the next useful action. Never a raw provider response."++ },++ "step": {++ "type": [++ "string",++ "null"++ ],++ "maxLength": 240,++ "description": "The latest live step in plain words."}}},@@@ -6104,6 +6359,45 @@"maxLength": 80,"description": "The conversation the Chats tab has open, or null."},++ "vibe": {++ "description": "The Vibe conversation selected across sites, and when the person last opened it. An older selection opens the list instead.",++ "oneOf": [++ {++ "type": "null"++ },++ {++ "type": "object",++ "additionalProperties": false,++ "required": [++ "slug",++ "at"++ ],++ "properties": {++ "slug": {++ "type": "string",++ "minLength": 1,++ "maxLength": 80,++ "pattern": "^[A-Za-z0-9_-]+$"++ },++ "at": {++ "type": "string",++ "format": "date-time"++ }++ }++ }++ ]++ },++ "agent_filter": {++ "enum": [++ "all",++ "running",++ "waiting",++ "scheduled",++ "done",++ "failed"++ ],++ "description": "The last Agents list filter chosen by this person."++ },"timer": {"description": "The person's timer (plan L48 R2): it counts down in the Dock's pill on every site and rings at its end. Absent or null: none. A focus timer of rounds alternates focus and break by itself.","oneOf": [@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.News API",-- "version": "0.364.0",-- "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.364.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.365.0",++ "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.365.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenRestream API",-- "version": "0.364.0",-- "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.364.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.365.0",++ "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.365.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Play API",-- "version": "0.364.0",-- "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.364.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.365.0",++ "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.365.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Quest API",-- "version": "0.364.0",-- "description": "Routes of OpenVibe.Quest as the OpenVibe contracts describe them (openvibe-contracts 0.364.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.365.0",++ "description": "Routes of OpenVibe.Quest as the OpenVibe contracts describe them (openvibe-contracts 0.365.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Report API",-- "version": "0.364.0",-- "description": "Routes of OpenVibe.Report as the OpenVibe contracts describe them (openvibe-contracts 0.364.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.365.0",++ "description": "Routes of OpenVibe.Report as the OpenVibe contracts describe them (openvibe-contracts 0.365.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Reviews API",-- "version": "0.364.0",-- "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.364.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.365.0",++ "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.365.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Run API",-- "version": "0.364.0",-- "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.364.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.365.0",++ "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.365.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Search API",-- "version": "0.364.0",-- "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.364.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.365.0",++ "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.365.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Services API",-- "version": "0.364.0",-- "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.364.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.365.0",++ "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.365.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Sources API",-- "version": "0.364.0",-- "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.364.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.365.0",++ "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.365.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Space API",-- "version": "0.364.0",-- "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.364.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.365.0",++ "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.365.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Tips API",-- "version": "0.364.0",-- "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.364.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.365.0",++ "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.365.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Today API",-- "version": "0.364.0",-- "description": "Routes of OpenVibe.Today as the OpenVibe contracts describe them (openvibe-contracts 0.364.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.365.0",++ "description": "Routes of OpenVibe.Today as the OpenVibe contracts describe them (openvibe-contracts 0.365.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Tools API",-- "version": "0.364.0",-- "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.364.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.365.0",++ "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.365.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Trade API",-- "version": "0.364.0",-- "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.364.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.365.0",++ "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.365.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.VIP API",-- "version": "0.364.0",-- "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.364.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.365.0",++ "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.365.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Vision API",-- "version": "0.364.0",-- "description": "Routes of OpenVibe.Vision as the OpenVibe contracts describe them (openvibe-contracts 0.364.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.365.0",++ "description": "Routes of OpenVibe.Vision as the OpenVibe contracts describe them (openvibe-contracts 0.365.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Watch API",-- "version": "0.364.0",-- "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.364.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.365.0",++ "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.365.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Wiki API",-- "version": "0.364.0",-- "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.364.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.365.0",++ "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.365.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Work API",-- "version": "0.364.0",-- "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.364.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.365.0",++ "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.365.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Zone API",-- "version": "0.364.0",-- "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.364.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.365.0",++ "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.365.0): each operation lists the capabilities it performs; a token for the 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"@@@ -159793,6 +159793,18 @@ export interface AiRun {} | null;}++/** [email protected] (owner: ai) */++/**++ * ai.run-error@1: safe, actionable words for an AI or Actor run. Raw provider responses are never display text. The code map is shared across products.++ */++export interface AiRunError {++ code: string;++ words: string;++ next: string;++ action: "pick_model" | "add_key" | "retry" | "retry_later" | "open";++ retry_at?: string | null;++}++/** [email protected] (owner: ai) *//*** ai.call.recorded v1 (plan L40, one AI meter across the network). One AI call, wherever it happened: OpenVibe.AI's own runs, a harness turn in Codes, an Actor task, Vibe, a local model on a person's own machine. who and where: subject (the person, or null when the call is anonymous), attribution (the site or app the call came from, free text such as 'site:design'), surface (the product surface, free text such as 'design.generate' or 'codes.turn'). what ran: system (ai, harness:claude-code, harness:codex, actor, node), provider, model, effort. who paid: paid_by (own_key, openvibe_key, plan, own_machine, free_tier, network_allowance, org_key) and paid_by_detail (for example 'anthropic ...a1b2' for a person's own key, or 'claude-max' for a plan). tokens: input (the UNCACHED input tokens), output, reasoning, cache_read, cache_write (with cache_write_ttl 5m or 1h), images, audio_seconds, video_seconds. money, in USD: list_cost_usd (what the tokens cost at the human-typed list prices), charged_usd (what the payer was actually charged), fee_usd (the network's fee on top), cache_saved_usd (what the cache saved against the plain input price). price_source says where the prices came from ('models', 'pricing', 'flat', or 'no cache price' when no cache price is typed and the cache tokens are priced at the input price), price_date the day the price was checked. how it went: latency_ms, ttft_ms, attempts, outcome. ids: run_id or turn_id, and at. The record carries NO prompt and NO answer text, ever. A ledger (OpenVibe.AI) rolls the records up; a record consumed twice is stored once (idempotent by system and run_id or turn_id). Envelope: subject { type: run, id: <run_id> } or { type: user, id: <subject> }, visibility internal, priority low, actor service:ai.@@@ -206811,6 +206823,26 @@ export interface ChatVibeAskResult {code?: string;}++/** [email protected] (owner: chat) */++/**++ * chat.vibe-conversations-result@1: GET /api/vibe/conversations for a person, newest first. The last line and origin site are omitted when none is known.++ */++export interface ChatVibeConversationsResult {++ count: number;++ /**++ * @maxItems 100++ */++ conversations: {++ slug: string;++ name: string;++ last_message_at: string;++ created_at: string;++ last_line: string | null;++ last_answer_at: string | null;++ site: string | null;++ }[];++}++/** [email protected] (owner: chat) *//*** chat.vibe-deliver-request@1: a first-party service puts a result of the person's own work into their Vibe chats (OpenVibe.Actor: each finished run of one of their OpenVibe Agents, when the agent sends its results to Vibe). Chat keeps one chat per source, named after it, and posts the text there as Vibe's message, so each run is a chat they can open and continue. No AI answer is made and nothing counts against their allowance. POST /internal/chat/vibe/deliver, capability chat.vibe.deliver, loopback only.@@@ -275948,7 +275980,7 @@ export interface BotWatchLinkResult {share_id?: string;}--/** [email protected] (owner: contracts) */++/** [email protected] (owner: contracts) *//*** One piece of a person's agent work in the Action Center (plan 2026-10-28 §3.10): an agent task, a coding task, an AI run, or an approval waiting on them. Each authority answers its own items in this shape (common.action-list-result@1); OpenVibe.Network merges them into buckets (network.me-actions-result@1). Text is plain (no markup); a cost is what the person was charged in USD, null when unknown or free; href is a page on the authority's own public site.*/@@@ -276027,9 +276059,32 @@ export interface ActionItem {"open" | "approve" | "decline" | "cancel" | "retry","open" | "approve" | "decline" | "cancel" | "retry"];++ /**++ * Catalogue skill key, when this run came from a skill.++ */++ skill?: string | null;++ /**++ * The content this run is about, with its canonical page when known.++ */++ subject?: {++ kind: string;++ title: string;++ url: string | null;++ } | null;++ model?: string | null;++ maker?: string | null;++ duration_ms?: number | null;++ /**++ * Safe error words and the next useful action. Never a raw provider response.++ */++ run_error?: null | AiRunError;++ /**++ * The latest live step in plain words.++ */++ step?: string | null;}--/** [email protected] (owner: contracts) */++/** [email protected] (owner: contracts) *//*** One authority's Action Center items for a person (capabilities actor.actions.read, codes.actions.read, ai.actions.read, domains.actions.read): GET /api/v1/actions?subject=usr_… with the caller's service token. Everything running, waiting or scheduled, then done and failed items from the last 30 days, newest first, at most 50.*/@@@ -276040,7 +276095,7 @@ export interface ActionListResult {items: ActionItem[];}--/** [email protected] (owner: network) */++/** [email protected] (owner: network) *//*** The Action Center for the signed-in person (capability network.actions.read, GET /api/v1/me/actions): every authority's items merged into five buckets, newest first in each. sources says how each authority answered; a slow or failing one is left out (partial true), never fails the answer.*/@@@ -276066,7 +276121,7 @@ export interface MeActionsResult {generated_at: string;}--/** [email protected] (owner: network) */++/** [email protected] (owner: network) *//*** network.dock-state@1 (the Dock plan 2026-10-30, K-D1): the state of one person's Dock — the little floating surface every OpenVibe site draws. It lives in the Network, not in the browser, because localStorage is per site and the Dock follows the person across every domain. GET /api/v1/me/dock and PUT /api/v1/me/dock on OpenVibe.Network.*/@@@ -276094,6 +276149,17 @@ export interface NetworkDockState {* The conversation the Chats tab has open, or null.*/chat: string | null;++ /**++ * The Vibe conversation selected across sites, and when the person last opened it. An older selection opens the list instead.++ */++ vibe?: null | {++ slug: string;++ at: string;++ };++ /**++ * The last Agents list filter chosen by this person.++ */++ agent_filter?: "all" | "running" | "waiting" | "scheduled" | "done" | "failed";/*** The person's timer (plan L48 R2): it counts down in the Dock's pill on every site and rings at its end. Absent or null: none. A focus timer of rounds alternates focus and break by itself.*/@@@ -311139,6 +311205,33 @@ export interface ActorSkill {};}++/** [email protected] (owner: actor) */++/**++ * actor.skill-run-request@1: POST /api/v1/runs starts a public prompt skill as this person, using normal task approvals and budget.++ */++export interface ActorSkillRunRequest {++ skill: string;++ input?: {++ [k: string]: unknown | undefined;++ };++ choice?: {++ mode?: "cheapest" | "balanced" | "best" | "fastest" | "private";++ };++}++++/** [email protected] (owner: actor) */++/**++ * actor.skill-run-result@1: a catalogue run is an ordinary Actor task, with its skill and subject labelled.++ */++export interface ActorSkillRunResult {++ run: {++ id: string;++ skill: string;++ subject: string;++ [k: string]: unknown | undefined;++ };++}++/** [email protected] (owner: actor) *//*** actor.skill@2: a skill, the document an agent loads to do one kind of job well (ADR-058, ADR-060). It keeps every field and meaning of actor.skill@1 and adds a way for the skill to bring CODE that runs in a sandbox: RUNS is prompt (as @1, text and instructions only) or sandbox. A sandbox skill carries its code as ordinary TEXT resources (a .js path with media_type text/javascript, at most 64 KiB each, in the integrity hash); TOOLS (1 to 5, only when runs is sandbox) say what an agent may call: a name, a description the agent reads, language javascript (the only one in v1), an ENTRY naming one of the skill's own .js resources, ARGS as a JSON Schema subset (an object whose properties are string, number, integer, boolean or an array of those; enum, maxLength, and pattern at most 200 characters; no $ref and no nested object), NET (deny by default, openvibe-only, public) and LIMITS (wall_ms at most 30000, default 10000; mem_bytes at most 268435456, default 134217728). A sandbox skill's requires.kinds names skill.run; a prompt skill declares no tools. A skill GRANTS NOTHING: requires only declares; the agent's level and approvals decide every step (actor approvals, HO1), and a step of a kind the skill did not declare is a scan finding (actor.skill-listing@2). Code never runs on an OpenVibe server and never sees a secret: it runs as a Run job of class function on a Link that declared the skill runner, with the network its tool declared and the exact bytes the registry scanned. The INTEGRITY block is a sha256 over the canonical JSON of the document: it shows the file was not edited after it was written and says nothing about who wrote it, so the AUTHOR is a claim; the registry's listing is the only place a publisher is vouched for. The canonical JSON is the document's own fields, in this order: skill, slug, name, description, version, instructions, resources, tools, requires, runs, license, author; an optional field that is absent or empty is left out; resources are [{ path, media_type, text }] in the document's order; tools are [{ name, description, language, entry, args, net, limits }] in the document's order, with an absent net or limits (and each absent limits field) left out and args as the object the document wrote; requires is { kinds, apps, hosts } with empty lists left out; author is { subject } or { subject, name }; the value is the compact JSON of that object (no spaces). CREATED_AT is not hashed.nnew file mode 100644@@@ -0,0 +1,50 @@++{++ "map": "ai.run-error@1",++ "codes": {++ "route.unavailable": {++ "words": "No model could take this task.",++ "next": "Pick a model or add an AI key, then retry.",++ "action": "pick_model"++ },++ "provider.unavailable": {++ "words": "The model provider is unavailable.",++ "next": "Retry when the provider is back.",++ "action": "retry"++ },++ "provider.rate_limited": {++ "words": "The model provider reached its limit.",++ "next": "Retry after the limit resets.",++ "action": "retry_later"++ },++ "credentials.unavailable": {++ "words": "Your AI key is unavailable.",++ "next": "Add or check your AI key.",++ "action": "add_key"++ },++ "quota.refused": {++ "words": "Your AI allowance is used up.",++ "next": "Pick another model or retry when the allowance resets.",++ "action": "pick_model"++ },++ "queue.full": {++ "words": "AI is busy right now.",++ "next": "Retry in a moment.",++ "action": "retry_later"++ },++ "run.interrupted": {++ "words": "This run stopped during a service restart.",++ "next": "Retry the task.",++ "action": "retry"++ },++ "task.failed": {++ "words": "This task could not finish.",++ "next": "Open the task to review it, then retry.",++ "action": "open"++ },++ "unknown": {++ "words": "This run could not finish.",++ "next": "Open its details or retry.",++ "action": "open"++ }++ }++}nnew file mode 100644@@@ -0,0 +1,22 @@++{++ "id": "actor.skill.run",++ "version": "1.0",++ "owner": "actor",++ "status": "active",++ "visibility": "public",++ "description": "Start a catalogue skill as this person (plan 2026-11-09 §7): POST /api/v1/runs with the skill key, its input and a choice (cheapest, balanced, best, fastest, private). The run is an ordinary Actor task with the skill's instructions pinned to it, so editing the catalogue later never changes a task already under way. A skill that needs a sandbox runner cannot start here, and the person still approves what it does.",++ "inputSchema": "actor.skill-run-request@1",++ "outputSchema": "actor.skill-run-result@1",++ "permissions": [++ "actor:tasks:create"++ ],++ "resourceConstraints": [++ "owner",++ "project"++ ],++ "quotaClass": "actor-task",++ "events": [],++ "implementedBy": [++ "POST /api/v1/runs"++ ]++}@@@ -20,6 +20,7 @@"implementedBy": ["POST /api/v1/tasks","POST /api/v1/tasks/:id/cancel",++ "POST /api/v1/tasks/:id/retry","POST /api/v1/tasks/:id/takeover","POST /api/v1/tasks/:id/giveback","POST /api/v1/me/canvases/:id/events"@@@ -4,7 +4,7 @@"owner": "network","status": "active","visibility": "public",-- "description": "The Action Center for the signed-in person (plan 2026-10-28 §3.10): GET /api/v1/me/actions merges Actor, Codes and AI items and Network's own confirmations into running, waiting, scheduled, done and failed (network.me-actions-result@1); POST /api/v1/me/actions/:service/:id/:action approves, declines or cancels through the owning authority. Readable from every OpenVibe site with the person's Network token, like the bell.",++ "description": "The Action Center for the signed-in person (plan 2026-10-28 §3.10): GET /api/v1/me/actions merges Actor, Codes and AI items and Network's own confirmations into running, waiting, scheduled, done and failed (network.me-actions-result@1); POST /api/v1/me/actions/:service/:id/:action approves, declines, cancels or retries through the owning authority. Readable from every OpenVibe site with the person's Network token, like the bell.","permissions": ["network:read","network:write"nnew file mode 100644@@@ -0,0 +1,21 @@++{++ "id": "network.skill.run",++ "version": "1.0",++ "owner": "network",++ "status": "active",++ "visibility": "public",++ "description": "Start one of Actor's catalogue skills as the signed-in person (plan 2026-11-09 §7): POST /api/v1/me/actions/skills/:id/run asks Actor to run that skill for them, with the input and the choice. Network never runs the skill itself; Actor does, under the person's own approvals and budget.",++ "inputSchema": "actor.skill-run-request@1",++ "outputSchema": "actor.skill-run-result@1",++ "permissions": [++ "network:write"++ ],++ "resourceConstraints": [++ "owner"++ ],++ "quotaClass": "standard",++ "events": [],++ "implementedBy": [++ "POST /api/v1/me/actions/skills/:id/run"++ ]++}@@@ -17,6 +17,7 @@},"capabilities": ["actor.task.create",++ "actor.skill.run","actor.task.read","actor.task.list","actor.agent.read",@@@ -15,6 +15,7 @@"apiRoutes": [{ "method": "GET", "path": "/api/vibe/models" },{ "method": "GET", "path": "/api/vibe/chat", "responseSchema": "chat.vibe-answer@2" },++ { "method": "GET", "path": "/api/vibe/conversations", "responseSchema": "chat.vibe-conversations-result@1" },{ "method": "POST", "path": "/api/vibe/ask" },{ "method": "POST", "path": "/api/vibe/pick" },{ "method": "POST", "path": "/api/vibe/prefer" },@@@ -84,6 +84,7 @@"network.staff.read","network.status.incident","network.actions.read",++ "network.skill.run","network.consent.read","network.consent.manage","network.machines.read",@@@ -1,12 +1,12 @@{"name": "openvibe-contracts",-- "version": "0.364.0",++ "version": "0.365.0","lockfileVersion": 3,"requires": true,"packages": {"": {"name": "openvibe-contracts",-- "version": "0.364.0",++ "version": "0.365.0","license": "AGPL-3.0-only","dependencies": {"ajv": "^8.17.1",@@@ -1,6 +1,6 @@{"name": "openvibe-contracts",-- "version": "0.364.0",++ "version": "0.365.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",nnew file mode 100644@@@ -0,0 +1,29 @@++'use strict';++const assert = require('assert');++const { validate } = require('..');++const error = { code: 'route.unavailable', words: 'No model could take this task.', next: 'Pick a model or add an AI key, then retry.', action: 'pick_model' };++assert.ok(validate('ai.run-error@1', error).valid, 'a safe action error is in the contract');++assert.ok(!validate('ai.run-error@1', { ...error, raw: '{tried:[...]}' }).valid, 'raw provider payloads have no display field');++const map = require('../manifests/ai-run-error-codes.v1.json').codes;++assert.deepStrictEqual(map['route.unavailable'], { words: error.words, next: error.next, action: error.action });++const item = {++ service: 'ai', id: 'run_123', kind: 'ai_run', title: 'Draft a post', summary: error.words,++ bucket: 'failed', state: 'failed', created_at: '2026-11-09T08:00:00.000Z', updated_at: '2026-11-09T08:01:00.000Z',++ href: 'https://ai.openvibe.services/runs/run_123', actions: ['open'], error: error.words,++ run_error: error, skill: 'blog.write', subject: { kind: 'post', title: 'Patch notes draft', url: 'https://openvibe.blog/posts/42' },++ model: 'gpt-5-nano', maker: 'OpenAI', duration_ms: 60000, step: null,++};++assert.ok(validate('common.action-item@1', item).valid, 'the action feed carries the run details');++assert.ok(!validate('common.action-item@1', { ...item, duration_ms: -1 }).valid);++const state = {++ open: true, tab: 'vibe', pinned: false, agent: null, chat: null,++ vibe: { slug: 'v-abc', at: '2026-11-09T08:00:00.000Z' }, agent_filter: 'failed',++ place: { phone: { corner: 'bottom-right' }, desktop: { corner: 'top-left', width: 420, height: 640 } },++ updated_at: '2026-11-09T08:00:00.000Z',++};++assert.ok(validate('network.dock-state@1', state).valid, 'the recent conversation and Agents filter sync');++assert.ok(!validate('network.dock-state@1', { ...state, vibe: { slug: '<bad>', at: state.vibe.at } }).valid);++assert.ok(validate('chat.vibe-conversations-result@1', { count: 1, conversations: [{ slug: 'v-abc', name: 'Patch notes', last_message_at: state.updated_at, created_at: state.updated_at, last_line: 'What changed?', last_answer_at: null, site: 'openvibe.blog' }] }).valid);++assert.ok(validate('actor.skill-run-request@1', { skill: 'skl_example', input: {}, choice: { mode: 'balanced' } }).valid);++assert.ok(validate('actor.skill-run-result@1', { run: { id: 'tsk_example', skill: 'blog.write', subject: 'Patch notes' } }).valid);++console.log('dock v2 contracts: safe errors, action context, synced state, Vibe list and skill runs');
@@ -1,5 +1,9 @@
@@ -1,5 +1,9 @@
# Changelog
# Changelog
+## 0.365.0 — 2026-11-09
+
+- Dock v2: action-item words, ai.run-error@1, skill runs and Vibe conversations
+
## 0.364.0 — 2026-11-09
## 0.364.0 — 2026-11-09
- The Feed of everything: community.feed-item@1
- The Feed of everything: community.feed-item@1
new file mode 100644
new file mode 100644
@@ -0,0 +1,38 @@
@@ -0,0 +1,38 @@
+{
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "https://openvibe.network/contracts/actor/skill-run-request.v1.json",
+ "title": "ActorSkillRunRequest",
+ "description": "actor.skill-run-request@1: POST /api/v1/runs starts a public prompt skill as this person, using normal task approvals and budget.",
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "skill"
+ ],
+ "properties": {
+ "skill": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 80
+ },
+ "input": {
+ "type": "object",
+ "additionalProperties": true,
+ "maxProperties": 30
+ },
+ "choice": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "mode": {
+ "enum": [
+ "cheapest",
+ "balanced",
+ "best",
+ "fastest",
+ "private"
+ ]
+ }
+ }
+ }
+ }
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,34 @@
@@ -0,0 +1,34 @@
+{
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "https://openvibe.network/contracts/actor/skill-run-result.v1.json",
+ "title": "ActorSkillRunResult",
+ "description": "actor.skill-run-result@1: a catalogue run is an ordinary Actor task, with its skill and subject labelled.",
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "run"
+ ],
+ "properties": {
+ "run": {
+ "type": "object",
+ "required": [
+ "id",
+ "skill",
+ "subject"
+ ],
+ "additionalProperties": true,
+ "properties": {
+ "id": {
+ "type": "string",
+ "pattern": "^tsk_"
+ },
+ "skill": {
+ "type": "string"
+ },
+ "subject": {
+ "type": "string"
+ }
+ }
+ }
+ }
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,44 @@
@@ -0,0 +1,44 @@
+{
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "https://openvibe.network/contracts/ai/run-error.v1.json",
+ "title": "AiRunError",
+ "description": "ai.run-error@1: safe, actionable words for an AI or Actor run. Raw provider responses are never display text. The code map is shared across products.",
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "code",
+ "words",
+ "next",
+ "action"
+ ],
+ "properties": {
+ "code": {
+ "type": "string",
+ "maxLength": 80
+ },
+ "words": {
+ "type": "string",
+ "maxLength": 240
+ },
+ "next": {
+ "type": "string",
+ "maxLength": 240
+ },
+ "action": {
+ "enum": [
+ "pick_model",
+ "add_key",
+ "retry",
+ "retry_later",
+ "open"
+ ]
+ },
+ "retry_at": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "format": "date-time"
+ }
+ }
+}
@@ -1571,6 +1571,15 @@
@@ -1571,6 +1571,15 @@
"status": "active",
"status": "active",
"adr": "ADR-015"
"adr": "ADR-015"
},
},
+ {
+ "id": "ai.run-error",
+ "version": "1.0.0",
+ "owner": "ai",
+ "schema": "ai/run-error.v1.json",
+ "visibility": "public",
+ "compatibility": "backward",
+ "status": "active"
+ },
{
{
"id": "ai.call.recorded",
"id": "ai.call.recorded",
"version": "1.0.0",
"version": "1.0.0",
@@ -5702,6 +5711,15 @@
@@ -5702,6 +5711,15 @@
"compatibility": "backward",
"compatibility": "backward",
"status": "active"
"status": "active"
},
},
+ {
+ "id": "chat.vibe-conversations-result",
+ "version": "1.0.0",
+ "owner": "chat",
+ "schema": "chat/vibe-conversations-result.v1.json",
+ "visibility": "public",
+ "compatibility": "backward",
+ "status": "active"
+ },
{
{
"id": "chat.vibe-deliver-request",
"id": "chat.vibe-deliver-request",
"version": "1.0.0",
"version": "1.0.0",
@@ -8701,7 +8719,7 @@
@@ -8701,7 +8719,7 @@
},
},
{
{
"id": "common.action-item",
"id": "common.action-item",
- "version": "1.0.0",
+ "version": "1.1.0",
"owner": "contracts",
"owner": "contracts",
"schema": "common/action-item.v1.json",
"schema": "common/action-item.v1.json",
"visibility": "public",
"visibility": "public",
@@ -8710,7 +8728,7 @@
@@ -8710,7 +8728,7 @@
},
},
{
{
"id": "common.action-list-result",
"id": "common.action-list-result",
- "version": "1.0.0",
+ "version": "1.1.0",
"owner": "contracts",
"owner": "contracts",
"schema": "common/action-list-result.v1.json",
"schema": "common/action-list-result.v1.json",
"visibility": "public",
"visibility": "public",
@@ -8719,7 +8737,7 @@
@@ -8719,7 +8737,7 @@
},
},
{
{
"id": "network.me-actions-result",
"id": "network.me-actions-result",
- "version": "1.0.0",
+ "version": "1.1.0",
"owner": "network",
"owner": "network",
"schema": "network/me-actions-result.v1.json",
"schema": "network/me-actions-result.v1.json",
"visibility": "public",
"visibility": "public",
@@ -8728,7 +8746,7 @@
@@ -8728,7 +8746,7 @@
},
},
{
{
"id": "network.dock-state",
"id": "network.dock-state",
- "version": "1.0.0",
+ "version": "1.1.0",
"owner": "network",
"owner": "network",
"schema": "network/dock-state.v1.json",
"schema": "network/dock-state.v1.json",
"visibility": "public",
"visibility": "public",
@@ -10279,6 +10297,24 @@
@@ -10279,6 +10297,24 @@
"status": "active",
"status": "active",
"adr": "ADR-058"
"adr": "ADR-058"
},
},
+ {
+ "id": "actor.skill-run-request",
+ "version": "1.0.0",
+ "owner": "actor",
+ "schema": "actor/skill-run-request.v1.json",
+ "visibility": "public",
+ "compatibility": "backward",
+ "status": "active"
+ },
+ {
+ "id": "actor.skill-run-result",
+ "version": "1.0.0",
+ "owner": "actor",
+ "schema": "actor/skill-run-result.v1.json",
+ "visibility": "public",
+ "compatibility": "backward",
+ "status": "active"
+ },
{
{
"id": "actor.skill",
"id": "actor.skill",
"version": "2.1.0",
"version": "2.1.0",
new file mode 100644
new file mode 100644
@@ -0,0 +1,72 @@
@@ -0,0 +1,72 @@
+{
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "https://openvibe.network/contracts/chat/vibe-conversations-result.v1.json",
+ "title": "ChatVibeConversationsResult",
+ "description": "chat.vibe-conversations-result@1: GET /api/vibe/conversations for a person, newest first. The last line and origin site are omitted when none is known.",
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "conversations",
+ "count"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "minimum": 0
+ },
+ "conversations": {
+ "type": "array",
+ "maxItems": 100,
+ "items": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "slug",
+ "name",
+ "last_message_at",
+ "created_at",
+ "last_line",
+ "last_answer_at",
+ "site"
+ ],
+ "properties": {
+ "slug": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
+ "last_message_at": {
+ "type": "string",
+ "format": "date-time"
+ },
+ "created_at": {
+ "type": "string",
+ "format": "date-time"
+ },
+ "last_line": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "maxLength": 160
+ },
+ "last_answer_at": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "format": "date-time"
+ },
+ "site": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "maxLength": 120
+ }
+ }
+ }
+ }
+ }
+}
@@ -143,6 +143,85 @@
@@ -143,6 +143,85 @@
"retry"
"retry"
]
]
}
}
+ },
+ "skill": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "maxLength": 120,
+ "description": "Catalogue skill key, when this run came from a skill."
+ },
+ "subject": {
+ "type": [
+ "object",
+ "null"
+ ],
+ "additionalProperties": false,
+ "required": [
+ "kind",
+ "title",
+ "url"
+ ],
+ "properties": {
+ "kind": {
+ "type": "string",
+ "maxLength": 60
+ },
+ "title": {
+ "type": "string",
+ "maxLength": 160
+ },
+ "url": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "format": "uri",
+ "pattern": "^https://"
+ }
+ },
+ "description": "The content this run is about, with its canonical page when known."
+ },
+ "model": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "maxLength": 120
+ },
+ "maker": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "maxLength": 80
+ },
+ "duration_ms": {
+ "type": [
+ "integer",
+ "null"
+ ],
+ "minimum": 0
+ },
+ "run_error": {
+ "oneOf": [
+ {
+ "type": "null"
+ },
+ {
+ "$ref": "../ai/run-error.v1.json"
+ }
+ ],
+ "description": "Safe error words and the next useful action. Never a raw provider response."
+ },
+ "step": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "maxLength": 240,
+ "description": "The latest live step in plain words."
}
}
}
}
}
}
@@ -35,6 +35,17 @@
@@ -35,6 +35,17 @@
"maxLength": 80,
"maxLength": 80,
"description": "The conversation the Chats tab has open, or null."
"description": "The conversation the Chats tab has open, or null."
},
},
+ "vibe": {
+ "description": "The Vibe conversation selected across sites, and when the person last opened it. An older selection opens the list instead.",
+ "oneOf": [
+ { "type": "null" },
+ { "type": "object", "additionalProperties": false, "required": ["slug", "at"], "properties": {
+ "slug": { "type": "string", "minLength": 1, "maxLength": 80, "pattern": "^[A-Za-z0-9_-]+$" },
+ "at": { "type": "string", "format": "date-time" }
+ } }
+ ]
+ },
+ "agent_filter": { "enum": ["all", "running", "waiting", "scheduled", "done", "failed"], "description": "The last Agents list filter chosen by this person." },
"timer": {
"timer": {
"description": "The person's timer (plan L48 R2): it counts down in the Dock's pill on every site and rings at its end. Absent or null: none. A focus timer of rounds alternates focus and break by itself.",
"description": "The person's timer (plan L48 R2): it counts down in the Dock's pill on every site and rings at its end. Absent or null: none. A focus timer of rounds alternates focus and break by itself.",
"oneOf": [
"oneOf": [
new file mode 100644
new file mode 100644
@@ -0,0 +1 @@
@@ -0,0 +1 @@
+{"skill":"research-brief","choice":{"mode":"surprise"}}
new file mode 100644
new file mode 100644
@@ -0,0 +1 @@
@@ -0,0 +1 @@
+{"skill":"research-brief","input":{"title":"Trip"},"choice":{"mode":"balanced"}}
new file mode 100644
new file mode 100644
@@ -0,0 +1 @@
@@ -0,0 +1 @@
+{"run":{"id":"wrong","skill":"research-brief","subject":"Trip"}}
new file mode 100644
new file mode 100644
@@ -0,0 +1 @@
@@ -0,0 +1 @@
+{"run":{"id":"tsk_example","skill":"research-brief","subject":"Trip"}}
new file mode 100644
new file mode 100644
@@ -0,0 +1 @@
@@ -0,0 +1 @@
+{"code":"route.unavailable","words":"Unavailable","next":"Retry","action":"retry","raw":"provider payload"}
new file mode 100644
new file mode 100644
@@ -0,0 +1 @@
@@ -0,0 +1 @@
+{"code":"route.unavailable","words":"No model could take this task.","next":"Choose a model and retry.","action":"pick_model"}
new file mode 100644
new file mode 100644
@@ -0,0 +1 @@
@@ -0,0 +1 @@
+{"count":-1,"conversations":[]}
new file mode 100644
new file mode 100644
@@ -0,0 +1 @@
@@ -0,0 +1 @@
+{"count":1,"conversations":[{"slug":"v1","name":"Trip","last_message_at":"2026-11-09T08:00:00Z","created_at":"2026-11-09T07:00:00Z","last_line":"Hello","last_answer_at":null,"site":"openvibe.today"}]}
@@ -16942,6 +16942,55 @@
@@ -16942,6 +16942,55 @@
}
}
}
}
},
},
+ "ai.run-error": {
+ "version": "1.0.0",
+ "owner": "ai",
+ "status": "active",
+ "schema": {
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "https://openvibe.network/contracts/ai/run-error.v1.json",
+ "title": "AiRunError",
+ "description": "ai.run-error@1: safe, actionable words for an AI or Actor run. Raw provider responses are never display text. The code map is shared across products.",
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "code",
+ "words",
+ "next",
+ "action"
+ ],
+ "properties": {
+ "code": {
+ "type": "string",
+ "maxLength": 80
+ },
+ "words": {
+ "type": "string",
+ "maxLength": 240
+ },
+ "next": {
+ "type": "string",
+ "maxLength": 240
+ },
+ "action": {
+ "enum": [
+ "pick_model",
+ "add_key",
+ "retry",
+ "retry_later",
+ "open"
+ ]
+ },
+ "retry_at": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "format": "date-time"
+ }
+ }
+ }
+ },
"ai.call.recorded": {
"ai.call.recorded": {
"version": "1.0.0",
"version": "1.0.0",
"owner": "ai",
"owner": "ai",
@@ -63486,6 +63535,83 @@
@@ -63486,6 +63535,83 @@
}
}
}
}
},
},
+ "chat.vibe-conversations-result": {
+ "version": "1.0.0",
+ "owner": "chat",
+ "status": "active",
+ "schema": {
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "https://openvibe.network/contracts/chat/vibe-conversations-result.v1.json",
+ "title": "ChatVibeConversationsResult",
+ "description": "chat.vibe-conversations-result@1: GET /api/vibe/conversations for a person, newest first. The last line and origin site are omitted when none is known.",
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "conversations",
+ "count"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "minimum": 0
+ },
+ "conversations": {
+ "type": "array",
+ "maxItems": 100,
+ "items": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "slug",
+ "name",
+ "last_message_at",
+ "created_at",
+ "last_line",
+ "last_answer_at",
+ "site"
+ ],
+ "properties": {
+ "slug": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
+ "last_message_at": {
+ "type": "string",
+ "format": "date-time"
+ },
+ "created_at": {
+ "type": "string",
+ "format": "date-time"
+ },
+ "last_line": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "maxLength": 160
+ },
+ "last_answer_at": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "format": "date-time"
+ },
+ "site": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "maxLength": 120
+ }
+ }
+ }
+ }
+ }
+ }
+ },
"chat.vibe-deliver-request": {
"chat.vibe-deliver-request": {
"version": "1.0.0",
"version": "1.0.0",
"owner": "chat",
"owner": "chat",
@@ -96354,7 +96480,7 @@
@@ -96354,7 +96480,7 @@
}
}
},
},
"common.action-item": {
"common.action-item": {
- "version": "1.0.0",
+ "version": "1.1.0",
"owner": "contracts",
"owner": "contracts",
"status": "active",
"status": "active",
"schema": {
"schema": {
@@ -96502,12 +96628,91 @@
@@ -96502,12 +96628,91 @@
"retry"
"retry"
]
]
}
}
+ },
+ "skill": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "maxLength": 120,
+ "description": "Catalogue skill key, when this run came from a skill."
+ },
+ "subject": {
+ "type": [
+ "object",
+ "null"
+ ],
+ "additionalProperties": false,
+ "required": [
+ "kind",
+ "title",
+ "url"
+ ],
+ "properties": {
+ "kind": {
+ "type": "string",
+ "maxLength": 60
+ },
+ "title": {
+ "type": "string",
+ "maxLength": 160
+ },
+ "url": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "format": "uri",
+ "pattern": "^https://"
+ }
+ },
+ "description": "The content this run is about, with its canonical page when known."
+ },
+ "model": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "maxLength": 120
+ },
+ "maker": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "maxLength": 80
+ },
+ "duration_ms": {
+ "type": [
+ "integer",
+ "null"
+ ],
+ "minimum": 0
+ },
+ "run_error": {
+ "oneOf": [
+ {
+ "type": "null"
+ },
+ {
+ "$ref": "../ai/run-error.v1.json"
+ }
+ ],
+ "description": "Safe error words and the next useful action. Never a raw provider response."
+ },
+ "step": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "maxLength": 240,
+ "description": "The latest live step in plain words."
}
}
}
}
}
}
},
},
"common.action-list-result": {
"common.action-list-result": {
- "version": "1.0.0",
+ "version": "1.1.0",
"owner": "contracts",
"owner": "contracts",
"status": "active",
"status": "active",
"schema": {
"schema": {
@@ -96532,7 +96737,7 @@
@@ -96532,7 +96737,7 @@
}
}
},
},
"network.me-actions-result": {
"network.me-actions-result": {
- "version": "1.0.0",
+ "version": "1.1.0",
"owner": "network",
"owner": "network",
"status": "active",
"status": "active",
"schema": {
"schema": {
@@ -96658,7 +96863,7 @@
@@ -96658,7 +96863,7 @@
}
}
},
},
"network.dock-state": {
"network.dock-state": {
- "version": "1.0.0",
+ "version": "1.1.0",
"owner": "network",
"owner": "network",
"status": "active",
"status": "active",
"schema": {
"schema": {
@@ -96731,6 +96936,45 @@
@@ -96731,6 +96936,45 @@
"maxLength": 80,
"maxLength": 80,
"description": "The conversation the Chats tab has open, or null."
"description": "The conversation the Chats tab has open, or null."
},
},
+ "vibe": {
+ "description": "The Vibe conversation selected across sites, and when the person last opened it. An older selection opens the list instead.",
+ "oneOf": [
+ {
+ "type": "null"
+ },
+ {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "slug",
+ "at"
+ ],
+ "properties": {
+ "slug": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 80,
+ "pattern": "^[A-Za-z0-9_-]+$"
+ },
+ "at": {
+ "type": "string",
+ "format": "date-time"
+ }
+ }
+ }
+ ]
+ },
+ "agent_filter": {
+ "enum": [
+ "all",
+ "running",
+ "waiting",
+ "scheduled",
+ "done",
+ "failed"
+ ],
+ "description": "The last Agents list filter chosen by this person."
+ },
"timer": {
"timer": {
"description": "The person's timer (plan L48 R2): it counts down in the Dock's pill on every site and rings at its end. Absent or null: none. A focus timer of rounds alternates focus and break by itself.",
"description": "The person's timer (plan L48 R2): it counts down in the Dock's pill on every site and rings at its end. Absent or null: none. A focus timer of rounds alternates focus and break by itself.",
"oneOf": [
"oneOf": [
@@ -113478,6 +113722,88 @@
@@ -113478,6 +113722,88 @@
}
}
}
}
},
},
+ "actor.skill-run-request": {
+ "version": "1.0.0",
+ "owner": "actor",
+ "status": "active",
+ "schema": {
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "https://openvibe.network/contracts/actor/skill-run-request.v1.json",
+ "title": "ActorSkillRunRequest",
+ "description": "actor.skill-run-request@1: POST /api/v1/runs starts a public prompt skill as this person, using normal task approvals and budget.",
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "skill"
+ ],
+ "properties": {
+ "skill": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 80
+ },
+ "input": {
+ "type": "object",
+ "additionalProperties": true,
+ "maxProperties": 30
+ },
+ "choice": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "mode": {
+ "enum": [
+ "cheapest",
+ "balanced",
+ "best",
+ "fastest",
+ "private"
+ ]
+ }
+ }
+ }
+ }
+ }
+ },
+ "actor.skill-run-result": {
+ "version": "1.0.0",
+ "owner": "actor",
+ "status": "active",
+ "schema": {
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "https://openvibe.network/contracts/actor/skill-run-result.v1.json",
+ "title": "ActorSkillRunResult",
+ "description": "actor.skill-run-result@1: a catalogue run is an ordinary Actor task, with its skill and subject labelled.",
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "run"
+ ],
+ "properties": {
+ "run": {
+ "type": "object",
+ "required": [
+ "id",
+ "skill",
+ "subject"
+ ],
+ "additionalProperties": true,
+ "properties": {
+ "id": {
+ "type": "string",
+ "pattern": "^tsk_"
+ },
+ "skill": {
+ "type": "string"
+ },
+ "subject": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ },
"actor.skill@2": {
"actor.skill@2": {
"version": "2.1.0",
"version": "2.1.0",
"owner": "actor",
"owner": "actor",
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Actor API",
"title": "OpenVibe.Actor API",
- "version": "0.364.0",
- "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.364.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.365.0",
+ "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.365.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -2326,6 +2326,62 @@
@@ -2326,6 +2326,62 @@
}
}
}
}
},
},
+ "/api/v1/runs": {
+ "post": {
+ "operationId": "post_api_v1_runs",
+ "summary": "Start a catalogue skill as this person (plan 2026-11-09 §7): POST /api/v1/runs with the skill key, its input and a choice (cheapest, balanced, best, fastest, private).",
+ "description": "**actor.skill.run** (public): Start a catalogue skill as this person (plan 2026-11-09 §7): POST /api/v1/runs with the skill key, its input and a choice (cheapest, balanced, best, fastest, private). The run is an ordinary Actor task with the skill's instructions pinned to it, so editing the catalogue later never changes a task already under way. A skill that needs a sandbox runner cannot start here, and the person still approves what it does.",
+ "tags": [
+ "actor.skill"
+ ],
+ "x-openvibe-capabilities": [
+ "actor.skill.run"
+ ],
+ "x-openvibe-visibility": [
+ "public"
+ ],
+ "x-openvibe-quota-class": "actor-task",
+ "security": [
+ {
+ "openvibeToken": [
+ "actor.skill.run"
+ ]
+ }
+ ],
+ "requestBody": {
+ "required": false,
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/actor.skill-run-request.v1"
+ }
+ }
+ }
+ },
+ "responses": {
+ "2XX": {
+ "description": "Success",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/actor.skill-run-result.v1"
+ }
+ }
+ }
+ },
+ "default": {
+ "description": "An error (RFC 9457 problem details)",
+ "content": {
+ "application/problem+json": {
+ "schema": {
+ "$ref": "#/components/schemas/errors.problem.v1"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
"/api/v1/tasks": {
"/api/v1/tasks": {
"get": {
"get": {
"operationId": "get_api_v1_tasks",
"operationId": "get_api_v1_tasks",
@@ -2734,6 +2790,72 @@
@@ -2734,6 +2790,72 @@
}
}
}
}
},
},
+ "/api/v1/tasks/{id}/retry": {
+ "post": {
+ "operationId": "post_api_v1_tasks_id_retry",
+ "summary": "Give OpenVibe.Actor a task: POST /api/v1/tasks with the task in plain words, a mode (cheapest, balanced, best, fastest, private) and a budget.",
+ "description": "**actor.task.create** (public): Give OpenVibe.Actor a task: POST /api/v1/tasks with the task in plain words, a mode (cheapest, balanced, best, fastest, private) and a budget. Actor picks the agent system for it with openvibe-sdk/placement, runs it, has a second model family check the result, and records the result, the cost to the cent and the explanation on the task (platform.task@1, answered 201 with state queued). POST /api/v1/tasks/:id/cancel stops a task that has not ended. POST /api/v1/tasks/:id/takeover gives the person the Computer the task opened (the agent's input is refused while they drive) and POST /api/v1/tasks/:id/giveback hands it back; both are the task's own person's, built on the same hand-off the agent's hand_to_person tool uses. A person's tasks are theirs; a token that names a project puts the task in that project. Each person has a daily free allowance; a task whose cheapest eligible agent would cost more than its budget fails with actor.budget.exceeded instead of running. A task may register webhooks: Actor POSTs actor.task-webhook@1 to each on the state changes it asked for, signed with a secret minted for the task and returned once, as webhook_secret, in the answer that created it. A canvas (actor.canvas@1, HO9) is also the person's own: POST /api/v1/me/canvases/:id/events with kind \"ask\" posts a button's label as the person's own message (a normal turn, at the agent's level and approvals), and with kind \"check\" flips one checklist item and tells the next turn which item changed.",
+ "tags": [
+ "actor.task"
+ ],
+ "x-openvibe-capabilities": [
+ "actor.task.create"
+ ],
+ "x-openvibe-visibility": [
+ "public"
+ ],
+ "x-openvibe-quota-class": "actor-task",
+ "security": [
+ {
+ "openvibeToken": [
+ "actor.task.create"
+ ]
+ }
+ ],
+ "requestBody": {
+ "required": false,
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/actor.task-create-request.v1"
+ }
+ }
+ }
+ },
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "2XX": {
+ "description": "Success",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/platform.task.v1"
+ }
+ }
+ }
+ },
+ "default": {
+ "description": "An error (RFC 9457 problem details)",
+ "content": {
+ "application/problem+json": {
+ "schema": {
+ "$ref": "#/components/schemas/errors.problem.v1"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
"/api/v1/tasks/{id}/still": {
"/api/v1/tasks/{id}/still": {
"get": {
"get": {
"operationId": "get_api_v1_tasks_id_still",
"operationId": "get_api_v1_tasks_id_still",
@@ -4541,6 +4663,74 @@
@@ -4541,6 +4663,74 @@
}
}
}
}
},
},
+ "actor.skill-run-request.v1": {
+ "title": "ActorSkillRunRequest",
+ "description": "actor.skill-run-request@1: POST /api/v1/runs starts a public prompt skill as this person, using normal task approvals and budget.",
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "skill"
+ ],
+ "properties": {
+ "skill": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 80
+ },
+ "input": {
+ "type": "object",
+ "additionalProperties": true,
+ "maxProperties": 30
+ },
+ "choice": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "mode": {
+ "enum": [
+ "cheapest",
+ "balanced",
+ "best",
+ "fastest",
+ "private"
+ ]
+ }
+ }
+ }
+ }
+ },
+ "actor.skill-run-result.v1": {
+ "title": "ActorSkillRunResult",
+ "description": "actor.skill-run-result@1: a catalogue run is an ordinary Actor task, with its skill and subject labelled.",
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "run"
+ ],
+ "properties": {
+ "run": {
+ "type": "object",
+ "required": [
+ "id",
+ "skill",
+ "subject"
+ ],
+ "additionalProperties": true,
+ "properties": {
+ "id": {
+ "type": "string",
+ "pattern": "^tsk_"
+ },
+ "skill": {
+ "type": "string"
+ },
+ "subject": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ },
"actor.task-create-request.v1": {
"actor.task-create-request.v1": {
"title": "ActorTaskCreateRequest",
"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/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.",
"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.",
@@ -4960,6 +5150,48 @@
@@ -4960,6 +5150,48 @@
}
}
}
}
},
},
+ "ai.run-error.v1": {
+ "title": "AiRunError",
+ "description": "ai.run-error@1: safe, actionable words for an AI or Actor run. Raw provider responses are never display text. The code map is shared across products.",
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "code",
+ "words",
+ "next",
+ "action"
+ ],
+ "properties": {
+ "code": {
+ "type": "string",
+ "maxLength": 80
+ },
+ "words": {
+ "type": "string",
+ "maxLength": 240
+ },
+ "next": {
+ "type": "string",
+ "maxLength": 240
+ },
+ "action": {
+ "enum": [
+ "pick_model",
+ "add_key",
+ "retry",
+ "retry_later",
+ "open"
+ ]
+ },
+ "retry_at": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "format": "date-time"
+ }
+ }
+ },
"common.action-item.v1": {
"common.action-item.v1": {
"title": "ActionItem",
"title": "ActionItem",
"description": "One piece of a person's agent work in the Action Center (plan 2026-10-28 §3.10): an agent task, a coding task, an AI run, or an approval waiting on them. Each authority answers its own items in this shape (common.action-list-result@1); OpenVibe.Network merges them into buckets (network.me-actions-result@1). Text is plain (no markup); a cost is what the person was charged in USD, null when unknown or free; href is a page on the authority's own public site.",
"description": "One piece of a person's agent work in the Action Center (plan 2026-10-28 §3.10): an agent task, a coding task, an AI run, or an approval waiting on them. Each authority answers its own items in this shape (common.action-list-result@1); OpenVibe.Network merges them into buckets (network.me-actions-result@1). Text is plain (no markup); a cost is what the person was charged in USD, null when unknown or free; href is a page on the authority's own public site.",
@@ -5103,6 +5335,85 @@
@@ -5103,6 +5335,85 @@
"retry"
"retry"
]
]
}
}
+ },
+ "skill": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "maxLength": 120,
+ "description": "Catalogue skill key, when this run came from a skill."
+ },
+ "subject": {
+ "type": [
+ "object",
+ "null"
+ ],
+ "additionalProperties": false,
+ "required": [
+ "kind",
+ "title",
+ "url"
+ ],
+ "properties": {
+ "kind": {
+ "type": "string",
+ "maxLength": 60
+ },
+ "title": {
+ "type": "string",
+ "maxLength": 160
+ },
+ "url": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "format": "uri",
+ "pattern": "^https://"
+ }
+ },
+ "description": "The content this run is about, with its canonical page when known."
+ },
+ "model": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "maxLength": 120
+ },
+ "maker": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "maxLength": 80
+ },
+ "duration_ms": {
+ "type": [
+ "integer",
+ "null"
+ ],
+ "minimum": 0
+ },
+ "run_error": {
+ "oneOf": [
+ {
+ "type": "null"
+ },
+ {
+ "$ref": "#/components/schemas/ai.run-error.v1"
+ }
+ ],
+ "description": "Safe error words and the next useful action. Never a raw provider response."
+ },
+ "step": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "maxLength": 240,
+ "description": "The latest live step in plain words."
}
}
}
}
},
},
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.AI API",
"title": "OpenVibe.AI API",
- "version": "0.364.0",
- "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.364.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.365.0",
+ "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.365.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -7332,6 +7332,48 @@
@@ -7332,6 +7332,48 @@
}
}
]
]
},
},
+ "ai.run-error.v1": {
+ "title": "AiRunError",
+ "description": "ai.run-error@1: safe, actionable words for an AI or Actor run. Raw provider responses are never display text. The code map is shared across products.",
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "code",
+ "words",
+ "next",
+ "action"
+ ],
+ "properties": {
+ "code": {
+ "type": "string",
+ "maxLength": 80
+ },
+ "words": {
+ "type": "string",
+ "maxLength": 240
+ },
+ "next": {
+ "type": "string",
+ "maxLength": 240
+ },
+ "action": {
+ "enum": [
+ "pick_model",
+ "add_key",
+ "retry",
+ "retry_later",
+ "open"
+ ]
+ },
+ "retry_at": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "format": "date-time"
+ }
+ }
+ },
"ai.run-read-result.v1": {
"ai.run-read-result.v1": {
"title": "AiRunReadResult",
"title": "AiRunReadResult",
"description": "ai.run-read-result@1: answers of ai.run.read on OpenVibe.AI (the caller's own runs; usage readers may ask for all). GET /api/v1/runs?status=&workflow=&target=&limit=&before= → { runs }; GET /api/v1/runs/:id → { run, citations, requests } (the request log is metadata only: hashes, tokens, cost, latency, never prompts); GET /api/v1/runs/:id/citations → { citations }. Someone else's run is 404 run.not_found.",
"description": "ai.run-read-result@1: answers of ai.run.read on OpenVibe.AI (the caller's own runs; usage readers may ask for all). GET /api/v1/runs?status=&workflow=&target=&limit=&before= → { runs }; GET /api/v1/runs/:id → { run, citations, requests } (the request log is metadata only: hashes, tokens, cost, latency, never prompts); GET /api/v1/runs/:id/citations → { citations }. Someone else's run is 404 run.not_found.",
@@ -8537,6 +8579,85 @@
@@ -8537,6 +8579,85 @@
"retry"
"retry"
]
]
}
}
+ },
+ "skill": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "maxLength": 120,
+ "description": "Catalogue skill key, when this run came from a skill."
+ },
+ "subject": {
+ "type": [
+ "object",
+ "null"
+ ],
+ "additionalProperties": false,
+ "required": [
+ "kind",
+ "title",
+ "url"
+ ],
+ "properties": {
+ "kind": {
+ "type": "string",
+ "maxLength": 60
+ },
+ "title": {
+ "type": "string",
+ "maxLength": 160
+ },
+ "url": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "format": "uri",
+ "pattern": "^https://"
+ }
+ },
+ "description": "The content this run is about, with its canonical page when known."
+ },
+ "model": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "maxLength": 120
+ },
+ "maker": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "maxLength": 80
+ },
+ "duration_ms": {
+ "type": [
+ "integer",
+ "null"
+ ],
+ "minimum": 0
+ },
+ "run_error": {
+ "oneOf": [
+ {
+ "type": "null"
+ },
+ {
+ "$ref": "#/components/schemas/ai.run-error.v1"
+ }
+ ],
+ "description": "Safe error words and the next useful action. Never a raw provider response."
+ },
+ "step": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "maxLength": 240,
+ "description": "The latest live step in plain words."
}
}
}
}
},
},
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Bench API",
"title": "OpenVibe.Bench API",
- "version": "0.364.0",
- "description": "Routes of OpenVibe.Bench as the OpenVibe contracts describe them (openvibe-contracts 0.364.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.365.0",
+ "description": "Routes of OpenVibe.Bench as the OpenVibe contracts describe them (openvibe-contracts 0.365.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Billing API",
"title": "OpenVibe.Billing API",
- "version": "0.364.0",
- "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.364.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.365.0",
+ "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.365.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Blog API",
"title": "OpenVibe.Blog API",
- "version": "0.364.0",
- "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.364.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.365.0",
+ "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.365.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Bot API",
"title": "OpenVibe.Bot API",
- "version": "0.364.0",
- "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.364.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.365.0",
+ "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.365.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Chat API",
"title": "OpenVibe.Chat API",
- "version": "0.364.0",
- "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.364.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.365.0",
+ "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.365.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Codes API",
"title": "OpenVibe.Codes API",
- "version": "0.364.0",
- "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.364.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.365.0",
+ "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.365.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -788,6 +788,48 @@
@@ -788,6 +788,48 @@
},
},
"components": {
"components": {
"schemas": {
"schemas": {
+ "ai.run-error.v1": {
+ "title": "AiRunError",
+ "description": "ai.run-error@1: safe, actionable words for an AI or Actor run. Raw provider responses are never display text. The code map is shared across products.",
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "code",
+ "words",
+ "next",
+ "action"
+ ],
+ "properties": {
+ "code": {
+ "type": "string",
+ "maxLength": 80
+ },
+ "words": {
+ "type": "string",
+ "maxLength": 240
+ },
+ "next": {
+ "type": "string",
+ "maxLength": 240
+ },
+ "action": {
+ "enum": [
+ "pick_model",
+ "add_key",
+ "retry",
+ "retry_later",
+ "open"
+ ]
+ },
+ "retry_at": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "format": "date-time"
+ }
+ }
+ },
"codes.task-start-request.v1": {
"codes.task-start-request.v1": {
"title": "CodesTaskStartRequest",
"title": "CodesTaskStartRequest",
"description": "codes.task-start-request@1: the body of POST /api/v1/tasks on OpenVibe.Codes (capability codes.task.start). A first-party service (OpenVibe.Actor) starts a coding task for a person, named with X-OV-Subject: Codes runs it on that person's own machine through OpenVibe.Run (openvibe.codes/run, plan T16), in the project of their latest task there, so the person has used openvibe.codes/run once before a service can start one for them (else 409 codes.no_project). REPO is an https git URL with no credentials; REF a branch or tag to start from (default: the repository's default branch). PROMPT is the task. AGENT names one of Codes' agents (GET /harnesses), absent for Codes' router to pick. PERMISSION: review (read-only: research, audits, reviews; nothing is changed), edit (default; the agents edit files) or full (they may also run commands: tests, installs). PUSH asks for the change on a new branch (GitHub, with the machine's GITHUB_TOKEN; never the branch it started from), PULL_REQUEST also opens a pull request. IDEMPOTENCY_KEY: a repeat for the same person with the same key answers the first task (200, created false).",
"description": "codes.task-start-request@1: the body of POST /api/v1/tasks on OpenVibe.Codes (capability codes.task.start). A first-party service (OpenVibe.Actor) starts a coding task for a person, named with X-OV-Subject: Codes runs it on that person's own machine through OpenVibe.Run (openvibe.codes/run, plan T16), in the project of their latest task there, so the person has used openvibe.codes/run once before a service can start one for them (else 409 codes.no_project). REPO is an https git URL with no credentials; REF a branch or tag to start from (default: the repository's default branch). PROMPT is the task. AGENT names one of Codes' agents (GET /harnesses), absent for Codes' router to pick. PERMISSION: review (read-only: research, audits, reviews; nothing is changed), edit (default; the agents edit files) or full (they may also run commands: tests, installs). PUSH asks for the change on a new branch (GitHub, with the machine's GITHUB_TOKEN; never the branch it started from), PULL_REQUEST also opens a pull request. IDEMPOTENCY_KEY: a repeat for the same person with the same key answers the first task (200, created false).",
@@ -1596,6 +1638,85 @@
@@ -1596,6 +1638,85 @@
"retry"
"retry"
]
]
}
}
+ },
+ "skill": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "maxLength": 120,
+ "description": "Catalogue skill key, when this run came from a skill."
+ },
+ "subject": {
+ "type": [
+ "object",
+ "null"
+ ],
+ "additionalProperties": false,
+ "required": [
+ "kind",
+ "title",
+ "url"
+ ],
+ "properties": {
+ "kind": {
+ "type": "string",
+ "maxLength": 60
+ },
+ "title": {
+ "type": "string",
+ "maxLength": 160
+ },
+ "url": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "format": "uri",
+ "pattern": "^https://"
+ }
+ },
+ "description": "The content this run is about, with its canonical page when known."
+ },
+ "model": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "maxLength": 120
+ },
+ "maker": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "maxLength": 80
+ },
+ "duration_ms": {
+ "type": [
+ "integer",
+ "null"
+ ],
+ "minimum": 0
+ },
+ "run_error": {
+ "oneOf": [
+ {
+ "type": "null"
+ },
+ {
+ "$ref": "#/components/schemas/ai.run-error.v1"
+ }
+ ],
+ "description": "Safe error words and the next useful action. Never a raw provider response."
+ },
+ "step": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "maxLength": 240,
+ "description": "The latest live step in plain words."
}
}
}
}
},
},
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Community API",
"title": "OpenVibe.Community API",
- "version": "0.364.0",
- "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.364.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.365.0",
+ "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.365.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe Connect API",
"title": "OpenVibe Connect API",
- "version": "0.364.0",
- "description": "Routes of OpenVibe Connect as the OpenVibe contracts describe them (openvibe-contracts 0.364.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.365.0",
+ "description": "Routes of OpenVibe Connect as the OpenVibe contracts describe them (openvibe-contracts 0.365.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Coupons API",
"title": "OpenVibe.Coupons API",
- "version": "0.364.0",
- "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.364.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.365.0",
+ "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.365.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Deals API",
"title": "OpenVibe.Deals API",
- "version": "0.364.0",
- "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.364.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.365.0",
+ "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.365.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Design API",
"title": "OpenVibe.Design API",
- "version": "0.364.0",
- "description": "Routes of OpenVibe.Design as the OpenVibe contracts describe them (openvibe-contracts 0.364.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.365.0",
+ "description": "Routes of OpenVibe.Design as the OpenVibe contracts describe them (openvibe-contracts 0.365.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Domains API",
"title": "OpenVibe.Domains API",
- "version": "0.364.0",
- "description": "Routes of OpenVibe.Domains as the OpenVibe contracts describe them (openvibe-contracts 0.364.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.365.0",
+ "description": "Routes of OpenVibe.Domains as the OpenVibe contracts describe them (openvibe-contracts 0.365.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -676,6 +676,48 @@
@@ -676,6 +676,48 @@
},
},
"components": {
"components": {
"schemas": {
"schemas": {
+ "ai.run-error.v1": {
+ "title": "AiRunError",
+ "description": "ai.run-error@1: safe, actionable words for an AI or Actor run. Raw provider responses are never display text. The code map is shared across products.",
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "code",
+ "words",
+ "next",
+ "action"
+ ],
+ "properties": {
+ "code": {
+ "type": "string",
+ "maxLength": 80
+ },
+ "words": {
+ "type": "string",
+ "maxLength": 240
+ },
+ "next": {
+ "type": "string",
+ "maxLength": 240
+ },
+ "action": {
+ "enum": [
+ "pick_model",
+ "add_key",
+ "retry",
+ "retry_later",
+ "open"
+ ]
+ },
+ "retry_at": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "format": "date-time"
+ }
+ }
+ },
"common.action-item.v1": {
"common.action-item.v1": {
"title": "ActionItem",
"title": "ActionItem",
"description": "One piece of a person's agent work in the Action Center (plan 2026-10-28 §3.10): an agent task, a coding task, an AI run, or an approval waiting on them. Each authority answers its own items in this shape (common.action-list-result@1); OpenVibe.Network merges them into buckets (network.me-actions-result@1). Text is plain (no markup); a cost is what the person was charged in USD, null when unknown or free; href is a page on the authority's own public site.",
"description": "One piece of a person's agent work in the Action Center (plan 2026-10-28 §3.10): an agent task, a coding task, an AI run, or an approval waiting on them. Each authority answers its own items in this shape (common.action-list-result@1); OpenVibe.Network merges them into buckets (network.me-actions-result@1). Text is plain (no markup); a cost is what the person was charged in USD, null when unknown or free; href is a page on the authority's own public site.",
@@ -819,6 +861,85 @@
@@ -819,6 +861,85 @@
"retry"
"retry"
]
]
}
}
+ },
+ "skill": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "maxLength": 120,
+ "description": "Catalogue skill key, when this run came from a skill."
+ },
+ "subject": {
+ "type": [
+ "object",
+ "null"
+ ],
+ "additionalProperties": false,
+ "required": [
+ "kind",
+ "title",
+ "url"
+ ],
+ "properties": {
+ "kind": {
+ "type": "string",
+ "maxLength": 60
+ },
+ "title": {
+ "type": "string",
+ "maxLength": 160
+ },
+ "url": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "format": "uri",
+ "pattern": "^https://"
+ }
+ },
+ "description": "The content this run is about, with its canonical page when known."
+ },
+ "model": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "maxLength": 120
+ },
+ "maker": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "maxLength": 80
+ },
+ "duration_ms": {
+ "type": [
+ "integer",
+ "null"
+ ],
+ "minimum": 0
+ },
+ "run_error": {
+ "oneOf": [
+ {
+ "type": "null"
+ },
+ {
+ "$ref": "#/components/schemas/ai.run-error.v1"
+ }
+ ],
+ "description": "Safe error words and the next useful action. Never a raw provider response."
+ },
+ "step": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "maxLength": 240,
+ "description": "The latest live step in plain words."
}
}
}
}
},
},
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Events API",
"title": "OpenVibe.Events API",
- "version": "0.364.0",
- "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.364.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.365.0",
+ "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.365.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Exchange API",
"title": "OpenVibe.Exchange API",
- "version": "0.364.0",
- "description": "Routes of OpenVibe.Exchange as the OpenVibe contracts describe them (openvibe-contracts 0.364.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.365.0",
+ "description": "Routes of OpenVibe.Exchange as the OpenVibe contracts describe them (openvibe-contracts 0.365.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Food API",
"title": "OpenVibe.Food API",
- "version": "0.364.0",
- "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.364.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.365.0",
+ "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.365.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Games API",
"title": "OpenVibe.Games API",
- "version": "0.364.0",
- "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.364.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.365.0",
+ "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.365.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Host API",
"title": "OpenVibe.Host API",
- "version": "0.364.0",
- "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.364.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.365.0",
+ "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.365.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -5,8 +5,8 @@
@@ -5,8 +5,8 @@
"service": "actor",
"service": "actor",
"name": "OpenVibe.Actor",
"name": "OpenVibe.Actor",
"origin": "https://openvibe.actor",
"origin": "https://openvibe.actor",
- "operations": 55,
- "capabilities": 17
+ "operations": 57,
+ "capabilities": 18
},
},
{
{
"service": "ai",
"service": "ai",
@@ -173,8 +173,8 @@
@@ -173,8 +173,8 @@
"service": "network",
"service": "network",
"name": "OpenVibe.Network",
"name": "OpenVibe.Network",
"origin": "https://openvibe.network",
"origin": "https://openvibe.network",
- "operations": 67,
- "capabilities": 38
+ "operations": 68,
+ "capabilities": 39
},
},
{
{
"service": "news",
"service": "news",
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Inventory API",
"title": "OpenVibe.Inventory API",
- "version": "0.364.0",
- "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.364.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.365.0",
+ "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.365.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Live API",
"title": "OpenVibe.Live API",
- "version": "0.364.0",
- "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.364.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.365.0",
+ "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.365.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Mail API",
"title": "OpenVibe.Mail API",
- "version": "0.364.0",
- "description": "Routes of OpenVibe.Mail as the OpenVibe contracts describe them (openvibe-contracts 0.364.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.365.0",
+ "description": "Routes of OpenVibe.Mail as the OpenVibe contracts describe them (openvibe-contracts 0.365.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.MediaHub API",
"title": "OpenVibe.MediaHub API",
- "version": "0.364.0",
- "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.364.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.365.0",
+ "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.365.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Media API",
"title": "OpenVibe.Media API",
- "version": "0.364.0",
- "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.364.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.365.0",
+ "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.365.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Network API",
"title": "OpenVibe.Network API",
- "version": "0.364.0",
- "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.364.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.365.0",
+ "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.365.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -596,7 +596,7 @@
@@ -596,7 +596,7 @@
"get": {
"get": {
"operationId": "get_api_v1_me_actions",
"operationId": "get_api_v1_me_actions",
"summary": "The Action Center for the signed-in person (plan 2026-10-28 §3.10): GET /api/v1/me/actions merges Actor, Codes and AI items and Network's own confirmations into running, waiting, scheduled, done and f",
"summary": "The Action Center for the signed-in person (plan 2026-10-28 §3.10): GET /api/v1/me/actions merges Actor, Codes and AI items and Network's own confirmations into running, waiting, scheduled, done and f",
- "description": "**network.actions.read** (public): The Action Center for the signed-in person (plan 2026-10-28 §3.10): GET /api/v1/me/actions merges Actor, Codes and AI items and Network's own confirmations into running, waiting, scheduled, done and failed (network.me-actions-result@1); POST /api/v1/me/actions/:service/:id/:action approves, declines or cancels through the owning authority. Readable from every OpenVibe site with the person's Network token, like the bell.",
+ "description": "**network.actions.read** (public): The Action Center for the signed-in person (plan 2026-10-28 §3.10): GET /api/v1/me/actions merges Actor, Codes and AI items and Network's own confirmations into running, waiting, scheduled, done and failed (network.me-actions-result@1); POST /api/v1/me/actions/:service/:id/:action approves, declines, cancels or retries through the owning authority. Readable from every OpenVibe site with the person's Network token, like the bell.",
"tags": [
"tags": [
"network.actions"
"network.actions"
],
],
@@ -642,7 +642,7 @@
@@ -642,7 +642,7 @@
"post": {
"post": {
"operationId": "post_api_v1_me_actions_service_id_action",
"operationId": "post_api_v1_me_actions_service_id_action",
"summary": "The Action Center for the signed-in person (plan 2026-10-28 §3.10): GET /api/v1/me/actions merges Actor, Codes and AI items and Network's own confirmations into running, waiting, scheduled, done and f",
"summary": "The Action Center for the signed-in person (plan 2026-10-28 §3.10): GET /api/v1/me/actions merges Actor, Codes and AI items and Network's own confirmations into running, waiting, scheduled, done and f",
- "description": "**network.actions.read** (public): The Action Center for the signed-in person (plan 2026-10-28 §3.10): GET /api/v1/me/actions merges Actor, Codes and AI items and Network's own confirmations into running, waiting, scheduled, done and failed (network.me-actions-result@1); POST /api/v1/me/actions/:service/:id/:action approves, declines or cancels through the owning authority. Readable from every OpenVibe site with the person's Network token, like the bell.",
+ "description": "**network.actions.read** (public): The Action Center for the signed-in person (plan 2026-10-28 §3.10): GET /api/v1/me/actions merges Actor, Codes and AI items and Network's own confirmations into running, waiting, scheduled, done and failed (network.me-actions-result@1); POST /api/v1/me/actions/:service/:id/:action approves, declines, cancels or retries through the owning authority. Readable from every OpenVibe site with the person's Network token, like the bell.",
"tags": [
"tags": [
"network.actions"
"network.actions"
],
],
@@ -710,6 +710,72 @@
@@ -710,6 +710,72 @@
}
}
}
}
},
},
+ "/api/v1/me/actions/skills/{id}/run": {
+ "post": {
+ "operationId": "post_api_v1_me_actions_skills_id_run",
+ "summary": "Start one of Actor's catalogue skills as the signed-in person (plan 2026-11-09 §7): POST /api/v1/me/actions/skills/:id/run asks Actor to run that skill for them, with the input and the choice.",
+ "description": "**network.skill.run** (public): Start one of Actor's catalogue skills as the signed-in person (plan 2026-11-09 §7): POST /api/v1/me/actions/skills/:id/run asks Actor to run that skill for them, with the input and the choice. Network never runs the skill itself; Actor does, under the person's own approvals and budget.",
+ "tags": [
+ "network.skill"
+ ],
+ "x-openvibe-capabilities": [
+ "network.skill.run"
+ ],
+ "x-openvibe-visibility": [
+ "public"
+ ],
+ "x-openvibe-quota-class": "standard",
+ "security": [
+ {
+ "openvibeToken": [
+ "network.skill.run"
+ ]
+ }
+ ],
+ "requestBody": {
+ "required": false,
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/actor.skill-run-request.v1"
+ }
+ }
+ }
+ },
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "2XX": {
+ "description": "Success",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/actor.skill-run-result.v1"
+ }
+ }
+ }
+ },
+ "default": {
+ "description": "An error (RFC 9457 problem details)",
+ "content": {
+ "application/problem+json": {
+ "schema": {
+ "$ref": "#/components/schemas/errors.problem.v1"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
"/api/v1/me/consent": {
"/api/v1/me/consent": {
"get": {
"get": {
"operationId": "get_api_v1_me_consent",
"operationId": "get_api_v1_me_consent",
@@ -4138,6 +4204,116 @@
@@ -4138,6 +4204,116 @@
},
},
"components": {
"components": {
"schemas": {
"schemas": {
+ "actor.skill-run-request.v1": {
+ "title": "ActorSkillRunRequest",
+ "description": "actor.skill-run-request@1: POST /api/v1/runs starts a public prompt skill as this person, using normal task approvals and budget.",
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "skill"
+ ],
+ "properties": {
+ "skill": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 80
+ },
+ "input": {
+ "type": "object",
+ "additionalProperties": true,
+ "maxProperties": 30
+ },
+ "choice": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "mode": {
+ "enum": [
+ "cheapest",
+ "balanced",
+ "best",
+ "fastest",
+ "private"
+ ]
+ }
+ }
+ }
+ }
+ },
+ "actor.skill-run-result.v1": {
+ "title": "ActorSkillRunResult",
+ "description": "actor.skill-run-result@1: a catalogue run is an ordinary Actor task, with its skill and subject labelled.",
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "run"
+ ],
+ "properties": {
+ "run": {
+ "type": "object",
+ "required": [
+ "id",
+ "skill",
+ "subject"
+ ],
+ "additionalProperties": true,
+ "properties": {
+ "id": {
+ "type": "string",
+ "pattern": "^tsk_"
+ },
+ "skill": {
+ "type": "string"
+ },
+ "subject": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ },
+ "ai.run-error.v1": {
+ "title": "AiRunError",
+ "description": "ai.run-error@1: safe, actionable words for an AI or Actor run. Raw provider responses are never display text. The code map is shared across products.",
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "code",
+ "words",
+ "next",
+ "action"
+ ],
+ "properties": {
+ "code": {
+ "type": "string",
+ "maxLength": 80
+ },
+ "words": {
+ "type": "string",
+ "maxLength": 240
+ },
+ "next": {
+ "type": "string",
+ "maxLength": 240
+ },
+ "action": {
+ "enum": [
+ "pick_model",
+ "add_key",
+ "retry",
+ "retry_later",
+ "open"
+ ]
+ },
+ "retry_at": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "format": "date-time"
+ }
+ }
+ },
"bot.machine-manage-request.v1": {
"bot.machine-manage-request.v1": {
"title": "BotMachineManageRequest",
"title": "BotMachineManageRequest",
"description": "bot.machine-manage-request@1: what a caller changes on a machine (plan L34, step M2). A rename gives a name; a roles change gives the whole set of roles (network.machine-roles-put@1's shape). The same body is what the network's hub sends to Bot, so both sides speak one shape.",
"description": "bot.machine-manage-request@1: what a caller changes on a machine (plan L34, step M2). A rename gives a name; a roles change gives the whole set of roles (network.machine-roles-put@1's shape). The same body is what the network's hub sends to Bot, so both sides speak one shape.",
@@ -4317,6 +4493,85 @@
@@ -4317,6 +4493,85 @@
"retry"
"retry"
]
]
}
}
+ },
+ "skill": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "maxLength": 120,
+ "description": "Catalogue skill key, when this run came from a skill."
+ },
+ "subject": {
+ "type": [
+ "object",
+ "null"
+ ],
+ "additionalProperties": false,
+ "required": [
+ "kind",
+ "title",
+ "url"
+ ],
+ "properties": {
+ "kind": {
+ "type": "string",
+ "maxLength": 60
+ },
+ "title": {
+ "type": "string",
+ "maxLength": 160
+ },
+ "url": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "format": "uri",
+ "pattern": "^https://"
+ }
+ },
+ "description": "The content this run is about, with its canonical page when known."
+ },
+ "model": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "maxLength": 120
+ },
+ "maker": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "maxLength": 80
+ },
+ "duration_ms": {
+ "type": [
+ "integer",
+ "null"
+ ],
+ "minimum": 0
+ },
+ "run_error": {
+ "oneOf": [
+ {
+ "type": "null"
+ },
+ {
+ "$ref": "#/components/schemas/ai.run-error.v1"
+ }
+ ],
+ "description": "Safe error words and the next useful action. Never a raw provider response."
+ },
+ "step": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "maxLength": 240,
+ "description": "The latest live step in plain words."
}
}
}
}
},
},
@@ -6104,6 +6359,45 @@
@@ -6104,6 +6359,45 @@
"maxLength": 80,
"maxLength": 80,
"description": "The conversation the Chats tab has open, or null."
"description": "The conversation the Chats tab has open, or null."
},
},
+ "vibe": {
+ "description": "The Vibe conversation selected across sites, and when the person last opened it. An older selection opens the list instead.",
+ "oneOf": [
+ {
+ "type": "null"
+ },
+ {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "slug",
+ "at"
+ ],
+ "properties": {
+ "slug": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 80,
+ "pattern": "^[A-Za-z0-9_-]+$"
+ },
+ "at": {
+ "type": "string",
+ "format": "date-time"
+ }
+ }
+ }
+ ]
+ },
+ "agent_filter": {
+ "enum": [
+ "all",
+ "running",
+ "waiting",
+ "scheduled",
+ "done",
+ "failed"
+ ],
+ "description": "The last Agents list filter chosen by this person."
+ },
"timer": {
"timer": {
"description": "The person's timer (plan L48 R2): it counts down in the Dock's pill on every site and rings at its end. Absent or null: none. A focus timer of rounds alternates focus and break by itself.",
"description": "The person's timer (plan L48 R2): it counts down in the Dock's pill on every site and rings at its end. Absent or null: none. A focus timer of rounds alternates focus and break by itself.",
"oneOf": [
"oneOf": [
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.News API",
"title": "OpenVibe.News API",
- "version": "0.364.0",
- "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.364.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.365.0",
+ "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.365.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenRestream API",
"title": "OpenRestream API",
- "version": "0.364.0",
- "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.364.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.365.0",
+ "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.365.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Play API",
"title": "OpenVibe.Play API",
- "version": "0.364.0",
- "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.364.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.365.0",
+ "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.365.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Quest API",
"title": "OpenVibe.Quest API",
- "version": "0.364.0",
- "description": "Routes of OpenVibe.Quest as the OpenVibe contracts describe them (openvibe-contracts 0.364.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.365.0",
+ "description": "Routes of OpenVibe.Quest as the OpenVibe contracts describe them (openvibe-contracts 0.365.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Report API",
"title": "OpenVibe.Report API",
- "version": "0.364.0",
- "description": "Routes of OpenVibe.Report as the OpenVibe contracts describe them (openvibe-contracts 0.364.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.365.0",
+ "description": "Routes of OpenVibe.Report as the OpenVibe contracts describe them (openvibe-contracts 0.365.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Reviews API",
"title": "OpenVibe.Reviews API",
- "version": "0.364.0",
- "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.364.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.365.0",
+ "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.365.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Run API",
"title": "OpenVibe.Run API",
- "version": "0.364.0",
- "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.364.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.365.0",
+ "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.365.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Search API",
"title": "OpenVibe.Search API",
- "version": "0.364.0",
- "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.364.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.365.0",
+ "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.365.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Services API",
"title": "OpenVibe.Services API",
- "version": "0.364.0",
- "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.364.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.365.0",
+ "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.365.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Sources API",
"title": "OpenVibe.Sources API",
- "version": "0.364.0",
- "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.364.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.365.0",
+ "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.365.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Space API",
"title": "OpenVibe.Space API",
- "version": "0.364.0",
- "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.364.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.365.0",
+ "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.365.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Tips API",
"title": "OpenVibe.Tips API",
- "version": "0.364.0",
- "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.364.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.365.0",
+ "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.365.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Today API",
"title": "OpenVibe.Today API",
- "version": "0.364.0",
- "description": "Routes of OpenVibe.Today as the OpenVibe contracts describe them (openvibe-contracts 0.364.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.365.0",
+ "description": "Routes of OpenVibe.Today as the OpenVibe contracts describe them (openvibe-contracts 0.365.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Tools API",
"title": "OpenVibe.Tools API",
- "version": "0.364.0",
- "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.364.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.365.0",
+ "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.365.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Trade API",
"title": "OpenVibe.Trade API",
- "version": "0.364.0",
- "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.364.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.365.0",
+ "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.365.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.VIP API",
"title": "OpenVibe.VIP API",
- "version": "0.364.0",
- "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.364.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.365.0",
+ "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.365.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Vision API",
"title": "OpenVibe.Vision API",
- "version": "0.364.0",
- "description": "Routes of OpenVibe.Vision as the OpenVibe contracts describe them (openvibe-contracts 0.364.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.365.0",
+ "description": "Routes of OpenVibe.Vision as the OpenVibe contracts describe them (openvibe-contracts 0.365.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Watch API",
"title": "OpenVibe.Watch API",
- "version": "0.364.0",
- "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.364.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.365.0",
+ "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.365.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Wiki API",
"title": "OpenVibe.Wiki API",
- "version": "0.364.0",
- "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.364.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.365.0",
+ "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.365.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Work API",
"title": "OpenVibe.Work API",
- "version": "0.364.0",
- "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.364.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.365.0",
+ "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.365.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Zone API",
"title": "OpenVibe.Zone API",
- "version": "0.364.0",
- "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.364.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.365.0",
+ "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.365.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -159793,6 +159793,18 @@ export interface AiRun {
@@ -159793,6 +159793,18 @@ export interface AiRun {
} | null;
} | null;
}
}
+/** [email protected] (owner: ai) */
+/**
+ * ai.run-error@1: safe, actionable words for an AI or Actor run. Raw provider responses are never display text. The code map is shared across products.
+ */
+export interface AiRunError {
+ code: string;
+ words: string;
+ next: string;
+ action: "pick_model" | "add_key" | "retry" | "retry_later" | "open";
+ retry_at?: string | null;
+}
+
/** [email protected] (owner: ai) */
/** [email protected] (owner: ai) */
/**
/**
* ai.call.recorded v1 (plan L40, one AI meter across the network). One AI call, wherever it happened: OpenVibe.AI's own runs, a harness turn in Codes, an Actor task, Vibe, a local model on a person's own machine. who and where: subject (the person, or null when the call is anonymous), attribution (the site or app the call came from, free text such as 'site:design'), surface (the product surface, free text such as 'design.generate' or 'codes.turn'). what ran: system (ai, harness:claude-code, harness:codex, actor, node), provider, model, effort. who paid: paid_by (own_key, openvibe_key, plan, own_machine, free_tier, network_allowance, org_key) and paid_by_detail (for example 'anthropic ...a1b2' for a person's own key, or 'claude-max' for a plan). tokens: input (the UNCACHED input tokens), output, reasoning, cache_read, cache_write (with cache_write_ttl 5m or 1h), images, audio_seconds, video_seconds. money, in USD: list_cost_usd (what the tokens cost at the human-typed list prices), charged_usd (what the payer was actually charged), fee_usd (the network's fee on top), cache_saved_usd (what the cache saved against the plain input price). price_source says where the prices came from ('models', 'pricing', 'flat', or 'no cache price' when no cache price is typed and the cache tokens are priced at the input price), price_date the day the price was checked. how it went: latency_ms, ttft_ms, attempts, outcome. ids: run_id or turn_id, and at. The record carries NO prompt and NO answer text, ever. A ledger (OpenVibe.AI) rolls the records up; a record consumed twice is stored once (idempotent by system and run_id or turn_id). Envelope: subject { type: run, id: <run_id> } or { type: user, id: <subject> }, visibility internal, priority low, actor service:ai.
* ai.call.recorded v1 (plan L40, one AI meter across the network). One AI call, wherever it happened: OpenVibe.AI's own runs, a harness turn in Codes, an Actor task, Vibe, a local model on a person's own machine. who and where: subject (the person, or null when the call is anonymous), attribution (the site or app the call came from, free text such as 'site:design'), surface (the product surface, free text such as 'design.generate' or 'codes.turn'). what ran: system (ai, harness:claude-code, harness:codex, actor, node), provider, model, effort. who paid: paid_by (own_key, openvibe_key, plan, own_machine, free_tier, network_allowance, org_key) and paid_by_detail (for example 'anthropic ...a1b2' for a person's own key, or 'claude-max' for a plan). tokens: input (the UNCACHED input tokens), output, reasoning, cache_read, cache_write (with cache_write_ttl 5m or 1h), images, audio_seconds, video_seconds. money, in USD: list_cost_usd (what the tokens cost at the human-typed list prices), charged_usd (what the payer was actually charged), fee_usd (the network's fee on top), cache_saved_usd (what the cache saved against the plain input price). price_source says where the prices came from ('models', 'pricing', 'flat', or 'no cache price' when no cache price is typed and the cache tokens are priced at the input price), price_date the day the price was checked. how it went: latency_ms, ttft_ms, attempts, outcome. ids: run_id or turn_id, and at. The record carries NO prompt and NO answer text, ever. A ledger (OpenVibe.AI) rolls the records up; a record consumed twice is stored once (idempotent by system and run_id or turn_id). Envelope: subject { type: run, id: <run_id> } or { type: user, id: <subject> }, visibility internal, priority low, actor service:ai.
@@ -206811,6 +206823,26 @@ export interface ChatVibeAskResult {
@@ -206811,6 +206823,26 @@ export interface ChatVibeAskResult {
code?: string;
code?: string;
}
}
+/** [email protected] (owner: chat) */
+/**
+ * chat.vibe-conversations-result@1: GET /api/vibe/conversations for a person, newest first. The last line and origin site are omitted when none is known.
+ */
+export interface ChatVibeConversationsResult {
+ count: number;
+ /**
+ * @maxItems 100
+ */
+ conversations: {
+ slug: string;
+ name: string;
+ last_message_at: string;
+ created_at: string;
+ last_line: string | null;
+ last_answer_at: string | null;
+ site: string | null;
+ }[];
+}
+
/** [email protected] (owner: chat) */
/** [email protected] (owner: chat) */
/**
/**
* chat.vibe-deliver-request@1: a first-party service puts a result of the person's own work into their Vibe chats (OpenVibe.Actor: each finished run of one of their OpenVibe Agents, when the agent sends its results to Vibe). Chat keeps one chat per source, named after it, and posts the text there as Vibe's message, so each run is a chat they can open and continue. No AI answer is made and nothing counts against their allowance. POST /internal/chat/vibe/deliver, capability chat.vibe.deliver, loopback only.
* chat.vibe-deliver-request@1: a first-party service puts a result of the person's own work into their Vibe chats (OpenVibe.Actor: each finished run of one of their OpenVibe Agents, when the agent sends its results to Vibe). Chat keeps one chat per source, named after it, and posts the text there as Vibe's message, so each run is a chat they can open and continue. No AI answer is made and nothing counts against their allowance. POST /internal/chat/vibe/deliver, capability chat.vibe.deliver, loopback only.
@@ -275948,7 +275980,7 @@ export interface BotWatchLinkResult {
@@ -275948,7 +275980,7 @@ export interface BotWatchLinkResult {
share_id?: string;
share_id?: string;
}
}
-/** [email protected] (owner: contracts) */
+/** [email protected] (owner: contracts) */
/**
/**
* One piece of a person's agent work in the Action Center (plan 2026-10-28 §3.10): an agent task, a coding task, an AI run, or an approval waiting on them. Each authority answers its own items in this shape (common.action-list-result@1); OpenVibe.Network merges them into buckets (network.me-actions-result@1). Text is plain (no markup); a cost is what the person was charged in USD, null when unknown or free; href is a page on the authority's own public site.
* One piece of a person's agent work in the Action Center (plan 2026-10-28 §3.10): an agent task, a coding task, an AI run, or an approval waiting on them. Each authority answers its own items in this shape (common.action-list-result@1); OpenVibe.Network merges them into buckets (network.me-actions-result@1). Text is plain (no markup); a cost is what the person was charged in USD, null when unknown or free; href is a page on the authority's own public site.
*/
*/
@@ -276027,9 +276059,32 @@ export interface ActionItem {
@@ -276027,9 +276059,32 @@ export interface ActionItem {
"open" | "approve" | "decline" | "cancel" | "retry",
"open" | "approve" | "decline" | "cancel" | "retry",
"open" | "approve" | "decline" | "cancel" | "retry"
"open" | "approve" | "decline" | "cancel" | "retry"
];
];
+ /**
+ * Catalogue skill key, when this run came from a skill.
+ */
+ skill?: string | null;
+ /**
+ * The content this run is about, with its canonical page when known.
+ */
+ subject?: {
+ kind: string;
+ title: string;
+ url: string | null;
+ } | null;
+ model?: string | null;
+ maker?: string | null;
+ duration_ms?: number | null;
+ /**
+ * Safe error words and the next useful action. Never a raw provider response.
+ */
+ run_error?: null | AiRunError;
+ /**
+ * The latest live step in plain words.
+ */
+ step?: string | null;
}
}
-/** [email protected] (owner: contracts) */
+/** [email protected] (owner: contracts) */
/**
/**
* One authority's Action Center items for a person (capabilities actor.actions.read, codes.actions.read, ai.actions.read, domains.actions.read): GET /api/v1/actions?subject=usr_… with the caller's service token. Everything running, waiting or scheduled, then done and failed items from the last 30 days, newest first, at most 50.
* One authority's Action Center items for a person (capabilities actor.actions.read, codes.actions.read, ai.actions.read, domains.actions.read): GET /api/v1/actions?subject=usr_… with the caller's service token. Everything running, waiting or scheduled, then done and failed items from the last 30 days, newest first, at most 50.
*/
*/
@@ -276040,7 +276095,7 @@ export interface ActionListResult {
@@ -276040,7 +276095,7 @@ export interface ActionListResult {
items: ActionItem[];
items: ActionItem[];
}
}
-/** [email protected] (owner: network) */
+/** [email protected] (owner: network) */
/**
/**
* The Action Center for the signed-in person (capability network.actions.read, GET /api/v1/me/actions): every authority's items merged into five buckets, newest first in each. sources says how each authority answered; a slow or failing one is left out (partial true), never fails the answer.
* The Action Center for the signed-in person (capability network.actions.read, GET /api/v1/me/actions): every authority's items merged into five buckets, newest first in each. sources says how each authority answered; a slow or failing one is left out (partial true), never fails the answer.
*/
*/
@@ -276066,7 +276121,7 @@ export interface MeActionsResult {
@@ -276066,7 +276121,7 @@ export interface MeActionsResult {
generated_at: string;
generated_at: string;
}
}
-/** [email protected] (owner: network) */
+/** [email protected] (owner: network) */
/**
/**
* network.dock-state@1 (the Dock plan 2026-10-30, K-D1): the state of one person's Dock — the little floating surface every OpenVibe site draws. It lives in the Network, not in the browser, because localStorage is per site and the Dock follows the person across every domain. GET /api/v1/me/dock and PUT /api/v1/me/dock on OpenVibe.Network.
* network.dock-state@1 (the Dock plan 2026-10-30, K-D1): the state of one person's Dock — the little floating surface every OpenVibe site draws. It lives in the Network, not in the browser, because localStorage is per site and the Dock follows the person across every domain. GET /api/v1/me/dock and PUT /api/v1/me/dock on OpenVibe.Network.
*/
*/
@@ -276094,6 +276149,17 @@ export interface NetworkDockState {
@@ -276094,6 +276149,17 @@ export interface NetworkDockState {
* The conversation the Chats tab has open, or null.
* The conversation the Chats tab has open, or null.
*/
*/
chat: string | null;
chat: string | null;
+ /**
+ * The Vibe conversation selected across sites, and when the person last opened it. An older selection opens the list instead.
+ */
+ vibe?: null | {
+ slug: string;
+ at: string;
+ };
+ /**
+ * The last Agents list filter chosen by this person.
+ */
+ agent_filter?: "all" | "running" | "waiting" | "scheduled" | "done" | "failed";
/**
/**
* The person's timer (plan L48 R2): it counts down in the Dock's pill on every site and rings at its end. Absent or null: none. A focus timer of rounds alternates focus and break by itself.
* The person's timer (plan L48 R2): it counts down in the Dock's pill on every site and rings at its end. Absent or null: none. A focus timer of rounds alternates focus and break by itself.
*/
*/
@@ -311139,6 +311205,33 @@ export interface ActorSkill {
@@ -311139,6 +311205,33 @@ export interface ActorSkill {
};
};
}
}
+/** [email protected] (owner: actor) */
+/**
+ * actor.skill-run-request@1: POST /api/v1/runs starts a public prompt skill as this person, using normal task approvals and budget.
+ */
+export interface ActorSkillRunRequest {
+ skill: string;
+ input?: {
+ [k: string]: unknown | undefined;
+ };
+ choice?: {
+ mode?: "cheapest" | "balanced" | "best" | "fastest" | "private";
+ };
+}
+
+/** [email protected] (owner: actor) */
+/**
+ * actor.skill-run-result@1: a catalogue run is an ordinary Actor task, with its skill and subject labelled.
+ */
+export interface ActorSkillRunResult {
+ run: {
+ id: string;
+ skill: string;
+ subject: string;
+ [k: string]: unknown | undefined;
+ };
+}
+
/** [email protected] (owner: actor) */
/** [email protected] (owner: actor) */
/**
/**
* actor.skill@2: a skill, the document an agent loads to do one kind of job well (ADR-058, ADR-060). It keeps every field and meaning of actor.skill@1 and adds a way for the skill to bring CODE that runs in a sandbox: RUNS is prompt (as @1, text and instructions only) or sandbox. A sandbox skill carries its code as ordinary TEXT resources (a .js path with media_type text/javascript, at most 64 KiB each, in the integrity hash); TOOLS (1 to 5, only when runs is sandbox) say what an agent may call: a name, a description the agent reads, language javascript (the only one in v1), an ENTRY naming one of the skill's own .js resources, ARGS as a JSON Schema subset (an object whose properties are string, number, integer, boolean or an array of those; enum, maxLength, and pattern at most 200 characters; no $ref and no nested object), NET (deny by default, openvibe-only, public) and LIMITS (wall_ms at most 30000, default 10000; mem_bytes at most 268435456, default 134217728). A sandbox skill's requires.kinds names skill.run; a prompt skill declares no tools. A skill GRANTS NOTHING: requires only declares; the agent's level and approvals decide every step (actor approvals, HO1), and a step of a kind the skill did not declare is a scan finding (actor.skill-listing@2). Code never runs on an OpenVibe server and never sees a secret: it runs as a Run job of class function on a Link that declared the skill runner, with the network its tool declared and the exact bytes the registry scanned. The INTEGRITY block is a sha256 over the canonical JSON of the document: it shows the file was not edited after it was written and says nothing about who wrote it, so the AUTHOR is a claim; the registry's listing is the only place a publisher is vouched for. The canonical JSON is the document's own fields, in this order: skill, slug, name, description, version, instructions, resources, tools, requires, runs, license, author; an optional field that is absent or empty is left out; resources are [{ path, media_type, text }] in the document's order; tools are [{ name, description, language, entry, args, net, limits }] in the document's order, with an absent net or limits (and each absent limits field) left out and args as the object the document wrote; requires is { kinds, apps, hosts } with empty lists left out; author is { subject } or { subject, name }; the value is the compact JSON of that object (no spaces). CREATED_AT is not hashed.
* actor.skill@2: a skill, the document an agent loads to do one kind of job well (ADR-058, ADR-060). It keeps every field and meaning of actor.skill@1 and adds a way for the skill to bring CODE that runs in a sandbox: RUNS is prompt (as @1, text and instructions only) or sandbox. A sandbox skill carries its code as ordinary TEXT resources (a .js path with media_type text/javascript, at most 64 KiB each, in the integrity hash); TOOLS (1 to 5, only when runs is sandbox) say what an agent may call: a name, a description the agent reads, language javascript (the only one in v1), an ENTRY naming one of the skill's own .js resources, ARGS as a JSON Schema subset (an object whose properties are string, number, integer, boolean or an array of those; enum, maxLength, and pattern at most 200 characters; no $ref and no nested object), NET (deny by default, openvibe-only, public) and LIMITS (wall_ms at most 30000, default 10000; mem_bytes at most 268435456, default 134217728). A sandbox skill's requires.kinds names skill.run; a prompt skill declares no tools. A skill GRANTS NOTHING: requires only declares; the agent's level and approvals decide every step (actor approvals, HO1), and a step of a kind the skill did not declare is a scan finding (actor.skill-listing@2). Code never runs on an OpenVibe server and never sees a secret: it runs as a Run job of class function on a Link that declared the skill runner, with the network its tool declared and the exact bytes the registry scanned. The INTEGRITY block is a sha256 over the canonical JSON of the document: it shows the file was not edited after it was written and says nothing about who wrote it, so the AUTHOR is a claim; the registry's listing is the only place a publisher is vouched for. The canonical JSON is the document's own fields, in this order: skill, slug, name, description, version, instructions, resources, tools, requires, runs, license, author; an optional field that is absent or empty is left out; resources are [{ path, media_type, text }] in the document's order; tools are [{ name, description, language, entry, args, net, limits }] in the document's order, with an absent net or limits (and each absent limits field) left out and args as the object the document wrote; requires is { kinds, apps, hosts } with empty lists left out; author is { subject } or { subject, name }; the value is the compact JSON of that object (no spaces). CREATED_AT is not hashed.
new file mode 100644
new file mode 100644
@@ -0,0 +1,50 @@
@@ -0,0 +1,50 @@
+{
+ "map": "ai.run-error@1",
+ "codes": {
+ "route.unavailable": {
+ "words": "No model could take this task.",
+ "next": "Pick a model or add an AI key, then retry.",
+ "action": "pick_model"
+ },
+ "provider.unavailable": {
+ "words": "The model provider is unavailable.",
+ "next": "Retry when the provider is back.",
+ "action": "retry"
+ },
+ "provider.rate_limited": {
+ "words": "The model provider reached its limit.",
+ "next": "Retry after the limit resets.",
+ "action": "retry_later"
+ },
+ "credentials.unavailable": {
+ "words": "Your AI key is unavailable.",
+ "next": "Add or check your AI key.",
+ "action": "add_key"
+ },
+ "quota.refused": {
+ "words": "Your AI allowance is used up.",
+ "next": "Pick another model or retry when the allowance resets.",
+ "action": "pick_model"
+ },
+ "queue.full": {
+ "words": "AI is busy right now.",
+ "next": "Retry in a moment.",
+ "action": "retry_later"
+ },
+ "run.interrupted": {
+ "words": "This run stopped during a service restart.",
+ "next": "Retry the task.",
+ "action": "retry"
+ },
+ "task.failed": {
+ "words": "This task could not finish.",
+ "next": "Open the task to review it, then retry.",
+ "action": "open"
+ },
+ "unknown": {
+ "words": "This run could not finish.",
+ "next": "Open its details or retry.",
+ "action": "open"
+ }
+ }
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,22 @@
@@ -0,0 +1,22 @@
+{
+ "id": "actor.skill.run",
+ "version": "1.0",
+ "owner": "actor",
+ "status": "active",
+ "visibility": "public",
+ "description": "Start a catalogue skill as this person (plan 2026-11-09 §7): POST /api/v1/runs with the skill key, its input and a choice (cheapest, balanced, best, fastest, private). The run is an ordinary Actor task with the skill's instructions pinned to it, so editing the catalogue later never changes a task already under way. A skill that needs a sandbox runner cannot start here, and the person still approves what it does.",
+ "inputSchema": "actor.skill-run-request@1",
+ "outputSchema": "actor.skill-run-result@1",
+ "permissions": [
+ "actor:tasks:create"
+ ],
+ "resourceConstraints": [
+ "owner",
+ "project"
+ ],
+ "quotaClass": "actor-task",
+ "events": [],
+ "implementedBy": [
+ "POST /api/v1/runs"
+ ]
+}
@@ -20,6 +20,7 @@
@@ -20,6 +20,7 @@
"implementedBy": [
"implementedBy": [
"POST /api/v1/tasks",
"POST /api/v1/tasks",
"POST /api/v1/tasks/:id/cancel",
"POST /api/v1/tasks/:id/cancel",
+ "POST /api/v1/tasks/:id/retry",
"POST /api/v1/tasks/:id/takeover",
"POST /api/v1/tasks/:id/takeover",
"POST /api/v1/tasks/:id/giveback",
"POST /api/v1/tasks/:id/giveback",
"POST /api/v1/me/canvases/:id/events"
"POST /api/v1/me/canvases/:id/events"
@@ -4,7 +4,7 @@
@@ -4,7 +4,7 @@
"owner": "network",
"owner": "network",
"status": "active",
"status": "active",
"visibility": "public",
"visibility": "public",
- "description": "The Action Center for the signed-in person (plan 2026-10-28 §3.10): GET /api/v1/me/actions merges Actor, Codes and AI items and Network's own confirmations into running, waiting, scheduled, done and failed (network.me-actions-result@1); POST /api/v1/me/actions/:service/:id/:action approves, declines or cancels through the owning authority. Readable from every OpenVibe site with the person's Network token, like the bell.",
+ "description": "The Action Center for the signed-in person (plan 2026-10-28 §3.10): GET /api/v1/me/actions merges Actor, Codes and AI items and Network's own confirmations into running, waiting, scheduled, done and failed (network.me-actions-result@1); POST /api/v1/me/actions/:service/:id/:action approves, declines, cancels or retries through the owning authority. Readable from every OpenVibe site with the person's Network token, like the bell.",
"permissions": [
"permissions": [
"network:read",
"network:read",
"network:write"
"network:write"
new file mode 100644
new file mode 100644
@@ -0,0 +1,21 @@
@@ -0,0 +1,21 @@
+{
+ "id": "network.skill.run",
+ "version": "1.0",
+ "owner": "network",
+ "status": "active",
+ "visibility": "public",
+ "description": "Start one of Actor's catalogue skills as the signed-in person (plan 2026-11-09 §7): POST /api/v1/me/actions/skills/:id/run asks Actor to run that skill for them, with the input and the choice. Network never runs the skill itself; Actor does, under the person's own approvals and budget.",
+ "inputSchema": "actor.skill-run-request@1",
+ "outputSchema": "actor.skill-run-result@1",
+ "permissions": [
+ "network:write"
+ ],
+ "resourceConstraints": [
+ "owner"
+ ],
+ "quotaClass": "standard",
+ "events": [],
+ "implementedBy": [
+ "POST /api/v1/me/actions/skills/:id/run"
+ ]
+}
@@ -17,6 +17,7 @@
@@ -17,6 +17,7 @@
},
},
"capabilities": [
"capabilities": [
"actor.task.create",
"actor.task.create",
+ "actor.skill.run",
"actor.task.read",
"actor.task.read",
"actor.task.list",
"actor.task.list",
"actor.agent.read",
"actor.agent.read",
@@ -15,6 +15,7 @@
@@ -15,6 +15,7 @@
"apiRoutes": [
"apiRoutes": [
{ "method": "GET", "path": "/api/vibe/models" },
{ "method": "GET", "path": "/api/vibe/models" },
{ "method": "GET", "path": "/api/vibe/chat", "responseSchema": "chat.vibe-answer@2" },
{ "method": "GET", "path": "/api/vibe/chat", "responseSchema": "chat.vibe-answer@2" },
+ { "method": "GET", "path": "/api/vibe/conversations", "responseSchema": "chat.vibe-conversations-result@1" },
{ "method": "POST", "path": "/api/vibe/ask" },
{ "method": "POST", "path": "/api/vibe/ask" },
{ "method": "POST", "path": "/api/vibe/pick" },
{ "method": "POST", "path": "/api/vibe/pick" },
{ "method": "POST", "path": "/api/vibe/prefer" },
{ "method": "POST", "path": "/api/vibe/prefer" },
@@ -84,6 +84,7 @@
@@ -84,6 +84,7 @@
"network.staff.read",
"network.staff.read",
"network.status.incident",
"network.status.incident",
"network.actions.read",
"network.actions.read",
+ "network.skill.run",
"network.consent.read",
"network.consent.read",
"network.consent.manage",
"network.consent.manage",
"network.machines.read",
"network.machines.read",
@@ -1,12 +1,12 @@
@@ -1,12 +1,12 @@
{
{
"name": "openvibe-contracts",
"name": "openvibe-contracts",
- "version": "0.364.0",
+ "version": "0.365.0",
"lockfileVersion": 3,
"lockfileVersion": 3,
"requires": true,
"requires": true,
"packages": {
"packages": {
"": {
"": {
"name": "openvibe-contracts",
"name": "openvibe-contracts",
- "version": "0.364.0",
+ "version": "0.365.0",
"license": "AGPL-3.0-only",
"license": "AGPL-3.0-only",
"dependencies": {
"dependencies": {
"ajv": "^8.17.1",
"ajv": "^8.17.1",
@@ -1,6 +1,6 @@
@@ -1,6 +1,6 @@
{
{
"name": "openvibe-contracts",
"name": "openvibe-contracts",
- "version": "0.364.0",
+ "version": "0.365.0",
"description": "Machine-readable contracts for the OpenVibe network: schemas, manifests, ids, error envelope, capability checks.",
"description": "Machine-readable contracts for the OpenVibe network: schemas, manifests, ids, error envelope, capability checks.",
"main": "index.js",
"main": "index.js",
"types": "generated/typescript/index.d.ts",
"types": "generated/typescript/index.d.ts",
new file mode 100644
new file mode 100644
@@ -0,0 +1,29 @@
@@ -0,0 +1,29 @@
+'use strict';
+const assert = require('assert');
+const { validate } = require('..');
+const error = { code: 'route.unavailable', words: 'No model could take this task.', next: 'Pick a model or add an AI key, then retry.', action: 'pick_model' };
+assert.ok(validate('ai.run-error@1', error).valid, 'a safe action error is in the contract');
+assert.ok(!validate('ai.run-error@1', { ...error, raw: '{tried:[...]}' }).valid, 'raw provider payloads have no display field');
+const map = require('../manifests/ai-run-error-codes.v1.json').codes;
+assert.deepStrictEqual(map['route.unavailable'], { words: error.words, next: error.next, action: error.action });
+const item = {
+ service: 'ai', id: 'run_123', kind: 'ai_run', title: 'Draft a post', summary: error.words,
+ bucket: 'failed', state: 'failed', created_at: '2026-11-09T08:00:00.000Z', updated_at: '2026-11-09T08:01:00.000Z',
+ href: 'https://ai.openvibe.services/runs/run_123', actions: ['open'], error: error.words,
+ run_error: error, skill: 'blog.write', subject: { kind: 'post', title: 'Patch notes draft', url: 'https://openvibe.blog/posts/42' },
+ model: 'gpt-5-nano', maker: 'OpenAI', duration_ms: 60000, step: null,
+};
+assert.ok(validate('common.action-item@1', item).valid, 'the action feed carries the run details');
+assert.ok(!validate('common.action-item@1', { ...item, duration_ms: -1 }).valid);
+const state = {
+ open: true, tab: 'vibe', pinned: false, agent: null, chat: null,
+ vibe: { slug: 'v-abc', at: '2026-11-09T08:00:00.000Z' }, agent_filter: 'failed',
+ place: { phone: { corner: 'bottom-right' }, desktop: { corner: 'top-left', width: 420, height: 640 } },
+ updated_at: '2026-11-09T08:00:00.000Z',
+};
+assert.ok(validate('network.dock-state@1', state).valid, 'the recent conversation and Agents filter sync');
+assert.ok(!validate('network.dock-state@1', { ...state, vibe: { slug: '<bad>', at: state.vibe.at } }).valid);
+assert.ok(validate('chat.vibe-conversations-result@1', { count: 1, conversations: [{ slug: 'v-abc', name: 'Patch notes', last_message_at: state.updated_at, created_at: state.updated_at, last_line: 'What changed?', last_answer_at: null, site: 'openvibe.blog' }] }).valid);
+assert.ok(validate('actor.skill-run-request@1', { skill: 'skl_example', input: {}, choice: { mode: 'balanced' } }).valid);
+assert.ok(validate('actor.skill-run-result@1', { run: { id: 'tsk_example', skill: 'blog.write', subject: 'Patch notes' } }).valid);
+console.log('dock v2 contracts: safe errors, action context, synced state, Vibe list and skill runs');