openvibers/openvibe.contracts Commits

0.254.0: actor.wait@1 — the wait record (plan A2, Watch mode) (#262)

OP OpenVibers committed 13 days ago · e93d8759ed · 53 files, +752 −82

* 0.254.0: actor.wait@1 — the wait record (plan A2, Watch mode)

A wait is a record, not a running loop: the task and step it belongs to, whose it is, what wakes it (until: an Events topic, a Watch target or a time), the deadline, on_timeout (ask, retry, fail) and the short line the person reads. The event that woke it is untrusted input and is never part of the record — woken_by names the event, never its payload.

Adds the wait id prefix (wai_) and the contract's fixtures; generated/ is regenerated.

* actor.wait@1: a filter clause may name one of several values

A Codes task ends in succeeded, failed or cancelled, and a wait says which of them it wants: the clause carries the list. The list is bounded like the clause count.

Changes

ddiff --git a/CHANGELOG.md b/CHANGELOG.md
iindex 89f0fb3c..301e7cd5 100644
---- a/CHANGELOG.md
++++ b/CHANGELOG.md
@@@ -1,5 +1,14 @@
# Changelog
++## 0.254.0 — 2026-10-30
++
++- **`actor.wait@1`** (plan A2, Watch mode; the design note `research-2026-10-30/agent-a2-watch.md`): one wait — the
++ task and the step it belongs to, whose it is, what wakes it (`until`: an Events topic, a Watch target or a time),
++ the deadline, `on_timeout` (`ask`, `retry`, `fail`) and the short line the person reads. A wait is a record, not a
++ running loop: while a task waits no model runs, its desk is released and its budget clock stops. The event that woke
++ it is untrusted input and is never part of the record; `woken_by` names the event, never its payload.
++- **A new id prefix**: `wait` → `wai_`, the id a wait carries (`ids.newId('wait')`).
++
## 0.253.0 — 2026-10-30
- **A2A for OpenVibe.Actor** (Actor v2 stage V2-11). New capability `actor.a2a.task` (owner `actor`, active,
ddiff --git a/contracts/actor/wait.v1.json b/contracts/actor/wait.v1.json
nnew file mode 100644
iindex 00000000..1f9a66f0
---- /dev/null
++++ b/contracts/actor/wait.v1.json
@@@ -0,0 +1,199 @@
++{
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/actor/wait.v1.json",
++ "title": "ActorWait",
++ "description": "actor.wait@1: one wait (plan A2, Watch mode): the task and the step it belongs to, whose it is, what wakes it (until), the deadline, what happens when nothing comes (on_timeout) and the short line the person reads. A wait is a record, not a running loop: while a task waits, no model runs, its desk is released and its budget clock stops. The event that woke it is untrusted input: woken_by names the event, never its payload.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "id",
++ "task_id",
++ "requester",
++ "kind",
++ "until",
++ "deadline_at",
++ "on_timeout",
++ "line",
++ "status",
++ "created_at",
++ "updated_at"
++ ],
++ "properties": {
++ "id": {
++ "type": "string",
++ "pattern": "^wai_[0-9A-HJKMNP-TV-Z]{26}$"
++ },
++ "task_id": {
++ "type": "string",
++ "pattern": "^tsk_[0-9A-HJKMNP-TV-Z]{26}$"
++ },
++ "requester": {
++ "type": "string",
++ "pattern": "^(user|app|agent|service):[a-z]+_[0-9A-HJKMNP-TV-Z]{26}$"
++ },
++ "kind": {
++ "type": "string",
++ "enum": [
++ "event",
++ "watch",
++ "time"
++ ]
++ },
++ "until": {
++ "$ref": "#/$defs/until"
++ },
++ "filter": {
++ "type": "object",
++ "description": "The bounded matcher: a path (payload.a.b, subject.id, subject.type, actor.id, trace_id) and the value (or one of the values) the event must carry there. At most eight clauses; a filter is a matcher, not a query.",
++ "maxProperties": 8,
++ "additionalProperties": {
++ "anyOf": [
++ {
++ "type": "string",
++ "maxLength": 200
++ },
++ {
++ "type": "number"
++ },
++ {
++ "type": "boolean"
++ },
++ {
++ "type": "array",
++ "maxItems": 12,
++ "items": {
++ "type": [
++ "string",
++ "number",
++ "boolean"
++ ]
++ }
++ }
++ ]
++ }
++ },
++ "deadline_at": {
++ "type": "string",
++ "format": "date-time"
++ },
++ "on_timeout": {
++ "type": "string",
++ "enum": [
++ "ask",
++ "retry",
++ "fail"
++ ]
++ },
++ "line": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 200
++ },
++ "status": {
++ "type": "string",
++ "enum": [
++ "waiting",
++ "woken",
++ "timed_out",
++ "cancelled",
++ "failed"
++ ]
++ },
++ "woken_by": {
++ "$ref": "#/$defs/wokenBy"
++ },
++ "created_at": {
++ "type": "string",
++ "format": "date-time"
++ },
++ "updated_at": {
++ "type": "string",
++ "format": "date-time"
++ },
++ "finished_at": {
++ "type": "string",
++ "format": "date-time"
++ }
++ },
++ "$defs": {
++ "until": {
++ "description": "What wakes the wait: an Events topic (plus the earliest event it may match), a Watch target, or a time.",
++ "oneOf": [
++ {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "topic"
++ ],
++ "properties": {
++ "topic": {
++ "type": "string",
++ "pattern": "^[a-z0-9_]+(\\.[a-z0-9_*]+)+$",
++ "maxLength": 200
++ },
++ "from": {
++ "type": "string",
++ "format": "date-time"
++ }
++ }
++ },
++ {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "watch_id"
++ ],
++ "properties": {
++ "watch_id": {
++ "type": "string",
++ "pattern": "^wch_[0-9A-HJKMNP-TV-Z]{26}$"
++ }
++ }
++ },
++ {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "at"
++ ],
++ "properties": {
++ "at": {
++ "type": "string",
++ "format": "date-time"
++ }
++ }
++ }
++ ]
++ },
++ "wokenBy": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "event_id",
++ "event_type",
++ "at"
++ ],
++ "properties": {
++ "event_id": {
++ "type": "string",
++ "maxLength": 128
++ },
++ "event_type": {
++ "type": "string",
++ "maxLength": 200
++ },
++ "at": {
++ "type": "string",
++ "format": "date-time"
++ },
++ "by": {
++ "type": "string",
++ "enum": [
++ "event",
++ "person"
++ ]
++ }
++ }
++ }
++ }
++}
ddiff --git a/contracts/catalog.json b/contracts/catalog.json
iindex 635468d0..cd08aa9b 100644
---- a/contracts/catalog.json
++++ b/contracts/catalog.json
@@@ -6820,6 +6820,16 @@
"status": "active",
"adr": "ADR-044"
},
++ {
++ "id": "actor.wait",
++ "version": "1.0.0",
++ "owner": "actor",
++ "schema": "actor/wait.v1.json",
++ "visibility": "public",
++ "compatibility": "backward",
++ "status": "active",
++ "adr": "ADR-044"
++ },
{
"id": "food.pantry-request",
"version": "1.0.0",
ddiff --git a/fixtures/actor.wait/invalid/no-line.json b/fixtures/actor.wait/invalid/no-line.json
nnew file mode 100644
iindex 00000000..78ad6cc4
---- /dev/null
++++ b/fixtures/actor.wait/invalid/no-line.json
@@@ -0,0 +1,12 @@
++{
++ "id": "wai_01K6R3A1B2C3D4E5F6G7H8J9KA",
++ "task_id": "tsk_01K6R3A1B2C3D4E5F6G7H8J9KB",
++ "requester": "user:usr_01K6R2Z8C4V7M9Q3T5W1X2Y3Z4",
++ "kind": "event",
++ "until": { "topic": "codes.task.succeeded" },
++ "deadline_at": "2026-10-30T22:00:00.000Z",
++ "on_timeout": "ask",
++ "status": "waiting",
++ "created_at": "2026-10-30T16:00:00.000Z",
++ "updated_at": "2026-10-30T16:00:00.000Z"
++}
ddiff --git a/fixtures/actor.wait/invalid/two-kinds-of-until.json b/fixtures/actor.wait/invalid/two-kinds-of-until.json
nnew file mode 100644
iindex 00000000..c105cda0
---- /dev/null
++++ b/fixtures/actor.wait/invalid/two-kinds-of-until.json
@@@ -0,0 +1,13 @@
++{
++ "id": "wai_01K6R3A1B2C3D4E5F6G7H8J9KA",
++ "task_id": "tsk_01K6R3A1B2C3D4E5F6G7H8J9KB",
++ "requester": "user:usr_01K6R2Z8C4V7M9Q3T5W1X2Y3Z4",
++ "kind": "event",
++ "until": { "topic": "codes.task.succeeded", "watch_id": "wch_01K6R3A1B2C3D4E5F6G7H8J9KF" },
++ "deadline_at": "2026-10-30T22:00:00.000Z",
++ "on_timeout": "ask",
++ "line": "waiting",
++ "status": "waiting",
++ "created_at": "2026-10-30T16:00:00.000Z",
++ "updated_at": "2026-10-30T16:00:00.000Z"
++}
ddiff --git a/fixtures/actor.wait/valid/event-wait.json b/fixtures/actor.wait/valid/event-wait.json
nnew file mode 100644
iindex 00000000..1a035fbd
---- /dev/null
++++ b/fixtures/actor.wait/valid/event-wait.json
@@@ -0,0 +1,14 @@
++{
++ "id": "wai_01K6R3A1B2C3D4E5F6G7H8J9KA",
++ "task_id": "tsk_01K6R3A1B2C3D4E5F6G7H8J9KB",
++ "requester": "user:usr_01K6R2Z8C4V7M9Q3T5W1X2Y3Z4",
++ "kind": "event",
++ "until": { "topic": "codes.task.succeeded", "from": "2026-10-30T16:00:00.000Z" },
++ "filter": { "payload.repo": "OpenVibers/OpenVibe.Actor", "subject.id": "usr_01K6R2Z8C4V7M9Q3T5W1X2Y3Z4" },
++ "deadline_at": "2026-10-30T22:00:00.000Z",
++ "on_timeout": "ask",
++ "line": "waiting for your Codes task on OpenVibers/OpenVibe.Actor to finish",
++ "status": "waiting",
++ "created_at": "2026-10-30T16:00:00.000Z",
++ "updated_at": "2026-10-30T16:00:00.000Z"
++}
ddiff --git a/fixtures/actor.wait/valid/woken-by-a-person.json b/fixtures/actor.wait/valid/woken-by-a-person.json
nnew file mode 100644
iindex 00000000..0cc4cd8d
---- /dev/null
++++ b/fixtures/actor.wait/valid/woken-by-a-person.json
@@@ -0,0 +1,16 @@
++{
++ "id": "wai_01K6R3A1B2C3D4E5F6G7H8J9KC",
++ "task_id": "tsk_01K6R3A1B2C3D4E5F6G7H8J9KB",
++ "requester": "user:usr_01K6R2Z8C4V7M9Q3T5W1X2Y3Z4",
++ "kind": "event",
++ "until": { "topic": "run.job.succeeded" },
++ "filter": { "payload.job_id": "job_01K6R3A1B2C3D4E5F6G7H8J9KD" },
++ "deadline_at": "2026-10-30T22:00:00.000Z",
++ "on_timeout": "fail",
++ "line": "waiting for your run to finish",
++ "status": "woken",
++ "woken_by": { "event_id": "evt_01K6R3A1B2C3D4E5F6G7H8J9KE", "event_type": "run.job.succeeded", "at": "2026-10-30T16:12:00.000Z", "by": "person" },
++ "created_at": "2026-10-30T16:00:00.000Z",
++ "updated_at": "2026-10-30T16:12:00.000Z",
++ "finished_at": "2026-10-30T16:12:00.000Z"
++}
ddiff --git a/generated/json-schema/bundle.json b/generated/json-schema/bundle.json
iindex 5e83a124..665a53d8 100644
---- a/generated/json-schema/bundle.json
++++ b/generated/json-schema/bundle.json
@@@ -79742,6 +79742,210 @@
}
}
},
++ "actor.wait": {
++ "version": "1.0.0",
++ "owner": "actor",
++ "status": "active",
++ "schema": {
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/actor/wait.v1.json",
++ "title": "ActorWait",
++ "description": "actor.wait@1: one wait (plan A2, Watch mode): the task and the step it belongs to, whose it is, what wakes it (until), the deadline, what happens when nothing comes (on_timeout) and the short line the person reads. A wait is a record, not a running loop: while a task waits, no model runs, its desk is released and its budget clock stops. The event that woke it is untrusted input: woken_by names the event, never its payload.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "id",
++ "task_id",
++ "requester",
++ "kind",
++ "until",
++ "deadline_at",
++ "on_timeout",
++ "line",
++ "status",
++ "created_at",
++ "updated_at"
++ ],
++ "properties": {
++ "id": {
++ "type": "string",
++ "pattern": "^wai_[0-9A-HJKMNP-TV-Z]{26}$"
++ },
++ "task_id": {
++ "type": "string",
++ "pattern": "^tsk_[0-9A-HJKMNP-TV-Z]{26}$"
++ },
++ "requester": {
++ "type": "string",
++ "pattern": "^(user|app|agent|service):[a-z]+_[0-9A-HJKMNP-TV-Z]{26}$"
++ },
++ "kind": {
++ "type": "string",
++ "enum": [
++ "event",
++ "watch",
++ "time"
++ ]
++ },
++ "until": {
++ "$ref": "#/$defs/until"
++ },
++ "filter": {
++ "type": "object",
++ "description": "The bounded matcher: a path (payload.a.b, subject.id, subject.type, actor.id, trace_id) and the value (or one of the values) the event must carry there. At most eight clauses; a filter is a matcher, not a query.",
++ "maxProperties": 8,
++ "additionalProperties": {
++ "anyOf": [
++ {
++ "type": "string",
++ "maxLength": 200
++ },
++ {
++ "type": "number"
++ },
++ {
++ "type": "boolean"
++ },
++ {
++ "type": "array",
++ "maxItems": 12,
++ "items": {
++ "type": [
++ "string",
++ "number",
++ "boolean"
++ ]
++ }
++ }
++ ]
++ }
++ },
++ "deadline_at": {
++ "type": "string",
++ "format": "date-time"
++ },
++ "on_timeout": {
++ "type": "string",
++ "enum": [
++ "ask",
++ "retry",
++ "fail"
++ ]
++ },
++ "line": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 200
++ },
++ "status": {
++ "type": "string",
++ "enum": [
++ "waiting",
++ "woken",
++ "timed_out",
++ "cancelled",
++ "failed"
++ ]
++ },
++ "woken_by": {
++ "$ref": "#/$defs/wokenBy"
++ },
++ "created_at": {
++ "type": "string",
++ "format": "date-time"
++ },
++ "updated_at": {
++ "type": "string",
++ "format": "date-time"
++ },
++ "finished_at": {
++ "type": "string",
++ "format": "date-time"
++ }
++ },
++ "$defs": {
++ "until": {
++ "description": "What wakes the wait: an Events topic (plus the earliest event it may match), a Watch target, or a time.",
++ "oneOf": [
++ {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "topic"
++ ],
++ "properties": {
++ "topic": {
++ "type": "string",
++ "pattern": "^[a-z0-9_]+(\\.[a-z0-9_*]+)+$",
++ "maxLength": 200
++ },
++ "from": {
++ "type": "string",
++ "format": "date-time"
++ }
++ }
++ },
++ {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "watch_id"
++ ],
++ "properties": {
++ "watch_id": {
++ "type": "string",
++ "pattern": "^wch_[0-9A-HJKMNP-TV-Z]{26}$"
++ }
++ }
++ },
++ {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "at"
++ ],
++ "properties": {
++ "at": {
++ "type": "string",
++ "format": "date-time"
++ }
++ }
++ }
++ ]
++ },
++ "wokenBy": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "event_id",
++ "event_type",
++ "at"
++ ],
++ "properties": {
++ "event_id": {
++ "type": "string",
++ "maxLength": 128
++ },
++ "event_type": {
++ "type": "string",
++ "maxLength": 200
++ },
++ "at": {
++ "type": "string",
++ "format": "date-time"
++ },
++ "by": {
++ "type": "string",
++ "enum": [
++ "event",
++ "person"
++ ]
++ }
++ }
++ }
++ }
++ }
++ },
"food.pantry-request": {
"version": "1.0.0",
"owner": "food",
ddiff --git a/generated/openapi/actor.json b/generated/openapi/actor.json
iindex 44aa17b6..cc26b7e3 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.253.0",
-- "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.253.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.254.0",
++ "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.254.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/ai.json b/generated/openapi/ai.json
iindex 6d3a1acc..c4cf3b0e 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.253.0",
-- "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.253.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.254.0",
++ "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.254.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/bench.json b/generated/openapi/bench.json
iindex 764d20fa..d10b1f86 100644
---- a/generated/openapi/bench.json
++++ b/generated/openapi/bench.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Bench API",
-- "version": "0.253.0",
-- "description": "Routes of OpenVibe.Bench as the OpenVibe contracts describe them (openvibe-contracts 0.253.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.254.0",
++ "description": "Routes of OpenVibe.Bench as the OpenVibe contracts describe them (openvibe-contracts 0.254.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/billing.json b/generated/openapi/billing.json
iindex 7fc1e56e..5d70f8d6 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.253.0",
-- "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.253.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.254.0",
++ "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.254.0): each operation lists the capabilities it performs; a token for the 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 4a40bad6..b4772739 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.253.0",
-- "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.253.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.254.0",
++ "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.254.0): each operation lists the capabilities it performs; a token for the 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 1bc0b29e..561e84ab 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.253.0",
-- "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.253.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.254.0",
++ "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.254.0): each operation lists the capabilities it performs; a token for the 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 c52a0b5c..5db66132 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.253.0",
-- "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.253.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.254.0",
++ "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.254.0): each operation lists the capabilities it performs; a token for the 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 8bfa9143..c5ec0bf7 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.253.0",
-- "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.253.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.254.0",
++ "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.254.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/community.json b/generated/openapi/community.json
iindex 82cd99b1..5643f131 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.253.0",
-- "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.253.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.254.0",
++ "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.254.0): each operation lists the capabilities it performs; a token for the 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 e8dc4752..84464ce4 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.253.0",
-- "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.253.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.254.0",
++ "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.254.0): each operation lists the capabilities it performs; a token for the 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 718c0c34..bea3ad3b 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.253.0",
-- "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.253.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.254.0",
++ "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.254.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/domains.json b/generated/openapi/domains.json
iindex 2a031870..1366b566 100644
---- a/generated/openapi/domains.json
++++ b/generated/openapi/domains.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Domains API",
-- "version": "0.253.0",
-- "description": "Routes of OpenVibe.Domains as the OpenVibe contracts describe them (openvibe-contracts 0.253.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.254.0",
++ "description": "Routes of OpenVibe.Domains as the OpenVibe contracts describe them (openvibe-contracts 0.254.0): each operation lists the capabilities it performs; a token for the 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 01242c51..d4477ad7 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.253.0",
-- "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.253.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.254.0",
++ "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.254.0): each operation lists the capabilities it performs; a token for the 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 24b3359d..144692f9 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.253.0",
-- "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.253.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.254.0",
++ "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.254.0): each operation lists the capabilities it performs; a token for the 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 77cc6ed9..7915b26d 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.253.0",
-- "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.253.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.254.0",
++ "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.254.0): each operation lists the capabilities it performs; a token for the 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 fc17cee6..53c24b79 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.253.0",
-- "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.253.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.254.0",
++ "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.254.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/inventory.json b/generated/openapi/inventory.json
iindex 9b8444fd..39710d3c 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.253.0",
-- "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.253.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.254.0",
++ "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.254.0): each operation lists the capabilities it performs; a token for the 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 f0c790e8..f43cf5ed 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.253.0",
-- "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.253.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.254.0",
++ "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.254.0): each operation lists the capabilities it performs; a token for the 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 92995ab1..090b19af 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.253.0",
-- "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.253.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.254.0",
++ "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.254.0): each operation lists the capabilities it performs; a token for the 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 533b87d7..d610295a 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.253.0",
-- "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.253.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.254.0",
++ "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.254.0): each operation lists the capabilities it performs; a token for the 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 d8006213..d2879203 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.253.0",
-- "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.253.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.254.0",
++ "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.254.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/news.json b/generated/openapi/news.json
iindex 16983b9f..9fec008d 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.253.0",
-- "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.253.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.254.0",
++ "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.254.0): each operation lists the capabilities it performs; a token for the 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 a9dd36a6..16229d55 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.253.0",
-- "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.253.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.254.0",
++ "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.254.0): each operation lists the capabilities it performs; a token for the 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 8f16b796..83ef360c 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.253.0",
-- "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.253.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.254.0",
++ "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.254.0): each operation lists the capabilities it performs; a token for the 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 be4c44c7..f8a3fd1b 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.253.0",
-- "description": "Routes of OpenVibe.Quest as the OpenVibe contracts describe them (openvibe-contracts 0.253.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.254.0",
++ "description": "Routes of OpenVibe.Quest as the OpenVibe contracts describe them (openvibe-contracts 0.254.0): each operation lists the capabilities it performs; a token for the 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 c1e46ffc..41344e1d 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.253.0",
-- "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.253.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.254.0",
++ "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.254.0): each operation lists the capabilities it performs; a token for the 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 cd6f647e..fe290815 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.253.0",
-- "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.253.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.254.0",
++ "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.254.0): each operation lists the capabilities it performs; a token for the 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 8b302569..73f7fb22 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.253.0",
-- "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.253.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.254.0",
++ "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.254.0): each operation lists the capabilities it performs; a token for the 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 0cfdafa5..51acbf91 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.253.0",
-- "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.253.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.254.0",
++ "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.254.0): each operation lists the capabilities it performs; a token for the 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 511891ab..fd499798 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.253.0",
-- "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.253.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.254.0",
++ "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.254.0): each operation lists the capabilities it performs; a token for the 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 b6b98395..dac11480 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.253.0",
-- "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.253.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.254.0",
++ "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.254.0): each operation lists the capabilities it performs; a token for the 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 53d25d15..74c1a737 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.253.0",
-- "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.253.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.254.0",
++ "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.254.0): each operation lists the capabilities it performs; a token for the 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 a017ab2f..47acc576 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.253.0",
-- "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.253.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.254.0",
++ "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.254.0): each operation lists the capabilities it performs; a token for the 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 8cdf5a9c..0901f6f9 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.253.0",
-- "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.253.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.254.0",
++ "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.254.0): each operation lists the capabilities it performs; a token for the 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 b18c5335..802e72d8 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.253.0",
-- "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.253.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.254.0",
++ "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.254.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/vision.json b/generated/openapi/vision.json
iindex 7d67f474..da5a6965 100644
---- a/generated/openapi/vision.json
++++ b/generated/openapi/vision.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Vision API",
-- "version": "0.253.0",
-- "description": "Routes of OpenVibe.Vision as the OpenVibe contracts describe them (openvibe-contracts 0.253.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.254.0",
++ "description": "Routes of OpenVibe.Vision as the OpenVibe contracts describe them (openvibe-contracts 0.254.0): each operation lists the capabilities it performs; a token for the 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 890db748..96bf4458 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.253.0",
-- "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.253.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.254.0",
++ "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.254.0): each operation lists the capabilities it performs; a token for the 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 abb1352e..fe9357a1 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.253.0",
-- "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.253.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.254.0",
++ "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.254.0): each operation lists the capabilities it performs; a token for the 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 9ae67c16..3ef63d7e 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.253.0",
-- "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.253.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.254.0",
++ "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.254.0): each operation lists the capabilities it performs; a token for the 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 edf40a28..2b6794b3 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.253.0",
-- "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.253.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.254.0",
++ "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.254.0): each operation lists the capabilities it performs; a token for the 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 c93a1c5d..6b12a219 100644
---- a/generated/typescript/index.d.ts
++++ b/generated/typescript/index.d.ts
@@@ -257291,6 +257291,145 @@ export interface ActorAgentListResult {
/** [email protected] (owner: actor) */
++/** [email protected] (owner: actor) */
++/**
++ * actor.wait@1: one wait (plan A2, Watch mode): the task and the step it belongs to, whose it is, what wakes it (until), the deadline, what happens when nothing comes (on_timeout) and the short line the person reads. A wait is a record, not a running loop: while a task waits, no model runs, its desk is released and its budget clock stops. The event that woke it is untrusted input: woken_by names the event, never its payload.
++ */
++export interface ActorWait {
++ id: string;
++ task_id: string;
++ requester: string;
++ kind: "event" | "watch" | "time";
++ /**
++ * What wakes the wait: an Events topic (plus the earliest event it may match), a Watch target, or a time.
++ */
++ until:
++ | {
++ topic: string;
++ from?: string;
++ }
++ | {
++ watch_id: string;
++ }
++ | {
++ at: string;
++ };
++ /**
++ * The bounded matcher: a path (payload.a.b, subject.id, subject.type, actor.id, trace_id) and the value (or one of the values) the event must carry there. At most eight clauses; a filter is a matcher, not a query.
++ */
++ filter?: {
++ [k: string]:
++ | (
++ | string
++ | number
++ | boolean
++ | []
++ | [string | number | boolean]
++ | [string | number | boolean, string | number | boolean]
++ | [string | number | boolean, string | number | boolean, string | number | boolean]
++ | [string | number | boolean, string | number | boolean, string | number | boolean, string | number | boolean]
++ | [
++ string | number | boolean,
++ string | number | boolean,
++ string | number | boolean,
++ string | number | boolean,
++ string | number | boolean
++ ]
++ | [
++ string | number | boolean,
++ string | number | boolean,
++ string | number | boolean,
++ string | number | boolean,
++ string | number | boolean,
++ string | number | boolean
++ ]
++ | [
++ string | number | boolean,
++ string | number | boolean,
++ string | number | boolean,
++ string | number | boolean,
++ string | number | boolean,
++ string | number | boolean,
++ string | number | boolean
++ ]
++ | [
++ string | number | boolean,
++ string | number | boolean,
++ string | number | boolean,
++ string | number | boolean,
++ string | number | boolean,
++ string | number | boolean,
++ string | number | boolean,
++ string | number | boolean
++ ]
++ | [
++ string | number | boolean,
++ string | number | boolean,
++ string | number | boolean,
++ string | number | boolean,
++ string | number | boolean,
++ string | number | boolean,
++ string | number | boolean,
++ string | number | boolean,
++ string | number | boolean
++ ]
++ | [
++ string | number | boolean,
++ string | number | boolean,
++ string | number | boolean,
++ string | number | boolean,
++ string | number | boolean,
++ string | number | boolean,
++ string | number | boolean,
++ string | number | boolean,
++ string | number | boolean,
++ string | number | boolean
++ ]
++ | [
++ string | number | boolean,
++ string | number | boolean,
++ string | number | boolean,
++ string | number | boolean,
++ string | number | boolean,
++ string | number | boolean,
++ string | number | boolean,
++ string | number | boolean,
++ string | number | boolean,
++ string | number | boolean,
++ string | number | boolean
++ ]
++ | [
++ string | number | boolean,
++ string | number | boolean,
++ string | number | boolean,
++ string | number | boolean,
++ string | number | boolean,
++ string | number | boolean,
++ string | number | boolean,
++ string | number | boolean,
++ string | number | boolean,
++ string | number | boolean,
++ string | number | boolean,
++ string | number | boolean
++ ]
++ )
++ | undefined;
++ };
++ deadline_at: string;
++ on_timeout: "ask" | "retry" | "fail";
++ line: string;
++ status: "waiting" | "woken" | "timed_out" | "cancelled" | "failed";
++ woken_by?: {
++ event_id: string;
++ event_type: string;
++ at: string;
++ by?: "event" | "person";
++ };
++ created_at: string;
++ updated_at: string;
++ finished_at?: string;
++}
++
/** [email protected] (owner: food) */
/**
* food.pantry-request@1: PUT /api/v1/pantry on OpenVibe.Food replaces the pantry with exactly these food slugs.
ddiff --git a/lib/ids.js b/lib/ids.js
iindex d842ea8e..d4200572 100644
---- a/lib/ids.js
++++ b/lib/ids.js
@@@ -6,7 +6,7 @@
const crypto = require('crypto');
const ALPHABET = '0123456789ABCDEFGHJKMNPQRSTVWXYZ';
--const PREFIX = { user: 'usr', guest: 'gst', app: 'app', mod: 'mod', agent: 'agt', node: 'nod', event: 'evt', media: 'med', project: 'prj', confirmation: 'cnf', job: 'job', task: 'tsk', watch: 'wch', observation: 'wco', check: 'ckr', subscription: 'sub', deploy: 'dpl', domain: 'dom', manifest: 'mfs', release: 'rel', site: 'sit', robot: 'rob', stream: 'std', webhook_delivery: 'whd' };
++const PREFIX = { user: 'usr', guest: 'gst', app: 'app', mod: 'mod', agent: 'agt', node: 'nod', event: 'evt', media: 'med', project: 'prj', confirmation: 'cnf', job: 'job', task: 'tsk', watch: 'wch', wait: 'wai', observation: 'wco', check: 'ckr', subscription: 'sub', deploy: 'dpl', domain: 'dom', manifest: 'mfs', release: 'rel', site: 'sit', robot: 'rob', stream: 'std', webhook_delivery: 'whd' };
const SLUG_TYPES = new Set(['service', 'system']);
const ULID_RE = /^[0-9A-HJKMNP-TV-Z]{26}$/;
const SLUG_RE = /^[a-z][a-z0-9-]{1,39}$/;
ddiff --git a/package.json b/package.json
iindex 1f9877fc..ce9c5bbd 100644
---- a/package.json
++++ b/package.json
@@@ -1,6 +1,6 @@
{
"name": "openvibe-contracts",
-- "version": "0.253.0",
++ "version": "0.254.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",
ddiff --git a/test/actor-wait.test.js b/test/actor-wait.test.js
nnew file mode 100644
iindex 00000000..16182acf
---- /dev/null
++++ b/test/actor-wait.test.js
@@@ -0,0 +1,52 @@
++'use strict';
++// actor.wait@1 (plan A2): a wait is a record, not a running loop. The schema is the record's shape; the
++// rules the schema cannot say are checked here: one kind of "until", a bounded matcher, a line the person
++// can read, and an id of the wait's own kind.
++const assert = require('assert');
++const fs = require('fs');
++const path = require('path');
++const c = require('..');
++
++const ROOT = path.join(__dirname, '..');
++const fx = (kind, f) => JSON.parse(fs.readFileSync(path.join(ROOT, 'fixtures', 'actor.wait', kind, f), 'utf8'));
++
++const wait = fx('valid', 'event-wait.json');
++const r = c.validate('actor.wait@1', wait);
++assert.ok(r.valid, 'a wait validates: ' + JSON.stringify(r.errors));
++assert.ok(c.validate('actor.wait', wait).valid, 'the bare id resolves to the newest major');
++
++// The id a wait carries is its own kind, and the contract says so.
++assert.match(c.ids.newId('wait'), /^wai_[0-9A-HJKMNP-TV-Z]{26}$/, 'a wait id is wai_<ULID>');
++assert.match(wait.id, /^wai_/, 'the fixture id is a wait id');
++
++// One kind of "until": a topic, a Watch target or a time — never two.
++assert.ok(c.validate('actor.wait@1', { ...wait, until: { topic: 'codes.task.*' } }).valid, 'a topic waits');
++assert.ok(c.validate('actor.wait@1', { ...wait, until: { watch_id: 'wch_01K6R3A1B2C3D4E5F6G7H8J9KF' } }).valid, 'a watch waits');
++assert.ok(c.validate('actor.wait@1', { ...wait, until: { at: '2026-10-30T22:00:00.000Z' } }).valid, 'a time waits');
++assert.ok(!c.validate('actor.wait@1', { ...wait, until: { topic: 'codes.task.*', at: '2026-10-30T22:00:00.000Z' } }).valid, 'two kinds of until is refused');
++
++// The matcher is a matcher, not a query.
++const nine = {};
++for (let i = 0; i < 9; i++) nine['payload.k' + i] = 'v';
++assert.ok(!c.validate('actor.wait@1', { ...wait, filter: nine }).valid, 'at most eight filter clauses');
++assert.ok(c.validate('actor.wait@1', { ...wait, filter: { 'payload.repo': 'OpenVibers/OpenVibe.Actor' } }).valid, 'one clause is fine');
++assert.ok(!c.validate('actor.wait@1', { ...wait, filter: { 'payload.repo': { nested: true } } }).valid, 'a clause is a plain value');
++assert.ok(c.validate('actor.wait@1', { ...wait, filter: { 'payload.state': ['succeeded', 'failed', 'cancelled'] } }).valid, 'a list of values means one of them');
++assert.ok(!c.validate('actor.wait@1', { ...wait, filter: { 'payload.state': ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm'] } }).valid, 'a list of values is bounded too');
++
++// The person reads the line: it is there, and it is short.
++assert.ok(!c.validate('actor.wait@1', { ...wait, line: '' }).valid, 'an empty line is refused');
++assert.ok(!c.validate('actor.wait@1', { ...wait, line: 'x'.repeat(201) }).valid, 'a line longer than 200 characters is refused');
++
++// The record never carries the event's payload: only the event that woke it.
++assert.ok(!('payload' in wait), 'the fixture carries no payload');
++assert.ok(c.validate('actor.wait@1', { ...wait, woken_by: { event_id: 'evt_1', event_type: 'codes.task.succeeded', at: '2026-10-30T16:12:00.000Z' } }).valid, 'woken_by names the event');
++assert.ok(!c.validate('actor.wait@1', { ...wait, woken_by: { event_id: 'evt_1', event_type: 'codes.task.succeeded', at: '2026-10-30T16:12:00.000Z', payload: { text: 'hi' } } }).valid, 'woken_by never carries a payload');
++
++// The fixtures the catalog gate reads are the ones this file checks.
++for (const f of ['no-line.json', 'two-kinds-of-until.json']) {
++ const bad = fx('invalid', f);
++ assert.ok(!c.validate('actor.wait@1', bad).valid, 'the invalid fixture ' + f + ' is refused');
++}
++
++console.log('actor.wait@1: the wait record validates');
ddiff --git a/test/run.js b/test/run.js
iindex bcf9d96d..ce9c653c 100644
---- a/test/run.js
++++ b/test/run.js
@@@ -926,6 +926,8 @@ sub(path.join(__dirname, 'zones.test.js'));
sub(path.join(__dirname, 'usage-topics.test.js'));
sub(path.join(__dirname, 'billing-grace.test.js'));
sub(path.join(__dirname, 'resources.test.js'));
++// The wait record (plan A2): a wait is a record, not a running loop.
++sub(path.join(__dirname, 'actor-wait.test.js'));
// Documentation currency (roadmap WS-U task 3): a placeholder service with no repository yet is skipped, not a gap.
sub(path.join(__dirname, 'docs-currency.test.js'));