openvibers/openvibe.contracts Commits
0.254.0: actor.wait@1 — the wait record (plan A2, Watch mode) (#262)
Changes
@@@ -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,nnew file mode 100644@@@ -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"++ ]++ }++ }++ }++ }++}@@@ -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",nnew file mode 100644@@@ -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"++}nnew file mode 100644@@@ -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"++}nnew file mode 100644@@@ -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"++}nnew file mode 100644@@@ -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"++}@@@ -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",@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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.@@@ -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}$/;@@@ -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",nnew file mode 100644@@@ -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');@@@ -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'));
@@ -1,5 +1,14 @@
@@ -1,5 +1,14 @@
# Changelog
# 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
## 0.253.0 — 2026-10-30
- **A2A for OpenVibe.Actor** (Actor v2 stage V2-11). New capability `actor.a2a.task` (owner `actor`, active,
- **A2A for OpenVibe.Actor** (Actor v2 stage V2-11). New capability `actor.a2a.task` (owner `actor`, active,
new file mode 100644
new file mode 100644
@@ -0,0 +1,199 @@
@@ -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"
+ ]
+ }
+ }
+ }
+ }
+}
@@ -6820,6 +6820,16 @@
@@ -6820,6 +6820,16 @@
"status": "active",
"status": "active",
"adr": "ADR-044"
"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",
"id": "food.pantry-request",
"version": "1.0.0",
"version": "1.0.0",
new file mode 100644
new file mode 100644
@@ -0,0 +1,12 @@
@@ -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"
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,13 @@
@@ -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"
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,14 @@
@@ -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"
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,16 @@
@@ -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"
+}
@@ -79742,6 +79742,210 @@
@@ -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": {
"food.pantry-request": {
"version": "1.0.0",
"version": "1.0.0",
"owner": "food",
"owner": "food",
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Actor API",
"title": "OpenVibe.Actor API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.AI API",
"title": "OpenVibe.AI API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Bench API",
"title": "OpenVibe.Bench API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Billing API",
"title": "OpenVibe.Billing API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Blog API",
"title": "OpenVibe.Blog API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Bot API",
"title": "OpenVibe.Bot API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Chat API",
"title": "OpenVibe.Chat API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Codes API",
"title": "OpenVibe.Codes API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Community API",
"title": "OpenVibe.Community API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Coupons API",
"title": "OpenVibe.Coupons API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Deals API",
"title": "OpenVibe.Deals API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Domains API",
"title": "OpenVibe.Domains API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Events API",
"title": "OpenVibe.Events API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Food API",
"title": "OpenVibe.Food API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Games API",
"title": "OpenVibe.Games API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Host API",
"title": "OpenVibe.Host API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Inventory API",
"title": "OpenVibe.Inventory API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Live API",
"title": "OpenVibe.Live API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.MediaHub API",
"title": "OpenVibe.MediaHub API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Media API",
"title": "OpenVibe.Media API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Network API",
"title": "OpenVibe.Network API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.News API",
"title": "OpenVibe.News API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenRestream API",
"title": "OpenRestream API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Play API",
"title": "OpenVibe.Play API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Quest API",
"title": "OpenVibe.Quest API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Reviews API",
"title": "OpenVibe.Reviews API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Run API",
"title": "OpenVibe.Run API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Search API",
"title": "OpenVibe.Search API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Services API",
"title": "OpenVibe.Services API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Sources API",
"title": "OpenVibe.Sources API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Space API",
"title": "OpenVibe.Space API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Tips API",
"title": "OpenVibe.Tips API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Tools API",
"title": "OpenVibe.Tools API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Trade API",
"title": "OpenVibe.Trade API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.VIP API",
"title": "OpenVibe.VIP API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Vision API",
"title": "OpenVibe.Vision API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Watch API",
"title": "OpenVibe.Watch API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Wiki API",
"title": "OpenVibe.Wiki API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Work API",
"title": "OpenVibe.Work API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Zone API",
"title": "OpenVibe.Zone API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -257291,6 +257291,145 @@ export interface ActorAgentListResult {
@@ -257291,6 +257291,145 @@ export interface ActorAgentListResult {
/** [email protected] (owner: actor) */
/** [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) */
/** [email protected] (owner: food) */
/**
/**
* food.pantry-request@1: PUT /api/v1/pantry on OpenVibe.Food replaces the pantry with exactly these food slugs.
* food.pantry-request@1: PUT /api/v1/pantry on OpenVibe.Food replaces the pantry with exactly these food slugs.
@@ -6,7 +6,7 @@
@@ -6,7 +6,7 @@
const crypto = require('crypto');
const crypto = require('crypto');
const ALPHABET = '0123456789ABCDEFGHJKMNPQRSTVWXYZ';
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 SLUG_TYPES = new Set(['service', 'system']);
const ULID_RE = /^[0-9A-HJKMNP-TV-Z]{26}$/;
const ULID_RE = /^[0-9A-HJKMNP-TV-Z]{26}$/;
const SLUG_RE = /^[a-z][a-z0-9-]{1,39}$/;
const SLUG_RE = /^[a-z][a-z0-9-]{1,39}$/;
@@ -1,6 +1,6 @@
@@ -1,6 +1,6 @@
{
{
"name": "openvibe-contracts",
"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.",
"description": "Machine-readable contracts for the OpenVibe network: schemas, manifests, ids, error envelope, capability checks.",
"main": "index.js",
"main": "index.js",
"types": "generated/typescript/index.d.ts",
"types": "generated/typescript/index.d.ts",
new file mode 100644
new file mode 100644
@@ -0,0 +1,52 @@
@@ -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');
@@ -926,6 +926,8 @@ sub(path.join(__dirname, 'zones.test.js'));
@@ -926,6 +926,8 @@ sub(path.join(__dirname, 'zones.test.js'));
sub(path.join(__dirname, 'usage-topics.test.js'));
sub(path.join(__dirname, 'usage-topics.test.js'));
sub(path.join(__dirname, 'billing-grace.test.js'));
sub(path.join(__dirname, 'billing-grace.test.js'));
sub(path.join(__dirname, 'resources.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.
// 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'));
sub(path.join(__dirname, 'docs-currency.test.js'));