openvibers/openvibe.contracts Commits

0.229.0: the Action Center (common.action-item@1, common.action-list-result@1, network.me-actions-result@1; actor/codes/ai.actions.read, actor.approval.decide, network.actions.read) (#237)

OP OpenVibers committed 16 days ago · 61f7ed4b04 · 63 files, +2176 −87

Changes

ddiff --git a/CHANGELOG.md b/CHANGELOG.md
iindex 50c1ebd5..3a263aa9 100644
---- a/CHANGELOG.md
++++ b/CHANGELOG.md
@@@ -4,6 +4,18 @@ All notable changes to `openvibe-contracts`. Releases are git tags (`vX.Y.Z`) th
from `https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/<tag>`. Before v0.30.0,
the notes were in the tag and commit messages (`git tag -n1`).
++## 0.229.0 — 2026-10-28
++
++- **The Action Center** (plan 2026-10-28 §3.10, NOTIF-5): one list of a person's agent work on every site.
++ - `common.action-item@1`: one item (an agent task, a coding task, an AI run, an approval), with its bucket
++ (running, waiting, scheduled, done, failed), state, cost in USD, steps, error, page and the actions it allows.
++ - `common.action-list-result@1`: one authority's items for a person. Served by Actor, Codes and AI at
++ `GET /api/v1/actions?subject=usr_…` under the new first-party capabilities `actor.actions.read`,
++ `codes.actions.read` and `ai.actions.read`, which are granted to Network only.
++ - `actor.approval.decide`: Network approves or declines an Actor approval for its person.
++ - `network.actions.read` and `network.me-actions-result@1`: `GET /api/v1/me/actions` merges them with Network's
++ own confirmations into the five buckets, and `POST /api/v1/me/actions/:service/:id/:action` acts on one.
++
## 0.228.0 — 2026-10-28
- **OpenVibe.Design** (`design`, live at openvibe.design, port 5090; plan 2026-10-28 §5.2, the Design room). v1 is the
ddiff --git a/contracts/catalog.json b/contracts/catalog.json
iindex 1abaed8a..24384157 100644
---- a/contracts/catalog.json
++++ b/contracts/catalog.json
@@@ -7595,6 +7595,33 @@
"compatibility": "backward",
"status": "active",
"adr": "ADR-043"
++ },
++ {
++ "id": "common.action-item",
++ "version": "1.0.0",
++ "owner": "contracts",
++ "schema": "common/action-item.v1.json",
++ "visibility": "public",
++ "compatibility": "backward",
++ "status": "active"
++ },
++ {
++ "id": "common.action-list-result",
++ "version": "1.0.0",
++ "owner": "contracts",
++ "schema": "common/action-list-result.v1.json",
++ "visibility": "public",
++ "compatibility": "backward",
++ "status": "active"
++ },
++ {
++ "id": "network.me-actions-result",
++ "version": "1.0.0",
++ "owner": "network",
++ "schema": "network/me-actions-result.v1.json",
++ "visibility": "public",
++ "compatibility": "backward",
++ "status": "active"
}
]
}
ddiff --git a/contracts/common/action-item.v1.json b/contracts/common/action-item.v1.json
nnew file mode 100644
iindex 00000000..7aeae3b3
---- /dev/null
++++ b/contracts/common/action-item.v1.json
@@@ -0,0 +1,147 @@
++{
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/common/action-item.v1.json",
++ "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.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "service",
++ "id",
++ "kind",
++ "title",
++ "bucket",
++ "state",
++ "created_at",
++ "updated_at",
++ "href",
++ "actions"
++ ],
++ "properties": {
++ "service": {
++ "enum": [
++ "actor",
++ "codes",
++ "ai",
++ "network",
++ "run"
++ ],
++ "description": "The authority that owns the item."
++ },
++ "id": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 80,
++ "description": "The authority's own id (tsk_…, a Codes task id, run_…, a confirmation id)."
++ },
++ "kind": {
++ "enum": [
++ "agent_task",
++ "code_task",
++ "ai_run",
++ "approval",
++ "desk_session"
++ ],
++ "description": "What the item is."
++ },
++ "title": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 160,
++ "description": "A short plain-text name: the start of the task text, the workflow, or what the approval is for."
++ },
++ "summary": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "maxLength": 400,
++ "description": "The last step, the outcome, or what will happen on approval."
++ },
++ "bucket": {
++ "enum": [
++ "running",
++ "waiting",
++ "scheduled",
++ "done",
++ "failed"
++ ],
++ "description": "Where the Action Center shows it: running (queued or working), waiting (needs the person), scheduled (will run later), done, failed (failed, cancelled or expired)."
++ },
++ "state": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 32,
++ "description": "The authority's own state word (queued, running, needs_you, succeeded, failed, cancelled, pending…)."
++ },
++ "agent": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "maxLength": 80,
++ "description": "The agent, model or workflow doing it, when known."
++ },
++ "cost_usd": {
++ "type": [
++ "number",
++ "null"
++ ],
++ "minimum": 0,
++ "description": "What it cost the person, in US dollars; null when unknown or free."
++ },
++ "steps": {
++ "type": [
++ "integer",
++ "null"
++ ],
++ "minimum": 0,
++ "description": "Tool calls or steps so far, when counted."
++ },
++ "error": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "maxLength": 400,
++ "description": "Why it failed, in words a person can act on."
++ },
++ "created_at": {
++ "type": "string",
++ "format": "date-time"
++ },
++ "updated_at": {
++ "type": "string",
++ "format": "date-time"
++ },
++ "next_run_at": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "format": "date-time",
++ "description": "When a scheduled item runs next."
++ },
++ "href": {
++ "type": "string",
++ "format": "uri",
++ "pattern": "^https://",
++ "maxLength": 2048,
++ "description": "The item's page: its live steps, receipt or approval."
++ },
++ "actions": {
++ "type": "array",
++ "maxItems": 4,
++ "description": "What the person can do from the list. approve/decline/cancel/retry go through OpenVibe.Network (POST /api/v1/me/actions/:service/:id/:action); open is a link.",
++ "items": {
++ "enum": [
++ "open",
++ "approve",
++ "decline",
++ "cancel",
++ "retry"
++ ]
++ }
++ }
++ }
++}
ddiff --git a/contracts/common/action-list-result.v1.json b/contracts/common/action-list-result.v1.json
nnew file mode 100644
iindex 00000000..29164175
---- /dev/null
++++ b/contracts/common/action-list-result.v1.json
@@@ -0,0 +1,20 @@
++{
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/common/action-list-result.v1.json",
++ "title": "ActionListResult",
++ "description": "One authority's Action Center items for a person (capabilities actor.actions.read, codes.actions.read, ai.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.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "items"
++ ],
++ "properties": {
++ "items": {
++ "type": "array",
++ "maxItems": 50,
++ "items": {
++ "$ref": "action-item.v1.json"
++ }
++ }
++ }
++}
ddiff --git a/contracts/network/me-actions-result.v1.json b/contracts/network/me-actions-result.v1.json
nnew file mode 100644
iindex 00000000..6d9b47c9
---- /dev/null
++++ b/contracts/network/me-actions-result.v1.json
@@@ -0,0 +1,120 @@
++{
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/network/me-actions-result.v1.json",
++ "title": "MeActionsResult",
++ "description": "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.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "buckets",
++ "counts",
++ "sources",
++ "partial",
++ "generated_at"
++ ],
++ "properties": {
++ "buckets": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "running",
++ "waiting",
++ "scheduled",
++ "done",
++ "failed"
++ ],
++ "properties": {
++ "running": {
++ "type": "array",
++ "items": {
++ "$ref": "../common/action-item.v1.json"
++ }
++ },
++ "waiting": {
++ "type": "array",
++ "items": {
++ "$ref": "../common/action-item.v1.json"
++ }
++ },
++ "scheduled": {
++ "type": "array",
++ "items": {
++ "$ref": "../common/action-item.v1.json"
++ }
++ },
++ "done": {
++ "type": "array",
++ "items": {
++ "$ref": "../common/action-item.v1.json"
++ }
++ },
++ "failed": {
++ "type": "array",
++ "items": {
++ "$ref": "../common/action-item.v1.json"
++ }
++ }
++ }
++ },
++ "counts": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "running",
++ "waiting",
++ "scheduled",
++ "done",
++ "failed"
++ ],
++ "properties": {
++ "running": {
++ "type": "integer",
++ "minimum": 0
++ },
++ "waiting": {
++ "type": "integer",
++ "minimum": 0
++ },
++ "scheduled": {
++ "type": "integer",
++ "minimum": 0
++ },
++ "done": {
++ "type": "integer",
++ "minimum": 0
++ },
++ "failed": {
++ "type": "integer",
++ "minimum": 0
++ }
++ }
++ },
++ "sources": {
++ "type": "object",
++ "propertyNames": {
++ "enum": [
++ "actor",
++ "codes",
++ "ai",
++ "network",
++ "run"
++ ]
++ },
++ "additionalProperties": {
++ "enum": [
++ "ok",
++ "unavailable",
++ "timeout",
++ "not_connected"
++ ]
++ }
++ },
++ "partial": {
++ "type": "boolean"
++ },
++ "generated_at": {
++ "type": "string",
++ "format": "date-time"
++ }
++ }
++}
ddiff --git a/fixtures/common.action-item/invalid/http-href.json b/fixtures/common.action-item/invalid/http-href.json
nnew file mode 100644
iindex 00000000..09366cf3
---- /dev/null
++++ b/fixtures/common.action-item/invalid/http-href.json
@@@ -0,0 +1,21 @@
++{
++ "service": "actor",
++ "id": "tsk_01JAB2C3D4E5F6G7H8J9K0MNPQ",
++ "kind": "agent_task",
++ "title": "Find three cheap flights to Lisbon",
++ "summary": "Read 4 pages; comparing prices",
++ "bucket": "running",
++ "state": "running",
++ "agent": "deepseek-flash",
++ "cost_usd": 0.004,
++ "steps": 6,
++ "error": null,
++ "created_at": "2026-10-28T14:00:00Z",
++ "updated_at": "2026-10-28T14:02:10Z",
++ "next_run_at": null,
++ "href": "http://openvibe.actor/tasks/x",
++ "actions": [
++ "open",
++ "cancel"
++ ]
++}
ddiff --git a/fixtures/common.action-item/invalid/unknown-bucket.json b/fixtures/common.action-item/invalid/unknown-bucket.json
nnew file mode 100644
iindex 00000000..3e0881a7
---- /dev/null
++++ b/fixtures/common.action-item/invalid/unknown-bucket.json
@@@ -0,0 +1,21 @@
++{
++ "service": "actor",
++ "id": "tsk_01JAB2C3D4E5F6G7H8J9K0MNPQ",
++ "kind": "agent_task",
++ "title": "Find three cheap flights to Lisbon",
++ "summary": "Read 4 pages; comparing prices",
++ "bucket": "paused",
++ "state": "running",
++ "agent": "deepseek-flash",
++ "cost_usd": 0.004,
++ "steps": 6,
++ "error": null,
++ "created_at": "2026-10-28T14:00:00Z",
++ "updated_at": "2026-10-28T14:02:10Z",
++ "next_run_at": null,
++ "href": "https://openvibe.actor/tasks/tsk_01JAB2C3D4E5F6G7H8J9K0MNPQ",
++ "actions": [
++ "open",
++ "cancel"
++ ]
++}
ddiff --git a/fixtures/common.action-item/valid/approval.json b/fixtures/common.action-item/valid/approval.json
nnew file mode 100644
iindex 00000000..111ca86a
---- /dev/null
++++ b/fixtures/common.action-item/valid/approval.json
@@@ -0,0 +1,17 @@
++{
++ "service": "network",
++ "id": "cnf_01JAB2C3D4E5F6G7H8J9K0MNPR",
++ "kind": "approval",
++ "title": "Send an email to the venue",
++ "summary": "Your agent asks to send one email from your account",
++ "bucket": "waiting",
++ "state": "pending",
++ "created_at": "2026-10-28T14:00:00Z",
++ "updated_at": "2026-10-28T14:00:00Z",
++ "href": "https://openvibe.network/my#approvals",
++ "actions": [
++ "approve",
++ "decline",
++ "open"
++ ]
++}
ddiff --git a/fixtures/common.action-item/valid/running-task.json b/fixtures/common.action-item/valid/running-task.json
nnew file mode 100644
iindex 00000000..407c1a7b
---- /dev/null
++++ b/fixtures/common.action-item/valid/running-task.json
@@@ -0,0 +1,21 @@
++{
++ "service": "actor",
++ "id": "tsk_01JAB2C3D4E5F6G7H8J9K0MNPQ",
++ "kind": "agent_task",
++ "title": "Find three cheap flights to Lisbon",
++ "summary": "Read 4 pages; comparing prices",
++ "bucket": "running",
++ "state": "running",
++ "agent": "deepseek-flash",
++ "cost_usd": 0.004,
++ "steps": 6,
++ "error": null,
++ "created_at": "2026-10-28T14:00:00Z",
++ "updated_at": "2026-10-28T14:02:10Z",
++ "next_run_at": null,
++ "href": "https://openvibe.actor/tasks/tsk_01JAB2C3D4E5F6G7H8J9K0MNPQ",
++ "actions": [
++ "open",
++ "cancel"
++ ]
++}
ddiff --git a/fixtures/common.action-list-result/invalid/no-items.json b/fixtures/common.action-list-result/invalid/no-items.json
nnew file mode 100644
iindex 00000000..0967ef42
---- /dev/null
++++ b/fixtures/common.action-list-result/invalid/no-items.json
@@@ -0,0 +1 @@
++{}
ddiff --git a/fixtures/common.action-list-result/valid/one.json b/fixtures/common.action-list-result/valid/one.json
nnew file mode 100644
iindex 00000000..ca0d5d61
---- /dev/null
++++ b/fixtures/common.action-list-result/valid/one.json
@@@ -0,0 +1,25 @@
++{
++ "items": [
++ {
++ "service": "actor",
++ "id": "tsk_01JAB2C3D4E5F6G7H8J9K0MNPQ",
++ "kind": "agent_task",
++ "title": "Find three cheap flights to Lisbon",
++ "summary": "Read 4 pages; comparing prices",
++ "bucket": "running",
++ "state": "running",
++ "agent": "deepseek-flash",
++ "cost_usd": 0.004,
++ "steps": 6,
++ "error": null,
++ "created_at": "2026-10-28T14:00:00Z",
++ "updated_at": "2026-10-28T14:02:10Z",
++ "next_run_at": null,
++ "href": "https://openvibe.actor/tasks/tsk_01JAB2C3D4E5F6G7H8J9K0MNPQ",
++ "actions": [
++ "open",
++ "cancel"
++ ]
++ }
++ ]
++}
ddiff --git a/fixtures/network.me-actions-result/invalid/missing-bucket.json b/fixtures/network.me-actions-result/invalid/missing-bucket.json
nnew file mode 100644
iindex 00000000..ed8d4c79
---- /dev/null
++++ b/fixtures/network.me-actions-result/invalid/missing-bucket.json
@@@ -0,0 +1,15 @@
++{
++ "buckets": {
++ "running": []
++ },
++ "counts": {
++ "running": 0,
++ "waiting": 0,
++ "scheduled": 0,
++ "done": 0,
++ "failed": 0
++ },
++ "sources": {},
++ "partial": false,
++ "generated_at": "2026-10-28T14:02:11Z"
++}
ddiff --git a/fixtures/network.me-actions-result/valid/merged.json b/fixtures/network.me-actions-result/valid/merged.json
nnew file mode 100644
iindex 00000000..983a6beb
---- /dev/null
++++ b/fixtures/network.me-actions-result/valid/merged.json
@@@ -0,0 +1,46 @@
++{
++ "buckets": {
++ "running": [
++ {
++ "service": "actor",
++ "id": "tsk_01JAB2C3D4E5F6G7H8J9K0MNPQ",
++ "kind": "agent_task",
++ "title": "Find three cheap flights to Lisbon",
++ "summary": "Read 4 pages; comparing prices",
++ "bucket": "running",
++ "state": "running",
++ "agent": "deepseek-flash",
++ "cost_usd": 0.004,
++ "steps": 6,
++ "error": null,
++ "created_at": "2026-10-28T14:00:00Z",
++ "updated_at": "2026-10-28T14:02:10Z",
++ "next_run_at": null,
++ "href": "https://openvibe.actor/tasks/tsk_01JAB2C3D4E5F6G7H8J9K0MNPQ",
++ "actions": [
++ "open",
++ "cancel"
++ ]
++ }
++ ],
++ "waiting": [],
++ "scheduled": [],
++ "done": [],
++ "failed": []
++ },
++ "counts": {
++ "running": 1,
++ "waiting": 0,
++ "scheduled": 0,
++ "done": 0,
++ "failed": 0
++ },
++ "sources": {
++ "actor": "ok",
++ "codes": "timeout",
++ "ai": "ok",
++ "network": "ok"
++ },
++ "partial": true,
++ "generated_at": "2026-10-28T14:02:11Z"
++}
ddiff --git a/generated/json-schema/bundle.json b/generated/json-schema/bundle.json
iindex 2c61d17f..2a92b23e 100644
---- a/generated/json-schema/bundle.json
++++ b/generated/json-schema/bundle.json
@@@ -85278,6 +85278,308 @@
}
}
}
++ },
++ "common.action-item": {
++ "version": "1.0.0",
++ "owner": "contracts",
++ "status": "active",
++ "schema": {
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/common/action-item.v1.json",
++ "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.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "service",
++ "id",
++ "kind",
++ "title",
++ "bucket",
++ "state",
++ "created_at",
++ "updated_at",
++ "href",
++ "actions"
++ ],
++ "properties": {
++ "service": {
++ "enum": [
++ "actor",
++ "codes",
++ "ai",
++ "network",
++ "run"
++ ],
++ "description": "The authority that owns the item."
++ },
++ "id": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 80,
++ "description": "The authority's own id (tsk_…, a Codes task id, run_…, a confirmation id)."
++ },
++ "kind": {
++ "enum": [
++ "agent_task",
++ "code_task",
++ "ai_run",
++ "approval",
++ "desk_session"
++ ],
++ "description": "What the item is."
++ },
++ "title": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 160,
++ "description": "A short plain-text name: the start of the task text, the workflow, or what the approval is for."
++ },
++ "summary": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "maxLength": 400,
++ "description": "The last step, the outcome, or what will happen on approval."
++ },
++ "bucket": {
++ "enum": [
++ "running",
++ "waiting",
++ "scheduled",
++ "done",
++ "failed"
++ ],
++ "description": "Where the Action Center shows it: running (queued or working), waiting (needs the person), scheduled (will run later), done, failed (failed, cancelled or expired)."
++ },
++ "state": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 32,
++ "description": "The authority's own state word (queued, running, needs_you, succeeded, failed, cancelled, pending…)."
++ },
++ "agent": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "maxLength": 80,
++ "description": "The agent, model or workflow doing it, when known."
++ },
++ "cost_usd": {
++ "type": [
++ "number",
++ "null"
++ ],
++ "minimum": 0,
++ "description": "What it cost the person, in US dollars; null when unknown or free."
++ },
++ "steps": {
++ "type": [
++ "integer",
++ "null"
++ ],
++ "minimum": 0,
++ "description": "Tool calls or steps so far, when counted."
++ },
++ "error": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "maxLength": 400,
++ "description": "Why it failed, in words a person can act on."
++ },
++ "created_at": {
++ "type": "string",
++ "format": "date-time"
++ },
++ "updated_at": {
++ "type": "string",
++ "format": "date-time"
++ },
++ "next_run_at": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "format": "date-time",
++ "description": "When a scheduled item runs next."
++ },
++ "href": {
++ "type": "string",
++ "format": "uri",
++ "pattern": "^https://",
++ "maxLength": 2048,
++ "description": "The item's page: its live steps, receipt or approval."
++ },
++ "actions": {
++ "type": "array",
++ "maxItems": 4,
++ "description": "What the person can do from the list. approve/decline/cancel/retry go through OpenVibe.Network (POST /api/v1/me/actions/:service/:id/:action); open is a link.",
++ "items": {
++ "enum": [
++ "open",
++ "approve",
++ "decline",
++ "cancel",
++ "retry"
++ ]
++ }
++ }
++ }
++ }
++ },
++ "common.action-list-result": {
++ "version": "1.0.0",
++ "owner": "contracts",
++ "status": "active",
++ "schema": {
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/common/action-list-result.v1.json",
++ "title": "ActionListResult",
++ "description": "One authority's Action Center items for a person (capabilities actor.actions.read, codes.actions.read, ai.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.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "items"
++ ],
++ "properties": {
++ "items": {
++ "type": "array",
++ "maxItems": 50,
++ "items": {
++ "$ref": "action-item.v1.json"
++ }
++ }
++ }
++ }
++ },
++ "network.me-actions-result": {
++ "version": "1.0.0",
++ "owner": "network",
++ "status": "active",
++ "schema": {
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/network/me-actions-result.v1.json",
++ "title": "MeActionsResult",
++ "description": "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.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "buckets",
++ "counts",
++ "sources",
++ "partial",
++ "generated_at"
++ ],
++ "properties": {
++ "buckets": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "running",
++ "waiting",
++ "scheduled",
++ "done",
++ "failed"
++ ],
++ "properties": {
++ "running": {
++ "type": "array",
++ "items": {
++ "$ref": "../common/action-item.v1.json"
++ }
++ },
++ "waiting": {
++ "type": "array",
++ "items": {
++ "$ref": "../common/action-item.v1.json"
++ }
++ },
++ "scheduled": {
++ "type": "array",
++ "items": {
++ "$ref": "../common/action-item.v1.json"
++ }
++ },
++ "done": {
++ "type": "array",
++ "items": {
++ "$ref": "../common/action-item.v1.json"
++ }
++ },
++ "failed": {
++ "type": "array",
++ "items": {
++ "$ref": "../common/action-item.v1.json"
++ }
++ }
++ }
++ },
++ "counts": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "running",
++ "waiting",
++ "scheduled",
++ "done",
++ "failed"
++ ],
++ "properties": {
++ "running": {
++ "type": "integer",
++ "minimum": 0
++ },
++ "waiting": {
++ "type": "integer",
++ "minimum": 0
++ },
++ "scheduled": {
++ "type": "integer",
++ "minimum": 0
++ },
++ "done": {
++ "type": "integer",
++ "minimum": 0
++ },
++ "failed": {
++ "type": "integer",
++ "minimum": 0
++ }
++ }
++ },
++ "sources": {
++ "type": "object",
++ "propertyNames": {
++ "enum": [
++ "actor",
++ "codes",
++ "ai",
++ "network",
++ "run"
++ ]
++ },
++ "additionalProperties": {
++ "enum": [
++ "ok",
++ "unavailable",
++ "timeout",
++ "not_connected"
++ ]
++ }
++ },
++ "partial": {
++ "type": "boolean"
++ },
++ "generated_at": {
++ "type": "string",
++ "format": "date-time"
++ }
++ }
++ }
}
}
}
ddiff --git a/generated/openapi/actor.json b/generated/openapi/actor.json
iindex df77c0c5..e2898113 100644
---- a/generated/openapi/actor.json
++++ b/generated/openapi/actor.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Actor API",
-- "version": "0.228.0",
-- "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.228.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.229.0",
++ "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.229.0): each operation lists the capabilities it performs; a token for the 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"
@@@ -16,6 +16,52 @@
}
],
"paths": {
++ "/api/v1/actions": {
++ "get": {
++ "operationId": "get_api_v1_actions",
++ "summary": "Read one person's Action Center items from OpenVibe.Actor (plan 2026-10-28 §3.10): agent tasks (running, needing the person, done or failed), pending approvals, and personal agents' next scheduled run",
++ "description": "**actor.actions.read** (first-party): Read one person's Action Center items from OpenVibe.Actor (plan 2026-10-28 §3.10): agent tasks (running, needing the person, done or failed), pending approvals, and personal agents' next scheduled runs, as common.action-list-result@1. GET /api/v1/actions?subject=usr_… with a service token; granted to OpenVibe.Network's aggregator only. Never another person's items, and only the fields of common.action-item@1.",
++ "tags": [
++ "actor.actions"
++ ],
++ "x-openvibe-capabilities": [
++ "actor.actions.read"
++ ],
++ "x-openvibe-visibility": [
++ "first-party"
++ ],
++ "x-openvibe-quota-class": "standard",
++ "security": [
++ {
++ "openvibeToken": [
++ "actor.actions.read"
++ ]
++ }
++ ],
++ "responses": {
++ "2XX": {
++ "description": "Success",
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/common.action-list-result.v1"
++ }
++ }
++ }
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ }
++ },
"/api/v1/agents": {
"get": {
"operationId": "get_api_v1_agents",
@@@ -62,6 +108,62 @@
}
}
},
++ "/api/v1/approvals/{id}/decide": {
++ "post": {
++ "operationId": "post_api_v1_approvals_id_decide",
++ "summary": "Approve or decline a pending OpenVibe.Actor approval for its person (plan 2026-10-28 §3.10): POST /api/v1/approvals/:id/decide { decision: approve | decline } with a service token and X-OV-Subject nam",
++ "description": "**actor.approval.decide** (first-party): Approve or decline a pending OpenVibe.Actor approval for its person (plan 2026-10-28 §3.10): POST /api/v1/approvals/:id/decide { decision: approve | decline } with a service token and X-OV-Subject naming the approval's owner, the same decision the person makes on /me/approvals. Granted to OpenVibe.Network, which acts from the Action Center for the signed-in person.",
++ "tags": [
++ "actor.approval"
++ ],
++ "x-openvibe-capabilities": [
++ "actor.approval.decide"
++ ],
++ "x-openvibe-visibility": [
++ "first-party"
++ ],
++ "x-openvibe-quota-class": "standard",
++ "security": [
++ {
++ "openvibeToken": [
++ "actor.approval.decide"
++ ]
++ }
++ ],
++ "parameters": [
++ {
++ "name": "id",
++ "in": "path",
++ "required": true,
++ "schema": {
++ "type": "string"
++ }
++ }
++ ],
++ "responses": {
++ "2XX": {
++ "description": "Success",
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/common.action-item.v1"
++ }
++ }
++ }
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ }
++ },
"/api/v1/me/agents": {
"get": {
"operationId": "get_api_v1_me_agents",
@@@ -2156,6 +2258,169 @@
}
}
},
++ "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.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "service",
++ "id",
++ "kind",
++ "title",
++ "bucket",
++ "state",
++ "created_at",
++ "updated_at",
++ "href",
++ "actions"
++ ],
++ "properties": {
++ "service": {
++ "enum": [
++ "actor",
++ "codes",
++ "ai",
++ "network",
++ "run"
++ ],
++ "description": "The authority that owns the item."
++ },
++ "id": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 80,
++ "description": "The authority's own id (tsk_…, a Codes task id, run_…, a confirmation id)."
++ },
++ "kind": {
++ "enum": [
++ "agent_task",
++ "code_task",
++ "ai_run",
++ "approval",
++ "desk_session"
++ ],
++ "description": "What the item is."
++ },
++ "title": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 160,
++ "description": "A short plain-text name: the start of the task text, the workflow, or what the approval is for."
++ },
++ "summary": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "maxLength": 400,
++ "description": "The last step, the outcome, or what will happen on approval."
++ },
++ "bucket": {
++ "enum": [
++ "running",
++ "waiting",
++ "scheduled",
++ "done",
++ "failed"
++ ],
++ "description": "Where the Action Center shows it: running (queued or working), waiting (needs the person), scheduled (will run later), done, failed (failed, cancelled or expired)."
++ },
++ "state": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 32,
++ "description": "The authority's own state word (queued, running, needs_you, succeeded, failed, cancelled, pending…)."
++ },
++ "agent": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "maxLength": 80,
++ "description": "The agent, model or workflow doing it, when known."
++ },
++ "cost_usd": {
++ "type": [
++ "number",
++ "null"
++ ],
++ "minimum": 0,
++ "description": "What it cost the person, in US dollars; null when unknown or free."
++ },
++ "steps": {
++ "type": [
++ "integer",
++ "null"
++ ],
++ "minimum": 0,
++ "description": "Tool calls or steps so far, when counted."
++ },
++ "error": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "maxLength": 400,
++ "description": "Why it failed, in words a person can act on."
++ },
++ "created_at": {
++ "type": "string",
++ "format": "date-time"
++ },
++ "updated_at": {
++ "type": "string",
++ "format": "date-time"
++ },
++ "next_run_at": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "format": "date-time",
++ "description": "When a scheduled item runs next."
++ },
++ "href": {
++ "type": "string",
++ "format": "uri",
++ "pattern": "^https://",
++ "maxLength": 2048,
++ "description": "The item's page: its live steps, receipt or approval."
++ },
++ "actions": {
++ "type": "array",
++ "maxItems": 4,
++ "description": "What the person can do from the list. approve/decline/cancel/retry go through OpenVibe.Network (POST /api/v1/me/actions/:service/:id/:action); open is a link.",
++ "items": {
++ "enum": [
++ "open",
++ "approve",
++ "decline",
++ "cancel",
++ "retry"
++ ]
++ }
++ }
++ }
++ },
++ "common.action-list-result.v1": {
++ "title": "ActionListResult",
++ "description": "One authority's Action Center items for a person (capabilities actor.actions.read, codes.actions.read, ai.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.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "items"
++ ],
++ "properties": {
++ "items": {
++ "type": "array",
++ "maxItems": 50,
++ "items": {
++ "$ref": "#/components/schemas/common.action-item.v1"
++ }
++ }
++ }
++ },
"common.resource-control-request.v1": {
"title": "ResourceControlRequest",
"description": "common.resource-control-request@1: one control operation OpenVibe.Services (or Actor's Console) sends to the authority that owns a resource (ADR-048, plan T13). Services never mutates another service's database; every create, update, start, stop, delete, resize, rotate, pair, grant or revoke is this request to the owning authority's control API, which decides and answers with a common.resource-control-result@1. A request names exactly one of resource (every action but create) or resource_kind (create, before the name exists). project_id is the tenancy boundary and equals the project segment of resource. idempotency_key makes a retry safe: the authority answers a repeated key with the first result. A sensitive action (money, publishing, deleting, physical control) is refused with confirmation_required until its owner approves; the retry carries that confirmation_id (roadmap WS-Z2). The cross-field rules are checked by contracts.resources.checkControlRequest.",
ddiff --git a/generated/openapi/ai.json b/generated/openapi/ai.json
iindex 5c5e9040..a5be1366 100644
---- a/generated/openapi/ai.json
++++ b/generated/openapi/ai.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.AI API",
-- "version": "0.228.0",
-- "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.228.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.229.0",
++ "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.229.0): each operation lists the capabilities it performs; a token for the 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"
@@@ -16,6 +16,52 @@
}
],
"paths": {
++ "/api/v1/actions": {
++ "get": {
++ "operationId": "get_api_v1_actions",
++ "summary": "Read one person's Action Center items from OpenVibe.AI (plan 2026-10-28 §3.10): AI runs made on the person's behalf (on_behalf_of), as common.action-list-result@1.",
++ "description": "**ai.actions.read** (first-party): Read one person's Action Center items from OpenVibe.AI (plan 2026-10-28 §3.10): AI runs made on the person's behalf (on_behalf_of), as common.action-list-result@1. GET /api/v1/actions?subject=usr_… with a service token; granted to OpenVibe.Network's aggregator only. Never another person's items, and only the fields of common.action-item@1.",
++ "tags": [
++ "ai.actions"
++ ],
++ "x-openvibe-capabilities": [
++ "ai.actions.read"
++ ],
++ "x-openvibe-visibility": [
++ "first-party"
++ ],
++ "x-openvibe-quota-class": "standard",
++ "security": [
++ {
++ "openvibeToken": [
++ "ai.actions.read"
++ ]
++ }
++ ],
++ "responses": {
++ "2XX": {
++ "description": "Success",
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/common.action-list-result.v1"
++ }
++ }
++ }
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ }
++ },
"/api/v1/attribution-quotas/{attribution}": {
"delete": {
"operationId": "delete_api_v1_attribution_quotas_attribution",
@@@ -5022,6 +5068,169 @@
}
]
},
++ "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.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "service",
++ "id",
++ "kind",
++ "title",
++ "bucket",
++ "state",
++ "created_at",
++ "updated_at",
++ "href",
++ "actions"
++ ],
++ "properties": {
++ "service": {
++ "enum": [
++ "actor",
++ "codes",
++ "ai",
++ "network",
++ "run"
++ ],
++ "description": "The authority that owns the item."
++ },
++ "id": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 80,
++ "description": "The authority's own id (tsk_…, a Codes task id, run_…, a confirmation id)."
++ },
++ "kind": {
++ "enum": [
++ "agent_task",
++ "code_task",
++ "ai_run",
++ "approval",
++ "desk_session"
++ ],
++ "description": "What the item is."
++ },
++ "title": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 160,
++ "description": "A short plain-text name: the start of the task text, the workflow, or what the approval is for."
++ },
++ "summary": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "maxLength": 400,
++ "description": "The last step, the outcome, or what will happen on approval."
++ },
++ "bucket": {
++ "enum": [
++ "running",
++ "waiting",
++ "scheduled",
++ "done",
++ "failed"
++ ],
++ "description": "Where the Action Center shows it: running (queued or working), waiting (needs the person), scheduled (will run later), done, failed (failed, cancelled or expired)."
++ },
++ "state": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 32,
++ "description": "The authority's own state word (queued, running, needs_you, succeeded, failed, cancelled, pending…)."
++ },
++ "agent": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "maxLength": 80,
++ "description": "The agent, model or workflow doing it, when known."
++ },
++ "cost_usd": {
++ "type": [
++ "number",
++ "null"
++ ],
++ "minimum": 0,
++ "description": "What it cost the person, in US dollars; null when unknown or free."
++ },
++ "steps": {
++ "type": [
++ "integer",
++ "null"
++ ],
++ "minimum": 0,
++ "description": "Tool calls or steps so far, when counted."
++ },
++ "error": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "maxLength": 400,
++ "description": "Why it failed, in words a person can act on."
++ },
++ "created_at": {
++ "type": "string",
++ "format": "date-time"
++ },
++ "updated_at": {
++ "type": "string",
++ "format": "date-time"
++ },
++ "next_run_at": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "format": "date-time",
++ "description": "When a scheduled item runs next."
++ },
++ "href": {
++ "type": "string",
++ "format": "uri",
++ "pattern": "^https://",
++ "maxLength": 2048,
++ "description": "The item's page: its live steps, receipt or approval."
++ },
++ "actions": {
++ "type": "array",
++ "maxItems": 4,
++ "description": "What the person can do from the list. approve/decline/cancel/retry go through OpenVibe.Network (POST /api/v1/me/actions/:service/:id/:action); open is a link.",
++ "items": {
++ "enum": [
++ "open",
++ "approve",
++ "decline",
++ "cancel",
++ "retry"
++ ]
++ }
++ }
++ }
++ },
++ "common.action-list-result.v1": {
++ "title": "ActionListResult",
++ "description": "One authority's Action Center items for a person (capabilities actor.actions.read, codes.actions.read, ai.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.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "items"
++ ],
++ "properties": {
++ "items": {
++ "type": "array",
++ "maxItems": 50,
++ "items": {
++ "$ref": "#/components/schemas/common.action-item.v1"
++ }
++ }
++ }
++ },
"common.entity-ref.v1": {
"title": "EntityRef",
"description": "Typed reference to another service's entity. Store this instead of a foreign key; resolve a display projection from the owner.",
ddiff --git a/generated/openapi/billing.json b/generated/openapi/billing.json
iindex ccae7237..7ecc69a9 100644
---- a/generated/openapi/billing.json
++++ b/generated/openapi/billing.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Billing API",
-- "version": "0.228.0",
-- "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.228.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.229.0",
++ "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.229.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/blog.json b/generated/openapi/blog.json
iindex 94494fba..21efc479 100644
---- a/generated/openapi/blog.json
++++ b/generated/openapi/blog.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Blog API",
-- "version": "0.228.0",
-- "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.228.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.229.0",
++ "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.229.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/bot.json b/generated/openapi/bot.json
iindex 8df95181..13c5af89 100644
---- a/generated/openapi/bot.json
++++ b/generated/openapi/bot.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Bot API",
-- "version": "0.228.0",
-- "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.228.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.229.0",
++ "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.229.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/chat.json b/generated/openapi/chat.json
iindex 20b685fb..83d3fbb0 100644
---- a/generated/openapi/chat.json
++++ b/generated/openapi/chat.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Chat API",
-- "version": "0.228.0",
-- "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.228.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.229.0",
++ "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.229.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/codes.json b/generated/openapi/codes.json
iindex edc7ae52..665c1389 100644
---- a/generated/openapi/codes.json
++++ b/generated/openapi/codes.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Codes API",
-- "version": "0.228.0",
-- "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.228.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.229.0",
++ "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.229.0): each operation lists the capabilities it performs; a token for the 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"
@@@ -16,6 +16,52 @@
}
],
"paths": {
++ "/api/v1/actions": {
++ "get": {
++ "operationId": "get_api_v1_actions",
++ "summary": "Read one person's Action Center items from OpenVibe.Codes (plan 2026-10-28 §3.10): coding tasks run through OpenVibe.Run (queued, placed, running, done, failed), as common.action-list-result@1.",
++ "description": "**codes.actions.read** (first-party): Read one person's Action Center items from OpenVibe.Codes (plan 2026-10-28 §3.10): coding tasks run through OpenVibe.Run (queued, placed, running, done, failed), as common.action-list-result@1. GET /api/v1/actions?subject=usr_… with a service token; granted to OpenVibe.Network's aggregator only. Never another person's items, and only the fields of common.action-item@1.",
++ "tags": [
++ "codes.actions"
++ ],
++ "x-openvibe-capabilities": [
++ "codes.actions.read"
++ ],
++ "x-openvibe-visibility": [
++ "first-party"
++ ],
++ "x-openvibe-quota-class": "standard",
++ "security": [
++ {
++ "openvibeToken": [
++ "codes.actions.read"
++ ]
++ }
++ ],
++ "responses": {
++ "2XX": {
++ "description": "Success",
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/common.action-list-result.v1"
++ }
++ }
++ }
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ }
++ },
"/api/v1/tasks": {
"post": {
"operationId": "post_api_v1_tasks",
@@@ -433,6 +479,169 @@
}
}
},
++ "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.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "service",
++ "id",
++ "kind",
++ "title",
++ "bucket",
++ "state",
++ "created_at",
++ "updated_at",
++ "href",
++ "actions"
++ ],
++ "properties": {
++ "service": {
++ "enum": [
++ "actor",
++ "codes",
++ "ai",
++ "network",
++ "run"
++ ],
++ "description": "The authority that owns the item."
++ },
++ "id": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 80,
++ "description": "The authority's own id (tsk_…, a Codes task id, run_…, a confirmation id)."
++ },
++ "kind": {
++ "enum": [
++ "agent_task",
++ "code_task",
++ "ai_run",
++ "approval",
++ "desk_session"
++ ],
++ "description": "What the item is."
++ },
++ "title": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 160,
++ "description": "A short plain-text name: the start of the task text, the workflow, or what the approval is for."
++ },
++ "summary": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "maxLength": 400,
++ "description": "The last step, the outcome, or what will happen on approval."
++ },
++ "bucket": {
++ "enum": [
++ "running",
++ "waiting",
++ "scheduled",
++ "done",
++ "failed"
++ ],
++ "description": "Where the Action Center shows it: running (queued or working), waiting (needs the person), scheduled (will run later), done, failed (failed, cancelled or expired)."
++ },
++ "state": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 32,
++ "description": "The authority's own state word (queued, running, needs_you, succeeded, failed, cancelled, pending…)."
++ },
++ "agent": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "maxLength": 80,
++ "description": "The agent, model or workflow doing it, when known."
++ },
++ "cost_usd": {
++ "type": [
++ "number",
++ "null"
++ ],
++ "minimum": 0,
++ "description": "What it cost the person, in US dollars; null when unknown or free."
++ },
++ "steps": {
++ "type": [
++ "integer",
++ "null"
++ ],
++ "minimum": 0,
++ "description": "Tool calls or steps so far, when counted."
++ },
++ "error": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "maxLength": 400,
++ "description": "Why it failed, in words a person can act on."
++ },
++ "created_at": {
++ "type": "string",
++ "format": "date-time"
++ },
++ "updated_at": {
++ "type": "string",
++ "format": "date-time"
++ },
++ "next_run_at": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "format": "date-time",
++ "description": "When a scheduled item runs next."
++ },
++ "href": {
++ "type": "string",
++ "format": "uri",
++ "pattern": "^https://",
++ "maxLength": 2048,
++ "description": "The item's page: its live steps, receipt or approval."
++ },
++ "actions": {
++ "type": "array",
++ "maxItems": 4,
++ "description": "What the person can do from the list. approve/decline/cancel/retry go through OpenVibe.Network (POST /api/v1/me/actions/:service/:id/:action); open is a link.",
++ "items": {
++ "enum": [
++ "open",
++ "approve",
++ "decline",
++ "cancel",
++ "retry"
++ ]
++ }
++ }
++ }
++ },
++ "common.action-list-result.v1": {
++ "title": "ActionListResult",
++ "description": "One authority's Action Center items for a person (capabilities actor.actions.read, codes.actions.read, ai.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.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "items"
++ ],
++ "properties": {
++ "items": {
++ "type": "array",
++ "maxItems": 50,
++ "items": {
++ "$ref": "#/components/schemas/common.action-item.v1"
++ }
++ }
++ }
++ },
"errors.problem.v1": {
"title": "Problem",
"description": "RFC 9457 problem details (application/problem+json) with a stable OpenVibe error code and trace identifiers. The legacy 'error' string is allowed during migration so existing clients keep working.",
ddiff --git a/generated/openapi/community.json b/generated/openapi/community.json
iindex 1c74ed14..91a61288 100644
---- a/generated/openapi/community.json
++++ b/generated/openapi/community.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Community API",
-- "version": "0.228.0",
-- "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.228.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.229.0",
++ "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.229.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/coupons.json b/generated/openapi/coupons.json
iindex e24090cf..fd9f0f1d 100644
---- a/generated/openapi/coupons.json
++++ b/generated/openapi/coupons.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Coupons API",
-- "version": "0.228.0",
-- "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.228.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.229.0",
++ "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.229.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/deals.json b/generated/openapi/deals.json
iindex 716bd808..7b83af88 100644
---- a/generated/openapi/deals.json
++++ b/generated/openapi/deals.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Deals API",
-- "version": "0.228.0",
-- "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.228.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.229.0",
++ "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.229.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/events.json b/generated/openapi/events.json
iindex f5d30ddb..f9c7c36a 100644
---- a/generated/openapi/events.json
++++ b/generated/openapi/events.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Events API",
-- "version": "0.228.0",
-- "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.228.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.229.0",
++ "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.229.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/food.json b/generated/openapi/food.json
iindex ac8d0cd0..484fe8bf 100644
---- a/generated/openapi/food.json
++++ b/generated/openapi/food.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Food API",
-- "version": "0.228.0",
-- "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.228.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.229.0",
++ "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.229.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/games.json b/generated/openapi/games.json
iindex c81a1cbc..1566322b 100644
---- a/generated/openapi/games.json
++++ b/generated/openapi/games.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Games API",
-- "version": "0.228.0",
-- "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.228.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.229.0",
++ "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.229.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/host.json b/generated/openapi/host.json
iindex fb002fe7..962d840c 100644
---- a/generated/openapi/host.json
++++ b/generated/openapi/host.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Host API",
-- "version": "0.228.0",
-- "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.228.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.229.0",
++ "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.229.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/index.json b/generated/openapi/index.json
iindex ed20386b..90a22ae2 100644
---- a/generated/openapi/index.json
++++ b/generated/openapi/index.json
@@@ -5,15 +5,15 @@
"service": "actor",
"name": "OpenVibe.Actor",
"origin": "https://openvibe.actor",
-- "operations": 24,
-- "capabilities": 8
++ "operations": 26,
++ "capabilities": 10
},
{
"service": "ai",
"name": "OpenVibe.AI",
"origin": "https://ai.openvibe.services",
-- "operations": 43,
-- "capabilities": 8
++ "operations": 44,
++ "capabilities": 9
},
{
"service": "billing",
@@@ -47,8 +47,8 @@
"service": "codes",
"name": "OpenVibe.Codes",
"origin": "https://openvibe.codes",
-- "operations": 3,
-- "capabilities": 3
++ "operations": 4,
++ "capabilities": 4
},
{
"service": "community",
@@@ -131,8 +131,8 @@
"service": "network",
"name": "OpenVibe.Network",
"origin": "https://openvibe.network",
-- "operations": 41,
-- "capabilities": 29
++ "operations": 43,
++ "capabilities": 30
},
{
"service": "news",
ddiff --git a/generated/openapi/inventory.json b/generated/openapi/inventory.json
iindex 1377cc94..38f9b590 100644
---- a/generated/openapi/inventory.json
++++ b/generated/openapi/inventory.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Inventory API",
-- "version": "0.228.0",
-- "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.228.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.229.0",
++ "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.229.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/live.json b/generated/openapi/live.json
iindex 525df7d0..ebc31064 100644
---- a/generated/openapi/live.json
++++ b/generated/openapi/live.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Live API",
-- "version": "0.228.0",
-- "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.228.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.229.0",
++ "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.229.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/media-hub.json b/generated/openapi/media-hub.json
iindex 6d2fcfb0..49da22df 100644
---- a/generated/openapi/media-hub.json
++++ b/generated/openapi/media-hub.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.MediaHub API",
-- "version": "0.228.0",
-- "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.228.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.229.0",
++ "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.229.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/media.json b/generated/openapi/media.json
iindex 52a7932c..715fa2d1 100644
---- a/generated/openapi/media.json
++++ b/generated/openapi/media.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Media API",
-- "version": "0.228.0",
-- "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.228.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.229.0",
++ "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.229.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/network.json b/generated/openapi/network.json
iindex 983915b8..9b8b317c 100644
---- a/generated/openapi/network.json
++++ b/generated/openapi/network.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Network API",
-- "version": "0.228.0",
-- "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.228.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.229.0",
++ "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.229.0): each operation lists the capabilities it performs; a token for the 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"
@@@ -136,6 +136,124 @@
}
}
},
++ "/api/v1/me/actions": {
++ "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.",
++ "tags": [
++ "network.actions"
++ ],
++ "x-openvibe-capabilities": [
++ "network.actions.read"
++ ],
++ "x-openvibe-visibility": [
++ "public"
++ ],
++ "x-openvibe-quota-class": "standard",
++ "security": [
++ {
++ "openvibeToken": [
++ "network.actions.read"
++ ]
++ }
++ ],
++ "responses": {
++ "2XX": {
++ "description": "Success",
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/network.me-actions-result.v1"
++ }
++ }
++ }
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ }
++ },
++ "/api/v1/me/actions/{service}/{id}/{action}": {
++ "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.",
++ "tags": [
++ "network.actions"
++ ],
++ "x-openvibe-capabilities": [
++ "network.actions.read"
++ ],
++ "x-openvibe-visibility": [
++ "public"
++ ],
++ "x-openvibe-quota-class": "standard",
++ "security": [
++ {
++ "openvibeToken": [
++ "network.actions.read"
++ ]
++ }
++ ],
++ "parameters": [
++ {
++ "name": "service",
++ "in": "path",
++ "required": true,
++ "schema": {
++ "type": "string"
++ }
++ },
++ {
++ "name": "id",
++ "in": "path",
++ "required": true,
++ "schema": {
++ "type": "string"
++ }
++ },
++ {
++ "name": "action",
++ "in": "path",
++ "required": true,
++ "schema": {
++ "type": "string"
++ }
++ }
++ ],
++ "responses": {
++ "2XX": {
++ "description": "Success",
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/network.me-actions-result.v1"
++ }
++ }
++ }
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ }
++ },
"/api/v1/node/self/capabilities": {
"put": {
"operationId": "put_api_v1_node_self_capabilities",
@@@ -2378,6 +2496,151 @@
},
"components": {
"schemas": {
++ "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.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "service",
++ "id",
++ "kind",
++ "title",
++ "bucket",
++ "state",
++ "created_at",
++ "updated_at",
++ "href",
++ "actions"
++ ],
++ "properties": {
++ "service": {
++ "enum": [
++ "actor",
++ "codes",
++ "ai",
++ "network",
++ "run"
++ ],
++ "description": "The authority that owns the item."
++ },
++ "id": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 80,
++ "description": "The authority's own id (tsk_…, a Codes task id, run_…, a confirmation id)."
++ },
++ "kind": {
++ "enum": [
++ "agent_task",
++ "code_task",
++ "ai_run",
++ "approval",
++ "desk_session"
++ ],
++ "description": "What the item is."
++ },
++ "title": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 160,
++ "description": "A short plain-text name: the start of the task text, the workflow, or what the approval is for."
++ },
++ "summary": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "maxLength": 400,
++ "description": "The last step, the outcome, or what will happen on approval."
++ },
++ "bucket": {
++ "enum": [
++ "running",
++ "waiting",
++ "scheduled",
++ "done",
++ "failed"
++ ],
++ "description": "Where the Action Center shows it: running (queued or working), waiting (needs the person), scheduled (will run later), done, failed (failed, cancelled or expired)."
++ },
++ "state": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 32,
++ "description": "The authority's own state word (queued, running, needs_you, succeeded, failed, cancelled, pending…)."
++ },
++ "agent": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "maxLength": 80,
++ "description": "The agent, model or workflow doing it, when known."
++ },
++ "cost_usd": {
++ "type": [
++ "number",
++ "null"
++ ],
++ "minimum": 0,
++ "description": "What it cost the person, in US dollars; null when unknown or free."
++ },
++ "steps": {
++ "type": [
++ "integer",
++ "null"
++ ],
++ "minimum": 0,
++ "description": "Tool calls or steps so far, when counted."
++ },
++ "error": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "maxLength": 400,
++ "description": "Why it failed, in words a person can act on."
++ },
++ "created_at": {
++ "type": "string",
++ "format": "date-time"
++ },
++ "updated_at": {
++ "type": "string",
++ "format": "date-time"
++ },
++ "next_run_at": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "format": "date-time",
++ "description": "When a scheduled item runs next."
++ },
++ "href": {
++ "type": "string",
++ "format": "uri",
++ "pattern": "^https://",
++ "maxLength": 2048,
++ "description": "The item's page: its live steps, receipt or approval."
++ },
++ "actions": {
++ "type": "array",
++ "maxItems": 4,
++ "description": "What the person can do from the list. approve/decline/cancel/retry go through OpenVibe.Network (POST /api/v1/me/actions/:service/:id/:action); open is a link.",
++ "items": {
++ "enum": [
++ "open",
++ "approve",
++ "decline",
++ "cancel",
++ "retry"
++ ]
++ }
++ }
++ }
++ },
"common.no-body.v1": {
"title": "NoBody",
"description": "common.no-body@1: the capability's request carries no body; its parameters are the path and query of the routes in implementedBy (an id, a page cursor). An input schema that says so explicitly, so every active capability names one (roadmap WS-C task 4).",
@@@ -3593,6 +3856,124 @@
}
}
},
++ "network.me-actions-result.v1": {
++ "title": "MeActionsResult",
++ "description": "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.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "buckets",
++ "counts",
++ "sources",
++ "partial",
++ "generated_at"
++ ],
++ "properties": {
++ "buckets": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "running",
++ "waiting",
++ "scheduled",
++ "done",
++ "failed"
++ ],
++ "properties": {
++ "running": {
++ "type": "array",
++ "items": {
++ "$ref": "#/components/schemas/common.action-item.v1"
++ }
++ },
++ "waiting": {
++ "type": "array",
++ "items": {
++ "$ref": "#/components/schemas/common.action-item.v1"
++ }
++ },
++ "scheduled": {
++ "type": "array",
++ "items": {
++ "$ref": "#/components/schemas/common.action-item.v1"
++ }
++ },
++ "done": {
++ "type": "array",
++ "items": {
++ "$ref": "#/components/schemas/common.action-item.v1"
++ }
++ },
++ "failed": {
++ "type": "array",
++ "items": {
++ "$ref": "#/components/schemas/common.action-item.v1"
++ }
++ }
++ }
++ },
++ "counts": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "running",
++ "waiting",
++ "scheduled",
++ "done",
++ "failed"
++ ],
++ "properties": {
++ "running": {
++ "type": "integer",
++ "minimum": 0
++ },
++ "waiting": {
++ "type": "integer",
++ "minimum": 0
++ },
++ "scheduled": {
++ "type": "integer",
++ "minimum": 0
++ },
++ "done": {
++ "type": "integer",
++ "minimum": 0
++ },
++ "failed": {
++ "type": "integer",
++ "minimum": 0
++ }
++ }
++ },
++ "sources": {
++ "type": "object",
++ "propertyNames": {
++ "enum": [
++ "actor",
++ "codes",
++ "ai",
++ "network",
++ "run"
++ ]
++ },
++ "additionalProperties": {
++ "enum": [
++ "ok",
++ "unavailable",
++ "timeout",
++ "not_connected"
++ ]
++ }
++ },
++ "partial": {
++ "type": "boolean"
++ },
++ "generated_at": {
++ "type": "string",
++ "format": "date-time"
++ }
++ }
++ },
"network.mod-install-request.v1": {
"title": "NetworkModInstallRequest",
"description": "network.mod-install-request@1 (OpenVibe.Network; roadmap WS-M task 3, ADR-013): a runtime (OpenVibe.Games) registers an install's mod principal, POST /internal/mods with capability mods.grant.manage. The manifest (mods.mod-manifest@1) names the requested capabilities; `approve` is the subset staff approved at install, and the rest stays pending. The runtime that registers a mod is its owner: only it (or Network staff) changes its grants. Registering the same mod again answers the existing principal.",
ddiff --git a/generated/openapi/news.json b/generated/openapi/news.json
iindex 46bc6b35..3b768bee 100644
---- a/generated/openapi/news.json
++++ b/generated/openapi/news.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.News API",
-- "version": "0.228.0",
-- "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.228.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.229.0",
++ "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.229.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/openre.json b/generated/openapi/openre.json
iindex a6dd8a89..2dac1200 100644
---- a/generated/openapi/openre.json
++++ b/generated/openapi/openre.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenRestream API",
-- "version": "0.228.0",
-- "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.228.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.229.0",
++ "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.229.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/play.json b/generated/openapi/play.json
iindex d14ae159..6944d83b 100644
---- a/generated/openapi/play.json
++++ b/generated/openapi/play.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Play API",
-- "version": "0.228.0",
-- "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.228.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.229.0",
++ "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.229.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/quest.json b/generated/openapi/quest.json
iindex 84efac8d..586021f1 100644
---- a/generated/openapi/quest.json
++++ b/generated/openapi/quest.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Quest API",
-- "version": "0.228.0",
-- "description": "Routes of OpenVibe.Quest as the OpenVibe contracts describe them (openvibe-contracts 0.228.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.229.0",
++ "description": "Routes of OpenVibe.Quest as the OpenVibe contracts describe them (openvibe-contracts 0.229.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/reviews.json b/generated/openapi/reviews.json
iindex f886f725..6e9280f2 100644
---- a/generated/openapi/reviews.json
++++ b/generated/openapi/reviews.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Reviews API",
-- "version": "0.228.0",
-- "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.228.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.229.0",
++ "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.229.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/run.json b/generated/openapi/run.json
iindex e734e5f6..27446714 100644
---- a/generated/openapi/run.json
++++ b/generated/openapi/run.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Run API",
-- "version": "0.228.0",
-- "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.228.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.229.0",
++ "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.229.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/search.json b/generated/openapi/search.json
iindex d66d603c..1e1d699c 100644
---- a/generated/openapi/search.json
++++ b/generated/openapi/search.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Search API",
-- "version": "0.228.0",
-- "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.228.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.229.0",
++ "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.229.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/services.json b/generated/openapi/services.json
iindex 5ff43421..1d7ee203 100644
---- a/generated/openapi/services.json
++++ b/generated/openapi/services.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Services API",
-- "version": "0.228.0",
-- "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.228.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.229.0",
++ "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.229.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/sources.json b/generated/openapi/sources.json
iindex 5e1cee11..80ca26cf 100644
---- a/generated/openapi/sources.json
++++ b/generated/openapi/sources.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Sources API",
-- "version": "0.228.0",
-- "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.228.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.229.0",
++ "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.229.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/space.json b/generated/openapi/space.json
iindex a79cfc30..c3d5ae5a 100644
---- a/generated/openapi/space.json
++++ b/generated/openapi/space.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Space API",
-- "version": "0.228.0",
-- "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.228.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.229.0",
++ "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.229.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/tips.json b/generated/openapi/tips.json
iindex a9b85210..1354a11f 100644
---- a/generated/openapi/tips.json
++++ b/generated/openapi/tips.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Tips API",
-- "version": "0.228.0",
-- "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.228.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.229.0",
++ "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.229.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/tools.json b/generated/openapi/tools.json
iindex 1e2cb103..da9176c1 100644
---- a/generated/openapi/tools.json
++++ b/generated/openapi/tools.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Tools API",
-- "version": "0.228.0",
-- "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.228.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.229.0",
++ "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.229.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/trade.json b/generated/openapi/trade.json
iindex f3bc60d0..a5dce2c5 100644
---- a/generated/openapi/trade.json
++++ b/generated/openapi/trade.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Trade API",
-- "version": "0.228.0",
-- "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.228.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.229.0",
++ "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.229.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/vip.json b/generated/openapi/vip.json
iindex bef023b2..75e77caf 100644
---- a/generated/openapi/vip.json
++++ b/generated/openapi/vip.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.VIP API",
-- "version": "0.228.0",
-- "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.228.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.229.0",
++ "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.229.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/watch.json b/generated/openapi/watch.json
iindex 68eb6da3..eab55cbb 100644
---- a/generated/openapi/watch.json
++++ b/generated/openapi/watch.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Watch API",
-- "version": "0.228.0",
-- "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.228.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.229.0",
++ "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.229.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/wiki.json b/generated/openapi/wiki.json
iindex 0217bffc..42fb5568 100644
---- a/generated/openapi/wiki.json
++++ b/generated/openapi/wiki.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Wiki API",
-- "version": "0.228.0",
-- "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.228.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.229.0",
++ "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.229.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/work.json b/generated/openapi/work.json
iindex 844b1754..e6520f9b 100644
---- a/generated/openapi/work.json
++++ b/generated/openapi/work.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Work API",
-- "version": "0.228.0",
-- "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.228.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.229.0",
++ "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.229.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/zone.json b/generated/openapi/zone.json
iindex ac527576..26f9b853 100644
---- a/generated/openapi/zone.json
++++ b/generated/openapi/zone.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Zone API",
-- "version": "0.228.0",
-- "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.228.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.229.0",
++ "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.229.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/typescript/index.d.ts b/generated/typescript/index.d.ts
iindex d2a510c8..1ecae17b 100644
---- a/generated/typescript/index.d.ts
++++ b/generated/typescript/index.d.ts
@@@ -212416,3 +212416,121 @@ export interface BotDeskLeaseCreateRequest {
*/
height?: number;
}
++
++/** [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.
++ */
++export interface ActionItem {
++ /**
++ * The authority that owns the item.
++ */
++ service: "actor" | "codes" | "ai" | "network" | "run";
++ /**
++ * The authority's own id (tsk_…, a Codes task id, run_…, a confirmation id).
++ */
++ id: string;
++ /**
++ * What the item is.
++ */
++ kind: "agent_task" | "code_task" | "ai_run" | "approval" | "desk_session";
++ /**
++ * A short plain-text name: the start of the task text, the workflow, or what the approval is for.
++ */
++ title: string;
++ /**
++ * The last step, the outcome, or what will happen on approval.
++ */
++ summary?: string | null;
++ /**
++ * Where the Action Center shows it: running (queued or working), waiting (needs the person), scheduled (will run later), done, failed (failed, cancelled or expired).
++ */
++ bucket: "running" | "waiting" | "scheduled" | "done" | "failed";
++ /**
++ * The authority's own state word (queued, running, needs_you, succeeded, failed, cancelled, pending…).
++ */
++ state: string;
++ /**
++ * The agent, model or workflow doing it, when known.
++ */
++ agent?: string | null;
++ /**
++ * What it cost the person, in US dollars; null when unknown or free.
++ */
++ cost_usd?: number | null;
++ /**
++ * Tool calls or steps so far, when counted.
++ */
++ steps?: number | null;
++ /**
++ * Why it failed, in words a person can act on.
++ */
++ error?: string | null;
++ created_at: string;
++ updated_at: string;
++ /**
++ * When a scheduled item runs next.
++ */
++ next_run_at?: string | null;
++ /**
++ * The item's page: its live steps, receipt or approval.
++ */
++ href: string;
++ /**
++ * What the person can do from the list. approve/decline/cancel/retry go through OpenVibe.Network (POST /api/v1/me/actions/:service/:id/:action); open is a link.
++ *
++ * @maxItems 4
++ */
++ actions:
++ | []
++ | ["open" | "approve" | "decline" | "cancel" | "retry"]
++ | ["open" | "approve" | "decline" | "cancel" | "retry", "open" | "approve" | "decline" | "cancel" | "retry"]
++ | [
++ "open" | "approve" | "decline" | "cancel" | "retry",
++ "open" | "approve" | "decline" | "cancel" | "retry",
++ "open" | "approve" | "decline" | "cancel" | "retry"
++ ]
++ | [
++ "open" | "approve" | "decline" | "cancel" | "retry",
++ "open" | "approve" | "decline" | "cancel" | "retry",
++ "open" | "approve" | "decline" | "cancel" | "retry",
++ "open" | "approve" | "decline" | "cancel" | "retry"
++ ];
++}
++
++/** [email protected] (owner: contracts) */
++/**
++ * One authority's Action Center items for a person (capabilities actor.actions.read, codes.actions.read, ai.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.
++ */
++export interface ActionListResult {
++ /**
++ * @maxItems 50
++ */
++ items: ActionItem[];
++}
++
++/** [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.
++ */
++export interface MeActionsResult {
++ buckets: {
++ running: ActionItem[];
++ waiting: ActionItem[];
++ scheduled: ActionItem[];
++ done: ActionItem[];
++ failed: ActionItem[];
++ };
++ counts: {
++ running: number;
++ waiting: number;
++ scheduled: number;
++ done: number;
++ failed: number;
++ };
++ sources: {
++ [k: string]: ("ok" | "unavailable" | "timeout" | "not_connected") | undefined;
++ };
++ partial: boolean;
++ generated_at: string;
++}
ddiff --git a/manifests/capabilities/actor.actions.read.json b/manifests/capabilities/actor.actions.read.json
nnew file mode 100644
iindex 00000000..5f550a5f
---- /dev/null
++++ b/manifests/capabilities/actor.actions.read.json
@@@ -0,0 +1,21 @@
++{
++ "id": "actor.actions.read",
++ "version": "1.0",
++ "owner": "actor",
++ "status": "active",
++ "visibility": "first-party",
++ "description": "Read one person's Action Center items from OpenVibe.Actor (plan 2026-10-28 §3.10): agent tasks (running, needing the person, done or failed), pending approvals, and personal agents' next scheduled runs, as common.action-list-result@1. GET /api/v1/actions?subject=usr_… with a service token; granted to OpenVibe.Network's aggregator only. Never another person's items, and only the fields of common.action-item@1.",
++ "permissions": [
++ "actor:read"
++ ],
++ "resourceConstraints": [
++ "none"
++ ],
++ "quotaClass": "standard",
++ "events": [],
++ "implementedBy": [
++ "GET /api/v1/actions"
++ ],
++ "inputSchema": "common.no-body@1",
++ "outputSchema": "common.action-list-result@1"
++}
ddiff --git a/manifests/capabilities/actor.approval.decide.json b/manifests/capabilities/actor.approval.decide.json
nnew file mode 100644
iindex 00000000..bb51d6ba
---- /dev/null
++++ b/manifests/capabilities/actor.approval.decide.json
@@@ -0,0 +1,21 @@
++{
++ "id": "actor.approval.decide",
++ "version": "1.0",
++ "owner": "actor",
++ "status": "active",
++ "visibility": "first-party",
++ "description": "Approve or decline a pending OpenVibe.Actor approval for its person (plan 2026-10-28 §3.10): POST /api/v1/approvals/:id/decide { decision: approve | decline } with a service token and X-OV-Subject naming the approval's owner, the same decision the person makes on /me/approvals. Granted to OpenVibe.Network, which acts from the Action Center for the signed-in person.",
++ "permissions": [
++ "actor:write"
++ ],
++ "resourceConstraints": [
++ "none"
++ ],
++ "quotaClass": "standard",
++ "events": [],
++ "implementedBy": [
++ "POST /api/v1/approvals/:id/decide"
++ ],
++ "inputSchema": "common.no-body@1",
++ "outputSchema": "common.action-item@1"
++}
ddiff --git a/manifests/capabilities/ai.actions.read.json b/manifests/capabilities/ai.actions.read.json
nnew file mode 100644
iindex 00000000..b1fbd771
---- /dev/null
++++ b/manifests/capabilities/ai.actions.read.json
@@@ -0,0 +1,21 @@
++{
++ "id": "ai.actions.read",
++ "version": "1.0",
++ "owner": "ai",
++ "status": "active",
++ "visibility": "first-party",
++ "description": "Read one person's Action Center items from OpenVibe.AI (plan 2026-10-28 §3.10): AI runs made on the person's behalf (on_behalf_of), as common.action-list-result@1. GET /api/v1/actions?subject=usr_… with a service token; granted to OpenVibe.Network's aggregator only. Never another person's items, and only the fields of common.action-item@1.",
++ "permissions": [
++ "ai:read"
++ ],
++ "resourceConstraints": [
++ "none"
++ ],
++ "quotaClass": "standard",
++ "events": [],
++ "implementedBy": [
++ "GET /api/v1/actions"
++ ],
++ "inputSchema": "common.no-body@1",
++ "outputSchema": "common.action-list-result@1"
++}
ddiff --git a/manifests/capabilities/codes.actions.read.json b/manifests/capabilities/codes.actions.read.json
nnew file mode 100644
iindex 00000000..42c85726
---- /dev/null
++++ b/manifests/capabilities/codes.actions.read.json
@@@ -0,0 +1,21 @@
++{
++ "id": "codes.actions.read",
++ "version": "1.0",
++ "owner": "codes",
++ "status": "active",
++ "visibility": "first-party",
++ "description": "Read one person's Action Center items from OpenVibe.Codes (plan 2026-10-28 §3.10): coding tasks run through OpenVibe.Run (queued, placed, running, done, failed), as common.action-list-result@1. GET /api/v1/actions?subject=usr_… with a service token; granted to OpenVibe.Network's aggregator only. Never another person's items, and only the fields of common.action-item@1.",
++ "permissions": [
++ "codes:read"
++ ],
++ "resourceConstraints": [
++ "none"
++ ],
++ "quotaClass": "standard",
++ "events": [],
++ "implementedBy": [
++ "GET /api/v1/actions"
++ ],
++ "inputSchema": "common.no-body@1",
++ "outputSchema": "common.action-list-result@1"
++}
ddiff --git a/manifests/capabilities/network.actions.read.json b/manifests/capabilities/network.actions.read.json
nnew file mode 100644
iindex 00000000..dde0247c
---- /dev/null
++++ b/manifests/capabilities/network.actions.read.json
@@@ -0,0 +1,23 @@
++{
++ "id": "network.actions.read",
++ "version": "1.0",
++ "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.",
++ "permissions": [
++ "network:read",
++ "network:write"
++ ],
++ "resourceConstraints": [
++ "none"
++ ],
++ "quotaClass": "standard",
++ "events": [],
++ "implementedBy": [
++ "GET /api/v1/me/actions",
++ "POST /api/v1/me/actions/:service/:id/:action"
++ ],
++ "inputSchema": "common.no-body@1",
++ "outputSchema": "network.me-actions-result@1"
++}
ddiff --git a/manifests/services/actor.json b/manifests/services/actor.json
iindex 8236a461..434b48b7 100644
---- a/manifests/services/actor.json
++++ b/manifests/services/actor.json
@@@ -23,7 +23,9 @@
"actor.resource.read",
"actor.resource.control",
"actor.agent.manage",
-- "actor.agent.run"
++ "actor.agent.run",
++ "actor.actions.read",
++ "actor.approval.decide"
],
"eventsProduced": [],
"eventsConsumed": [
ddiff --git a/manifests/services/ai.json b/manifests/services/ai.json
iindex 2b866db0..da84e9df 100644
---- a/manifests/services/ai.json
++++ b/manifests/services/ai.json
@@@ -27,7 +27,8 @@
"ai.run.create",
"ai.run.read",
"ai.usage.read",
-- "ai.workflow.manage"
++ "ai.workflow.manage",
++ "ai.actions.read"
],
"eventsProduced": [
"ai.run.queued",
ddiff --git a/manifests/services/codes.json b/manifests/services/codes.json
iindex 211b829d..057ceaf3 100644
---- a/manifests/services/codes.json
++++ b/manifests/services/codes.json
@@@ -43,7 +43,8 @@
"capabilities": [
"codes.task.start",
"codes.task.read",
-- "codes.task.cancel"
++ "codes.task.cancel",
++ "codes.actions.read"
],
"eventsProduced": [],
"eventsConsumed": [],
ddiff --git a/manifests/services/network.json b/manifests/services/network.json
iindex dc41434d..205e407a 100644
---- a/manifests/services/network.json
++++ b/manifests/services/network.json
@@@ -76,7 +76,8 @@
"network.resource.report",
"network.secret.use",
"network.staff.read",
-- "network.status.incident"
++ "network.status.incident",
++ "network.actions.read"
],
"eventsProduced": [
"network.account.deleted",
ddiff --git a/package.json b/package.json
iindex 790b4653..50e65480 100644
---- a/package.json
++++ b/package.json
@@@ -1,6 +1,6 @@
{
"name": "openvibe-contracts",
-- "version": "0.228.0",
++ "version": "0.229.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",