openvibers/openvibe.contracts Commits

Define machine access and agent relay contracts (0.409.0) (#454)

OP OpenVibers committed 2 days ago · dbe36ca23f · 94 files, +4336 −106

* Define machine access and agent relay contracts

* Reserve Contracts 0.409.0 after concurrent release

* Merge remote-tracking branch 'origin/main' into machine-access-agents-contracts

# Conflicts:
#	CHANGELOG.md
#	generated/openapi/actor.json
#	generated/openapi/ai.json
#	generated/openapi/bench.json
#	generated/openapi/billing.json
#	generated/openapi/blog.json
#	generated/openapi/bot.json
#	generated/openapi/chat.json
#	generated/openapi/codes.json
#	generated/openapi/community.json
#	generated/openapi/connect.json
#	generated/openapi/coupons.json
#	generated/openapi/deals.json
#	generated/openapi/design.json
#	generated/openapi/domains.json
#	generated/openapi/events.json
#	generated/openapi/exchange.json
#	generated/openapi/food.json
#	generated/openapi/games.json
#	generated/openapi/git.json
#	generated/openapi/host.json
#	generated/openapi/inventory.json
#	generated/openapi/live.json
#	generated/openapi/mail.json
#	generated/openapi/media-hub.json
#	generated/openapi/media.json
#	generated/openapi/network.json
#	generated/openapi/news.json
#	generated/openapi/openre.json
#	generated/openapi/play.json
#	generated/openapi/quest.json
#	generated/openapi/report.json
#	generated/openapi/reviews.json
#	generated/openapi/run.json
#	generated/openapi/search.json
#	generated/openapi/services.json
#	generated/openapi/sources.json
#	generated/openapi/space.json
#	generated/openapi/tips.json
#	generated/openapi/today.json
#	generated/openapi/tools.json
#	generated/openapi/trade.json
#	generated/openapi/vip.json
#	generated/openapi/vision.json
#	generated/openapi/watch.json
#	generated/openapi/wiki.json
#	generated/openapi/work.json
#	generated/openapi/zone.json
#	package-lock.json
#	package.json

Changes

ddiff --git a/CHANGELOG.md b/CHANGELOG.md
iindex 74a7ff5e..62628dc5 100644
---- a/CHANGELOG.md
++++ b/CHANGELOG.md
@@@ -1,5 +1,9 @@
# Changelog
++## 0.409.0 — 2026-11-11
++
++- Define machine access requests, grants and signed token claims; the agent directory, A2A tasks and results; five Network events and four registration and relay capabilities.
++
## 0.408.0 — 2026-11-11
The rest of the 0.407.0 train. v0.407.0 was tagged at #451's merge, before the train merged, so the tag holds #451
ddiff --git a/contracts/agent/directory-entry.v1.json b/contracts/agent/directory-entry.v1.json
nnew file mode 100644
iindex 00000000..0fa72a4f
---- /dev/null
++++ b/contracts/agent/directory-entry.v1.json
@@@ -0,0 +1,76 @@
++{
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/agent/directory-entry.v1.json",
++ "title": "AgentDirectoryEntry",
++ "description": "One discoverable A2A agent belonging to a person.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "id",
++ "owner",
++ "kind",
++ "name",
++ "skills",
++ "status",
++ "allow_others",
++ "updated_at"
++ ],
++ "properties": {
++ "id": {
++ "type": "string",
++ "pattern": "^agt_[0-9A-HJKMNP-TV-Z]{26}$"
++ },
++ "owner": {
++ "type": "string",
++ "pattern": "^usr_[0-9A-HJKMNP-TV-Z]{26}$"
++ },
++ "kind": {
++ "enum": [
++ "actor",
++ "codes",
++ "link-local",
++ "chat-bot",
++ "service"
++ ]
++ },
++ "name": {
++ "type": "string",
++ "maxLength": 120
++ },
++ "machine_id": {
++ "type": "string",
++ "pattern": "^lnk_[0-9A-HJKMNP-TV-Z]{26}$"
++ },
++ "service": {
++ "type": "string",
++ "maxLength": 60
++ },
++ "endpoint": {
++ "type": "string",
++ "format": "uri",
++ "pattern": "^https://"
++ },
++ "skills": {
++ "type": "array",
++ "items": {
++ "type": "string",
++ "maxLength": 120
++ },
++ "maxItems": 100
++ },
++ "status": {
++ "enum": [
++ "online",
++ "busy",
++ "offline"
++ ]
++ },
++ "allow_others": {
++ "type": "boolean"
++ },
++ "updated_at": {
++ "type": "string",
++ "format": "date-time"
++ }
++ }
++}
ddiff --git a/contracts/agent/task-result.v1.json b/contracts/agent/task-result.v1.json
nnew file mode 100644
iindex 00000000..ac28cda3
---- /dev/null
++++ b/contracts/agent/task-result.v1.json
@@@ -0,0 +1,78 @@
++{
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/agent/task-result.v1.json",
++ "title": "AgentTaskResult",
++ "description": "Asynchronous A2A task status and optional result.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "id",
++ "thread",
++ "status",
++ "updated_at"
++ ],
++ "properties": {
++ "id": {
++ "type": "string",
++ "pattern": "^[a-z]{3}_[A-Za-z0-9_-]{8,80}$"
++ },
++ "thread": {
++ "type": "string",
++ "pattern": "^[a-z]{3}_[A-Za-z0-9_-]{8,80}$"
++ },
++ "status": {
++ "enum": [
++ "pending",
++ "running",
++ "completed",
++ "failed",
++ "cancelled"
++ ]
++ },
++ "result": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "parts"
++ ],
++ "properties": {
++ "role": {
++ "enum": [
++ "user",
++ "agent"
++ ]
++ },
++ "parts": {
++ "type": "array",
++ "minItems": 1,
++ "maxItems": 20,
++ "items": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "type",
++ "text"
++ ],
++ "properties": {
++ "type": {
++ "const": "text"
++ },
++ "text": {
++ "type": "string",
++ "maxLength": 8000
++ }
++ }
++ }
++ }
++ }
++ },
++ "updated_at": {
++ "type": "string",
++ "format": "date-time"
++ },
++ "error": {
++ "type": "string",
++ "maxLength": 500
++ }
++ }
++}
ddiff --git a/contracts/agent/task.v1.json b/contracts/agent/task.v1.json
nnew file mode 100644
iindex 00000000..d64ea81e
---- /dev/null
++++ b/contracts/agent/task.v1.json
@@@ -0,0 +1,82 @@
++{
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/agent/task.v1.json",
++ "title": "AgentTask",
++ "description": "A2A task with agent, person, thread and text parts limited to 8000 characters.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "to",
++ "from",
++ "on_behalf_of",
++ "thread",
++ "message"
++ ],
++ "properties": {
++ "id": {
++ "type": "string",
++ "pattern": "^[a-z]{3}_[A-Za-z0-9_-]{8,80}$"
++ },
++ "to": {
++ "type": "string",
++ "pattern": "^agt_[0-9A-HJKMNP-TV-Z]{26}$"
++ },
++ "from": {
++ "type": "string",
++ "pattern": "^agt_[0-9A-HJKMNP-TV-Z]{26}$"
++ },
++ "on_behalf_of": {
++ "type": "string",
++ "pattern": "^usr_[0-9A-HJKMNP-TV-Z]{26}$"
++ },
++ "thread": {
++ "type": "string",
++ "pattern": "^[a-z]{3}_[A-Za-z0-9_-]{8,80}$"
++ },
++ "message": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "parts"
++ ],
++ "properties": {
++ "role": {
++ "enum": [
++ "user",
++ "agent"
++ ]
++ },
++ "parts": {
++ "type": "array",
++ "minItems": 1,
++ "maxItems": 20,
++ "items": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "type",
++ "text"
++ ],
++ "properties": {
++ "type": {
++ "const": "text"
++ },
++ "text": {
++ "type": "string",
++ "maxLength": 8000
++ }
++ }
++ }
++ }
++ }
++ },
++ "skillId": {
++ "type": "string",
++ "maxLength": 64
++ },
++ "created_at": {
++ "type": "string",
++ "format": "date-time"
++ }
++ }
++}
ddiff --git a/contracts/catalog.json b/contracts/catalog.json
iindex 68098323..8f63f39d 100644
---- a/contracts/catalog.json
++++ b/contracts/catalog.json
@@@ -11474,6 +11474,105 @@
"visibility": "public",
"compatibility": "backward",
"status": "active"
++ },
++ {
++ "id": "link.access-request",
++ "version": "1.0.0",
++ "owner": "network",
++ "schema": "link/access-request.v1.json",
++ "visibility": "first-party",
++ "compatibility": "backward",
++ "status": "active"
++ },
++ {
++ "id": "link.access-grant",
++ "version": "1.0.0",
++ "owner": "network",
++ "schema": "link/access-grant.v1.json",
++ "visibility": "first-party",
++ "compatibility": "backward",
++ "status": "active"
++ },
++ {
++ "id": "link.access-grant-token",
++ "version": "1.0.0",
++ "owner": "network",
++ "schema": "link/access-grant-token.v1.json",
++ "visibility": "first-party",
++ "compatibility": "backward",
++ "status": "active"
++ },
++ {
++ "id": "agent.directory-entry",
++ "version": "1.0.0",
++ "owner": "network",
++ "schema": "agent/directory-entry.v1.json",
++ "visibility": "first-party",
++ "compatibility": "backward",
++ "status": "active"
++ },
++ {
++ "id": "agent.task",
++ "version": "1.0.0",
++ "owner": "network",
++ "schema": "agent/task.v1.json",
++ "visibility": "first-party",
++ "compatibility": "backward",
++ "status": "active"
++ },
++ {
++ "id": "agent.task-result",
++ "version": "1.0.0",
++ "owner": "network",
++ "schema": "agent/task-result.v1.json",
++ "visibility": "first-party",
++ "compatibility": "backward",
++ "status": "active"
++ },
++ {
++ "id": "network.link.access.requested",
++ "version": "1.0.0",
++ "owner": "network",
++ "schema": "events/payloads/network.link.access.requested.v1.json",
++ "visibility": "first-party",
++ "compatibility": "backward",
++ "status": "active"
++ },
++ {
++ "id": "network.link.access.answered",
++ "version": "1.0.0",
++ "owner": "network",
++ "schema": "events/payloads/network.link.access.answered.v1.json",
++ "visibility": "first-party",
++ "compatibility": "backward",
++ "status": "active"
++ },
++ {
++ "id": "network.link.access.revoked",
++ "version": "1.0.0",
++ "owner": "network",
++ "schema": "events/payloads/network.link.access.revoked.v1.json",
++ "visibility": "first-party",
++ "compatibility": "backward",
++ "status": "active"
++ },
++ {
++ "id": "network.agent.task.created",
++ "version": "1.0.0",
++ "owner": "network",
++ "schema": "events/payloads/network.agent.task.created.v1.json",
++ "visibility": "first-party",
++ "compatibility": "backward",
++ "status": "active"
++ },
++ {
++ "id": "network.agent.task.updated",
++ "version": "1.0.0",
++ "owner": "network",
++ "schema": "events/payloads/network.agent.task.updated.v1.json",
++ "visibility": "first-party",
++ "compatibility": "backward",
++ "status": "active"
}
]
}
ddiff --git a/contracts/events/payloads/network.agent.task.created.v1.json b/contracts/events/payloads/network.agent.task.created.v1.json
nnew file mode 100644
iindex 00000000..0f0cbb4a
---- /dev/null
++++ b/contracts/events/payloads/network.agent.task.created.v1.json
@@@ -0,0 +1,37 @@
++{
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/events/payloads/network.agent.task.created.v1.json",
++ "title": "NetworkAgentTaskCreatedPayload",
++ "description": "Agent task was created.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "task_id",
++ "thread",
++ "from",
++ "to",
++ "at"
++ ],
++ "properties": {
++ "task_id": {
++ "type": "string",
++ "pattern": "^[a-z]{3}_[A-Za-z0-9_-]{8,80}$"
++ },
++ "thread": {
++ "type": "string",
++ "pattern": "^[a-z]{3}_[A-Za-z0-9_-]{8,80}$"
++ },
++ "from": {
++ "type": "string",
++ "pattern": "^agt_[0-9A-HJKMNP-TV-Z]{26}$"
++ },
++ "to": {
++ "type": "string",
++ "pattern": "^agt_[0-9A-HJKMNP-TV-Z]{26}$"
++ },
++ "at": {
++ "type": "string",
++ "format": "date-time"
++ }
++ }
++}
ddiff --git a/contracts/events/payloads/network.agent.task.updated.v1.json b/contracts/events/payloads/network.agent.task.updated.v1.json
nnew file mode 100644
iindex 00000000..d11467b9
---- /dev/null
++++ b/contracts/events/payloads/network.agent.task.updated.v1.json
@@@ -0,0 +1,37 @@
++{
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/events/payloads/network.agent.task.updated.v1.json",
++ "title": "NetworkAgentTaskUpdatedPayload",
++ "description": "Agent task status changed.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "task_id",
++ "thread",
++ "status",
++ "at"
++ ],
++ "properties": {
++ "task_id": {
++ "type": "string",
++ "pattern": "^[a-z]{3}_[A-Za-z0-9_-]{8,80}$"
++ },
++ "thread": {
++ "type": "string",
++ "pattern": "^[a-z]{3}_[A-Za-z0-9_-]{8,80}$"
++ },
++ "status": {
++ "enum": [
++ "pending",
++ "running",
++ "completed",
++ "failed",
++ "cancelled"
++ ]
++ },
++ "at": {
++ "type": "string",
++ "format": "date-time"
++ }
++ }
++}
ddiff --git a/contracts/events/payloads/network.link.access.answered.v1.json b/contracts/events/payloads/network.link.access.answered.v1.json
nnew file mode 100644
iindex 00000000..749d59e7
---- /dev/null
++++ b/contracts/events/payloads/network.link.access.answered.v1.json
@@@ -0,0 +1,34 @@
++{
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/events/payloads/network.link.access.answered.v1.json",
++ "title": "NetworkLinkAccessAnsweredPayload",
++ "description": "Machine access request was answered or expired.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "request_id",
++ "status",
++ "at"
++ ],
++ "properties": {
++ "request_id": {
++ "type": "string",
++ "pattern": "^[a-z]{3}_[A-Za-z0-9_-]{8,80}$"
++ },
++ "status": {
++ "enum": [
++ "approved",
++ "denied",
++ "expired"
++ ]
++ },
++ "grant_id": {
++ "type": "string",
++ "pattern": "^[a-z]{3}_[A-Za-z0-9_-]{8,80}$"
++ },
++ "at": {
++ "type": "string",
++ "format": "date-time"
++ }
++ }
++}
ddiff --git a/contracts/events/payloads/network.link.access.requested.v1.json b/contracts/events/payloads/network.link.access.requested.v1.json
nnew file mode 100644
iindex 00000000..e4ccbf79
---- /dev/null
++++ b/contracts/events/payloads/network.link.access.requested.v1.json
@@@ -0,0 +1,32 @@
++{
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/events/payloads/network.link.access.requested.v1.json",
++ "title": "NetworkLinkAccessRequestedPayload",
++ "description": "Machine access request was created.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "request_id",
++ "from_principal",
++ "to_principal",
++ "at"
++ ],
++ "properties": {
++ "request_id": {
++ "type": "string",
++ "pattern": "^[a-z]{3}_[A-Za-z0-9_-]{8,80}$"
++ },
++ "from_principal": {
++ "type": "string",
++ "pattern": "^lnk_[0-9A-HJKMNP-TV-Z]{26}$"
++ },
++ "to_principal": {
++ "type": "string",
++ "pattern": "^lnk_[0-9A-HJKMNP-TV-Z]{26}$"
++ },
++ "at": {
++ "type": "string",
++ "format": "date-time"
++ }
++ }
++}
ddiff --git a/contracts/events/payloads/network.link.access.revoked.v1.json b/contracts/events/payloads/network.link.access.revoked.v1.json
nnew file mode 100644
iindex 00000000..86105369
---- /dev/null
++++ b/contracts/events/payloads/network.link.access.revoked.v1.json
@@@ -0,0 +1,32 @@
++{
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/events/payloads/network.link.access.revoked.v1.json",
++ "title": "NetworkLinkAccessRevokedPayload",
++ "description": "Machine access grant was revoked.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "grant_id",
++ "from_principal",
++ "to_principal",
++ "at"
++ ],
++ "properties": {
++ "grant_id": {
++ "type": "string",
++ "pattern": "^[a-z]{3}_[A-Za-z0-9_-]{8,80}$"
++ },
++ "from_principal": {
++ "type": "string",
++ "pattern": "^lnk_[0-9A-HJKMNP-TV-Z]{26}$"
++ },
++ "to_principal": {
++ "type": "string",
++ "pattern": "^lnk_[0-9A-HJKMNP-TV-Z]{26}$"
++ },
++ "at": {
++ "type": "string",
++ "format": "date-time"
++ }
++ }
++}
ddiff --git a/contracts/link/access-grant-token.v1.json b/contracts/link/access-grant-token.v1.json
nnew file mode 100644
iindex 00000000..02b77972
---- /dev/null
++++ b/contracts/link/access-grant-token.v1.json
@@@ -0,0 +1,60 @@
++{
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/link/access-grant-token.v1.json",
++ "title": "LinkAccessGrantToken",
++ "description": "Claims of the signed grant JWT; target is audience, requester is subject.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "iss",
++ "aud",
++ "sub",
++ "jti",
++ "grant_id",
++ "scopes",
++ "iat",
++ "exp"
++ ],
++ "properties": {
++ "iss": {
++ "type": "string"
++ },
++ "aud": {
++ "type": "string",
++ "pattern": "^lnk_[0-9A-HJKMNP-TV-Z]{26}$"
++ },
++ "sub": {
++ "type": "string",
++ "pattern": "^lnk_[0-9A-HJKMNP-TV-Z]{26}$"
++ },
++ "jti": {
++ "type": "string",
++ "pattern": "^[a-z]{3}_[A-Za-z0-9_-]{8,80}$"
++ },
++ "grant_id": {
++ "type": "string",
++ "pattern": "^[a-z]{3}_[A-Za-z0-9_-]{8,80}$"
++ },
++ "scopes": {
++ "type": "array",
++ "minItems": 1,
++ "uniqueItems": true,
++ "items": {
++ "enum": [
++ "agent",
++ "send",
++ "screen",
++ "desk",
++ "computer",
++ "worker"
++ ]
++ }
++ },
++ "iat": {
++ "type": "integer"
++ },
++ "exp": {
++ "type": "integer"
++ }
++ }
++}
ddiff --git a/contracts/link/access-grant.v1.json b/contracts/link/access-grant.v1.json
nnew file mode 100644
iindex 00000000..9af7b6ba
---- /dev/null
++++ b/contracts/link/access-grant.v1.json
@@@ -0,0 +1,81 @@
++{
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/link/access-grant.v1.json",
++ "title": "LinkAccessGrant",
++ "description": "Approved machine access; null expiration is for same-owner agent or send only.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "id",
++ "from_principal",
++ "to_principal",
++ "scopes",
++ "approved_by",
++ "created_at",
++ "expires_at",
++ "revoked_at"
++ ],
++ "properties": {
++ "id": {
++ "type": "string",
++ "pattern": "^[a-z]{3}_[A-Za-z0-9_-]{8,80}$"
++ },
++ "request_id": {
++ "type": "string",
++ "pattern": "^[a-z]{3}_[A-Za-z0-9_-]{8,80}$"
++ },
++ "from_principal": {
++ "type": "string",
++ "pattern": "^lnk_[0-9A-HJKMNP-TV-Z]{26}$"
++ },
++ "to_principal": {
++ "type": "string",
++ "pattern": "^lnk_[0-9A-HJKMNP-TV-Z]{26}$"
++ },
++ "scopes": {
++ "type": "array",
++ "minItems": 1,
++ "uniqueItems": true,
++ "items": {
++ "enum": [
++ "agent",
++ "send",
++ "screen",
++ "desk",
++ "computer",
++ "worker"
++ ]
++ }
++ },
++ "approved_by": {
++ "type": "string",
++ "pattern": "^usr_[0-9A-HJKMNP-TV-Z]{26}$"
++ },
++ "created_at": {
++ "type": "string",
++ "format": "date-time"
++ },
++ "expires_at": {
++ "oneOf": [
++ {
++ "type": "string",
++ "format": "date-time"
++ },
++ {
++ "type": "null"
++ }
++ ]
++ },
++ "revoked_at": {
++ "oneOf": [
++ {
++ "type": "string",
++ "format": "date-time"
++ },
++ {
++ "type": "null"
++ }
++ ]
++ }
++ }
++}
ddiff --git a/contracts/link/access-request.v1.json b/contracts/link/access-request.v1.json
nnew file mode 100644
iindex 00000000..c32ed28a
---- /dev/null
++++ b/contracts/link/access-request.v1.json
@@@ -0,0 +1,86 @@
++{
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/link/access-request.v1.json",
++ "title": "LinkAccessRequest",
++ "description": "A machine asks another for bounded access.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "id",
++ "from_principal",
++ "to_principal",
++ "from_owner",
++ "to_owner",
++ "scopes",
++ "status",
++ "requested_at",
++ "expires_at",
++ "duration_seconds"
++ ],
++ "properties": {
++ "id": {
++ "type": "string",
++ "pattern": "^[a-z]{3}_[A-Za-z0-9_-]{8,80}$"
++ },
++ "from_principal": {
++ "type": "string",
++ "pattern": "^lnk_[0-9A-HJKMNP-TV-Z]{26}$"
++ },
++ "to_principal": {
++ "type": "string",
++ "pattern": "^lnk_[0-9A-HJKMNP-TV-Z]{26}$"
++ },
++ "from_owner": {
++ "type": "string",
++ "pattern": "^usr_[0-9A-HJKMNP-TV-Z]{26}$"
++ },
++ "to_owner": {
++ "type": "string",
++ "pattern": "^usr_[0-9A-HJKMNP-TV-Z]{26}$"
++ },
++ "from_agent": {
++ "type": "string",
++ "pattern": "^agt_[0-9A-HJKMNP-TV-Z]{26}$"
++ },
++ "scopes": {
++ "type": "array",
++ "minItems": 1,
++ "uniqueItems": true,
++ "items": {
++ "enum": [
++ "agent",
++ "send",
++ "screen",
++ "desk",
++ "computer",
++ "worker"
++ ]
++ }
++ },
++ "reason": {
++ "type": "string",
++ "maxLength": 500
++ },
++ "status": {
++ "enum": [
++ "pending",
++ "approved",
++ "denied",
++ "expired"
++ ]
++ },
++ "requested_at": {
++ "type": "string",
++ "format": "date-time"
++ },
++ "expires_at": {
++ "type": "string",
++ "format": "date-time"
++ },
++ "duration_seconds": {
++ "type": "integer",
++ "minimum": 60,
++ "maximum": 2592000
++ }
++ }
++}
ddiff --git a/fixtures/agent.directory-entry/invalid/example.json b/fixtures/agent.directory-entry/invalid/example.json
nnew file mode 100644
iindex 00000000..0967ef42
---- /dev/null
++++ b/fixtures/agent.directory-entry/invalid/example.json
@@@ -0,0 +1 @@
++{}
ddiff --git a/fixtures/agent.directory-entry/valid/example.json b/fixtures/agent.directory-entry/valid/example.json
nnew file mode 100644
iindex 00000000..4879988d
---- /dev/null
++++ b/fixtures/agent.directory-entry/valid/example.json
@@@ -0,0 +1,13 @@
++{
++ "id": "agt_AAAAAAAAAAAAAAAAAAAAAAAAAA",
++ "owner": "usr_AAAAAAAAAAAAAAAAAAAAAAAAAA",
++ "kind": "link-local",
++ "name": "Codex",
++ "machine_id": "lnk_AAAAAAAAAAAAAAAAAAAAAAAAAA",
++ "skills": [
++ "code"
++ ],
++ "status": "online",
++ "allow_others": false,
++ "updated_at": "2026-11-11T00:00:00Z"
++}
ddiff --git a/fixtures/agent.task-result/invalid/example.json b/fixtures/agent.task-result/invalid/example.json
nnew file mode 100644
iindex 00000000..0967ef42
---- /dev/null
++++ b/fixtures/agent.task-result/invalid/example.json
@@@ -0,0 +1 @@
++{}
ddiff --git a/fixtures/agent.task-result/valid/example.json b/fixtures/agent.task-result/valid/example.json
nnew file mode 100644
iindex 00000000..aaef2370
---- /dev/null
++++ b/fixtures/agent.task-result/valid/example.json
@@@ -0,0 +1,14 @@
++{
++ "id": "tsk_12345678",
++ "thread": "thr_12345678",
++ "status": "completed",
++ "result": {
++ "parts": [
++ {
++ "type": "text",
++ "text": "Done"
++ }
++ ]
++ },
++ "updated_at": "2026-11-11T00:00:00Z"
++}
ddiff --git a/fixtures/agent.task/invalid/example.json b/fixtures/agent.task/invalid/example.json
nnew file mode 100644
iindex 00000000..0967ef42
---- /dev/null
++++ b/fixtures/agent.task/invalid/example.json
@@@ -0,0 +1 @@
++{}
ddiff --git a/fixtures/agent.task/valid/example.json b/fixtures/agent.task/valid/example.json
nnew file mode 100644
iindex 00000000..d3e11bd2
---- /dev/null
++++ b/fixtures/agent.task/valid/example.json
@@@ -0,0 +1,15 @@
++{
++ "to": "agt_BBBBBBBBBBBBBBBBBBBBBBBBBB",
++ "from": "agt_AAAAAAAAAAAAAAAAAAAAAAAAAA",
++ "on_behalf_of": "usr_AAAAAAAAAAAAAAAAAAAAAAAAAA",
++ "thread": "thr_12345678",
++ "message": {
++ "role": "user",
++ "parts": [
++ {
++ "type": "text",
++ "text": "Hello"
++ }
++ ]
++ }
++}
ddiff --git a/fixtures/link.access-grant-token/invalid/example.json b/fixtures/link.access-grant-token/invalid/example.json
nnew file mode 100644
iindex 00000000..0967ef42
---- /dev/null
++++ b/fixtures/link.access-grant-token/invalid/example.json
@@@ -0,0 +1 @@
++{}
ddiff --git a/fixtures/link.access-grant-token/valid/example.json b/fixtures/link.access-grant-token/valid/example.json
nnew file mode 100644
iindex 00000000..06590aa4
---- /dev/null
++++ b/fixtures/link.access-grant-token/valid/example.json
@@@ -0,0 +1,12 @@
++{
++ "iss": "https://openvibe.network",
++ "aud": "lnk_BBBBBBBBBBBBBBBBBBBBBBBBBB",
++ "sub": "lnk_AAAAAAAAAAAAAAAAAAAAAAAAAA",
++ "jti": "tok_12345678",
++ "grant_id": "grt_12345678",
++ "scopes": [
++ "agent"
++ ],
++ "iat": 1794355200,
++ "exp": 1794358800
++}
ddiff --git a/fixtures/link.access-grant/invalid/example.json b/fixtures/link.access-grant/invalid/example.json
nnew file mode 100644
iindex 00000000..0967ef42
---- /dev/null
++++ b/fixtures/link.access-grant/invalid/example.json
@@@ -0,0 +1 @@
++{}
ddiff --git a/fixtures/link.access-grant/valid/example.json b/fixtures/link.access-grant/valid/example.json
nnew file mode 100644
iindex 00000000..f12a3384
---- /dev/null
++++ b/fixtures/link.access-grant/valid/example.json
@@@ -0,0 +1,13 @@
++{
++ "id": "grt_12345678",
++ "request_id": "req_12345678",
++ "from_principal": "lnk_AAAAAAAAAAAAAAAAAAAAAAAAAA",
++ "to_principal": "lnk_BBBBBBBBBBBBBBBBBBBBBBBBBB",
++ "scopes": [
++ "agent"
++ ],
++ "approved_by": "usr_BBBBBBBBBBBBBBBBBBBBBBBBBB",
++ "created_at": "2026-11-11T00:00:00Z",
++ "expires_at": "2026-11-11T01:00:00Z",
++ "revoked_at": null
++}
ddiff --git a/fixtures/link.access-request/invalid/example.json b/fixtures/link.access-request/invalid/example.json
nnew file mode 100644
iindex 00000000..0967ef42
---- /dev/null
++++ b/fixtures/link.access-request/invalid/example.json
@@@ -0,0 +1 @@
++{}
ddiff --git a/fixtures/link.access-request/valid/example.json b/fixtures/link.access-request/valid/example.json
nnew file mode 100644
iindex 00000000..3b8674f7
---- /dev/null
++++ b/fixtures/link.access-request/valid/example.json
@@@ -0,0 +1,14 @@
++{
++ "id": "req_12345678",
++ "from_principal": "lnk_AAAAAAAAAAAAAAAAAAAAAAAAAA",
++ "to_principal": "lnk_BBBBBBBBBBBBBBBBBBBBBBBBBB",
++ "from_owner": "usr_AAAAAAAAAAAAAAAAAAAAAAAAAA",
++ "to_owner": "usr_BBBBBBBBBBBBBBBBBBBBBBBBBB",
++ "scopes": [
++ "agent"
++ ],
++ "status": "pending",
++ "requested_at": "2026-11-11T00:00:00Z",
++ "expires_at": "2026-11-11T01:00:00Z",
++ "duration_seconds": 3600
++}
ddiff --git a/fixtures/network.agent.task.created/invalid/example.json b/fixtures/network.agent.task.created/invalid/example.json
nnew file mode 100644
iindex 00000000..0967ef42
---- /dev/null
++++ b/fixtures/network.agent.task.created/invalid/example.json
@@@ -0,0 +1 @@
++{}
ddiff --git a/fixtures/network.agent.task.created/valid/example.json b/fixtures/network.agent.task.created/valid/example.json
nnew file mode 100644
iindex 00000000..758e0e55
---- /dev/null
++++ b/fixtures/network.agent.task.created/valid/example.json
@@@ -0,0 +1,7 @@
++{
++ "task_id": "tsk_12345678",
++ "thread": "thr_12345678",
++ "from": "agt_AAAAAAAAAAAAAAAAAAAAAAAAAA",
++ "to": "agt_BBBBBBBBBBBBBBBBBBBBBBBBBB",
++ "at": "2026-11-11T00:00:00Z"
++}
ddiff --git a/fixtures/network.agent.task.updated/invalid/example.json b/fixtures/network.agent.task.updated/invalid/example.json
nnew file mode 100644
iindex 00000000..0967ef42
---- /dev/null
++++ b/fixtures/network.agent.task.updated/invalid/example.json
@@@ -0,0 +1 @@
++{}
ddiff --git a/fixtures/network.agent.task.updated/valid/example.json b/fixtures/network.agent.task.updated/valid/example.json
nnew file mode 100644
iindex 00000000..daaaede3
---- /dev/null
++++ b/fixtures/network.agent.task.updated/valid/example.json
@@@ -0,0 +1,6 @@
++{
++ "task_id": "tsk_12345678",
++ "thread": "thr_12345678",
++ "status": "completed",
++ "at": "2026-11-11T00:00:00Z"
++}
ddiff --git a/fixtures/network.link.access.answered/invalid/example.json b/fixtures/network.link.access.answered/invalid/example.json
nnew file mode 100644
iindex 00000000..0967ef42
---- /dev/null
++++ b/fixtures/network.link.access.answered/invalid/example.json
@@@ -0,0 +1 @@
++{}
ddiff --git a/fixtures/network.link.access.answered/valid/example.json b/fixtures/network.link.access.answered/valid/example.json
nnew file mode 100644
iindex 00000000..000e4f19
---- /dev/null
++++ b/fixtures/network.link.access.answered/valid/example.json
@@@ -0,0 +1,6 @@
++{
++ "request_id": "req_12345678",
++ "status": "approved",
++ "grant_id": "grt_12345678",
++ "at": "2026-11-11T00:00:00Z"
++}
ddiff --git a/fixtures/network.link.access.requested/invalid/example.json b/fixtures/network.link.access.requested/invalid/example.json
nnew file mode 100644
iindex 00000000..0967ef42
---- /dev/null
++++ b/fixtures/network.link.access.requested/invalid/example.json
@@@ -0,0 +1 @@
++{}
ddiff --git a/fixtures/network.link.access.requested/valid/example.json b/fixtures/network.link.access.requested/valid/example.json
nnew file mode 100644
iindex 00000000..526eec02
---- /dev/null
++++ b/fixtures/network.link.access.requested/valid/example.json
@@@ -0,0 +1,6 @@
++{
++ "request_id": "req_12345678",
++ "from_principal": "lnk_AAAAAAAAAAAAAAAAAAAAAAAAAA",
++ "to_principal": "lnk_BBBBBBBBBBBBBBBBBBBBBBBBBB",
++ "at": "2026-11-11T00:00:00Z"
++}
ddiff --git a/fixtures/network.link.access.revoked/invalid/example.json b/fixtures/network.link.access.revoked/invalid/example.json
nnew file mode 100644
iindex 00000000..0967ef42
---- /dev/null
++++ b/fixtures/network.link.access.revoked/invalid/example.json
@@@ -0,0 +1 @@
++{}
ddiff --git a/fixtures/network.link.access.revoked/valid/example.json b/fixtures/network.link.access.revoked/valid/example.json
nnew file mode 100644
iindex 00000000..71c438aa
---- /dev/null
++++ b/fixtures/network.link.access.revoked/valid/example.json
@@@ -0,0 +1,6 @@
++{
++ "grant_id": "grt_12345678",
++ "from_principal": "lnk_AAAAAAAAAAAAAAAAAAAAAAAAAA",
++ "to_principal": "lnk_BBBBBBBBBBBBBBBBBBBBBBBBBB",
++ "at": "2026-11-11T00:00:00Z"
++}
ddiff --git a/generated/json-schema/bundle.json b/generated/json-schema/bundle.json
iindex 2e3a076d..fe723f3f 100644
---- a/generated/json-schema/bundle.json
++++ b/generated/json-schema/bundle.json
@@@ -130115,6 +130115,696 @@
"additionalProperties": false,
"description": "A comparison of things by weighted criteria, with finite dated results and their public sources. Missing evidence is absent, never zero."
}
++ },
++ "link.access-request": {
++ "version": "1.0.0",
++ "owner": "network",
++ "status": "active",
++ "schema": {
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/link/access-request.v1.json",
++ "title": "LinkAccessRequest",
++ "description": "A machine asks another for bounded access.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "id",
++ "from_principal",
++ "to_principal",
++ "from_owner",
++ "to_owner",
++ "scopes",
++ "status",
++ "requested_at",
++ "expires_at",
++ "duration_seconds"
++ ],
++ "properties": {
++ "id": {
++ "type": "string",
++ "pattern": "^[a-z]{3}_[A-Za-z0-9_-]{8,80}$"
++ },
++ "from_principal": {
++ "type": "string",
++ "pattern": "^lnk_[0-9A-HJKMNP-TV-Z]{26}$"
++ },
++ "to_principal": {
++ "type": "string",
++ "pattern": "^lnk_[0-9A-HJKMNP-TV-Z]{26}$"
++ },
++ "from_owner": {
++ "type": "string",
++ "pattern": "^usr_[0-9A-HJKMNP-TV-Z]{26}$"
++ },
++ "to_owner": {
++ "type": "string",
++ "pattern": "^usr_[0-9A-HJKMNP-TV-Z]{26}$"
++ },
++ "from_agent": {
++ "type": "string",
++ "pattern": "^agt_[0-9A-HJKMNP-TV-Z]{26}$"
++ },
++ "scopes": {
++ "type": "array",
++ "minItems": 1,
++ "uniqueItems": true,
++ "items": {
++ "enum": [
++ "agent",
++ "send",
++ "screen",
++ "desk",
++ "computer",
++ "worker"
++ ]
++ }
++ },
++ "reason": {
++ "type": "string",
++ "maxLength": 500
++ },
++ "status": {
++ "enum": [
++ "pending",
++ "approved",
++ "denied",
++ "expired"
++ ]
++ },
++ "requested_at": {
++ "type": "string",
++ "format": "date-time"
++ },
++ "expires_at": {
++ "type": "string",
++ "format": "date-time"
++ },
++ "duration_seconds": {
++ "type": "integer",
++ "minimum": 60,
++ "maximum": 2592000
++ }
++ }
++ }
++ },
++ "link.access-grant": {
++ "version": "1.0.0",
++ "owner": "network",
++ "status": "active",
++ "schema": {
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/link/access-grant.v1.json",
++ "title": "LinkAccessGrant",
++ "description": "Approved machine access; null expiration is for same-owner agent or send only.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "id",
++ "from_principal",
++ "to_principal",
++ "scopes",
++ "approved_by",
++ "created_at",
++ "expires_at",
++ "revoked_at"
++ ],
++ "properties": {
++ "id": {
++ "type": "string",
++ "pattern": "^[a-z]{3}_[A-Za-z0-9_-]{8,80}$"
++ },
++ "request_id": {
++ "type": "string",
++ "pattern": "^[a-z]{3}_[A-Za-z0-9_-]{8,80}$"
++ },
++ "from_principal": {
++ "type": "string",
++ "pattern": "^lnk_[0-9A-HJKMNP-TV-Z]{26}$"
++ },
++ "to_principal": {
++ "type": "string",
++ "pattern": "^lnk_[0-9A-HJKMNP-TV-Z]{26}$"
++ },
++ "scopes": {
++ "type": "array",
++ "minItems": 1,
++ "uniqueItems": true,
++ "items": {
++ "enum": [
++ "agent",
++ "send",
++ "screen",
++ "desk",
++ "computer",
++ "worker"
++ ]
++ }
++ },
++ "approved_by": {
++ "type": "string",
++ "pattern": "^usr_[0-9A-HJKMNP-TV-Z]{26}$"
++ },
++ "created_at": {
++ "type": "string",
++ "format": "date-time"
++ },
++ "expires_at": {
++ "oneOf": [
++ {
++ "type": "string",
++ "format": "date-time"
++ },
++ {
++ "type": "null"
++ }
++ ]
++ },
++ "revoked_at": {
++ "oneOf": [
++ {
++ "type": "string",
++ "format": "date-time"
++ },
++ {
++ "type": "null"
++ }
++ ]
++ }
++ }
++ }
++ },
++ "link.access-grant-token": {
++ "version": "1.0.0",
++ "owner": "network",
++ "status": "active",
++ "schema": {
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/link/access-grant-token.v1.json",
++ "title": "LinkAccessGrantToken",
++ "description": "Claims of the signed grant JWT; target is audience, requester is subject.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "iss",
++ "aud",
++ "sub",
++ "jti",
++ "grant_id",
++ "scopes",
++ "iat",
++ "exp"
++ ],
++ "properties": {
++ "iss": {
++ "type": "string"
++ },
++ "aud": {
++ "type": "string",
++ "pattern": "^lnk_[0-9A-HJKMNP-TV-Z]{26}$"
++ },
++ "sub": {
++ "type": "string",
++ "pattern": "^lnk_[0-9A-HJKMNP-TV-Z]{26}$"
++ },
++ "jti": {
++ "type": "string",
++ "pattern": "^[a-z]{3}_[A-Za-z0-9_-]{8,80}$"
++ },
++ "grant_id": {
++ "type": "string",
++ "pattern": "^[a-z]{3}_[A-Za-z0-9_-]{8,80}$"
++ },
++ "scopes": {
++ "type": "array",
++ "minItems": 1,
++ "uniqueItems": true,
++ "items": {
++ "enum": [
++ "agent",
++ "send",
++ "screen",
++ "desk",
++ "computer",
++ "worker"
++ ]
++ }
++ },
++ "iat": {
++ "type": "integer"
++ },
++ "exp": {
++ "type": "integer"
++ }
++ }
++ }
++ },
++ "agent.directory-entry": {
++ "version": "1.0.0",
++ "owner": "network",
++ "status": "active",
++ "schema": {
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/agent/directory-entry.v1.json",
++ "title": "AgentDirectoryEntry",
++ "description": "One discoverable A2A agent belonging to a person.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "id",
++ "owner",
++ "kind",
++ "name",
++ "skills",
++ "status",
++ "allow_others",
++ "updated_at"
++ ],
++ "properties": {
++ "id": {
++ "type": "string",
++ "pattern": "^agt_[0-9A-HJKMNP-TV-Z]{26}$"
++ },
++ "owner": {
++ "type": "string",
++ "pattern": "^usr_[0-9A-HJKMNP-TV-Z]{26}$"
++ },
++ "kind": {
++ "enum": [
++ "actor",
++ "codes",
++ "link-local",
++ "chat-bot",
++ "service"
++ ]
++ },
++ "name": {
++ "type": "string",
++ "maxLength": 120
++ },
++ "machine_id": {
++ "type": "string",
++ "pattern": "^lnk_[0-9A-HJKMNP-TV-Z]{26}$"
++ },
++ "service": {
++ "type": "string",
++ "maxLength": 60
++ },
++ "endpoint": {
++ "type": "string",
++ "format": "uri",
++ "pattern": "^https://"
++ },
++ "skills": {
++ "type": "array",
++ "items": {
++ "type": "string",
++ "maxLength": 120
++ },
++ "maxItems": 100
++ },
++ "status": {
++ "enum": [
++ "online",
++ "busy",
++ "offline"
++ ]
++ },
++ "allow_others": {
++ "type": "boolean"
++ },
++ "updated_at": {
++ "type": "string",
++ "format": "date-time"
++ }
++ }
++ }
++ },
++ "agent.task": {
++ "version": "1.0.0",
++ "owner": "network",
++ "status": "active",
++ "schema": {
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/agent/task.v1.json",
++ "title": "AgentTask",
++ "description": "A2A task with agent, person, thread and text parts limited to 8000 characters.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "to",
++ "from",
++ "on_behalf_of",
++ "thread",
++ "message"
++ ],
++ "properties": {
++ "id": {
++ "type": "string",
++ "pattern": "^[a-z]{3}_[A-Za-z0-9_-]{8,80}$"
++ },
++ "to": {
++ "type": "string",
++ "pattern": "^agt_[0-9A-HJKMNP-TV-Z]{26}$"
++ },
++ "from": {
++ "type": "string",
++ "pattern": "^agt_[0-9A-HJKMNP-TV-Z]{26}$"
++ },
++ "on_behalf_of": {
++ "type": "string",
++ "pattern": "^usr_[0-9A-HJKMNP-TV-Z]{26}$"
++ },
++ "thread": {
++ "type": "string",
++ "pattern": "^[a-z]{3}_[A-Za-z0-9_-]{8,80}$"
++ },
++ "message": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "parts"
++ ],
++ "properties": {
++ "role": {
++ "enum": [
++ "user",
++ "agent"
++ ]
++ },
++ "parts": {
++ "type": "array",
++ "minItems": 1,
++ "maxItems": 20,
++ "items": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "type",
++ "text"
++ ],
++ "properties": {
++ "type": {
++ "const": "text"
++ },
++ "text": {
++ "type": "string",
++ "maxLength": 8000
++ }
++ }
++ }
++ }
++ }
++ },
++ "skillId": {
++ "type": "string",
++ "maxLength": 64
++ },
++ "created_at": {
++ "type": "string",
++ "format": "date-time"
++ }
++ }
++ }
++ },
++ "agent.task-result": {
++ "version": "1.0.0",
++ "owner": "network",
++ "status": "active",
++ "schema": {
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/agent/task-result.v1.json",
++ "title": "AgentTaskResult",
++ "description": "Asynchronous A2A task status and optional result.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "id",
++ "thread",
++ "status",
++ "updated_at"
++ ],
++ "properties": {
++ "id": {
++ "type": "string",
++ "pattern": "^[a-z]{3}_[A-Za-z0-9_-]{8,80}$"
++ },
++ "thread": {
++ "type": "string",
++ "pattern": "^[a-z]{3}_[A-Za-z0-9_-]{8,80}$"
++ },
++ "status": {
++ "enum": [
++ "pending",
++ "running",
++ "completed",
++ "failed",
++ "cancelled"
++ ]
++ },
++ "result": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "parts"
++ ],
++ "properties": {
++ "role": {
++ "enum": [
++ "user",
++ "agent"
++ ]
++ },
++ "parts": {
++ "type": "array",
++ "minItems": 1,
++ "maxItems": 20,
++ "items": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "type",
++ "text"
++ ],
++ "properties": {
++ "type": {
++ "const": "text"
++ },
++ "text": {
++ "type": "string",
++ "maxLength": 8000
++ }
++ }
++ }
++ }
++ }
++ },
++ "updated_at": {
++ "type": "string",
++ "format": "date-time"
++ },
++ "error": {
++ "type": "string",
++ "maxLength": 500
++ }
++ }
++ }
++ },
++ "network.link.access.requested": {
++ "version": "1.0.0",
++ "owner": "network",
++ "status": "active",
++ "schema": {
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/events/payloads/network.link.access.requested.v1.json",
++ "title": "NetworkLinkAccessRequestedPayload",
++ "description": "Machine access request was created.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "request_id",
++ "from_principal",
++ "to_principal",
++ "at"
++ ],
++ "properties": {
++ "request_id": {
++ "type": "string",
++ "pattern": "^[a-z]{3}_[A-Za-z0-9_-]{8,80}$"
++ },
++ "from_principal": {
++ "type": "string",
++ "pattern": "^lnk_[0-9A-HJKMNP-TV-Z]{26}$"
++ },
++ "to_principal": {
++ "type": "string",
++ "pattern": "^lnk_[0-9A-HJKMNP-TV-Z]{26}$"
++ },
++ "at": {
++ "type": "string",
++ "format": "date-time"
++ }
++ }
++ }
++ },
++ "network.link.access.answered": {
++ "version": "1.0.0",
++ "owner": "network",
++ "status": "active",
++ "schema": {
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/events/payloads/network.link.access.answered.v1.json",
++ "title": "NetworkLinkAccessAnsweredPayload",
++ "description": "Machine access request was answered or expired.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "request_id",
++ "status",
++ "at"
++ ],
++ "properties": {
++ "request_id": {
++ "type": "string",
++ "pattern": "^[a-z]{3}_[A-Za-z0-9_-]{8,80}$"
++ },
++ "status": {
++ "enum": [
++ "approved",
++ "denied",
++ "expired"
++ ]
++ },
++ "grant_id": {
++ "type": "string",
++ "pattern": "^[a-z]{3}_[A-Za-z0-9_-]{8,80}$"
++ },
++ "at": {
++ "type": "string",
++ "format": "date-time"
++ }
++ }
++ }
++ },
++ "network.link.access.revoked": {
++ "version": "1.0.0",
++ "owner": "network",
++ "status": "active",
++ "schema": {
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/events/payloads/network.link.access.revoked.v1.json",
++ "title": "NetworkLinkAccessRevokedPayload",
++ "description": "Machine access grant was revoked.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "grant_id",
++ "from_principal",
++ "to_principal",
++ "at"
++ ],
++ "properties": {
++ "grant_id": {
++ "type": "string",
++ "pattern": "^[a-z]{3}_[A-Za-z0-9_-]{8,80}$"
++ },
++ "from_principal": {
++ "type": "string",
++ "pattern": "^lnk_[0-9A-HJKMNP-TV-Z]{26}$"
++ },
++ "to_principal": {
++ "type": "string",
++ "pattern": "^lnk_[0-9A-HJKMNP-TV-Z]{26}$"
++ },
++ "at": {
++ "type": "string",
++ "format": "date-time"
++ }
++ }
++ }
++ },
++ "network.agent.task.created": {
++ "version": "1.0.0",
++ "owner": "network",
++ "status": "active",
++ "schema": {
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/events/payloads/network.agent.task.created.v1.json",
++ "title": "NetworkAgentTaskCreatedPayload",
++ "description": "Agent task was created.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "task_id",
++ "thread",
++ "from",
++ "to",
++ "at"
++ ],
++ "properties": {
++ "task_id": {
++ "type": "string",
++ "pattern": "^[a-z]{3}_[A-Za-z0-9_-]{8,80}$"
++ },
++ "thread": {
++ "type": "string",
++ "pattern": "^[a-z]{3}_[A-Za-z0-9_-]{8,80}$"
++ },
++ "from": {
++ "type": "string",
++ "pattern": "^agt_[0-9A-HJKMNP-TV-Z]{26}$"
++ },
++ "to": {
++ "type": "string",
++ "pattern": "^agt_[0-9A-HJKMNP-TV-Z]{26}$"
++ },
++ "at": {
++ "type": "string",
++ "format": "date-time"
++ }
++ }
++ }
++ },
++ "network.agent.task.updated": {
++ "version": "1.0.0",
++ "owner": "network",
++ "status": "active",
++ "schema": {
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/events/payloads/network.agent.task.updated.v1.json",
++ "title": "NetworkAgentTaskUpdatedPayload",
++ "description": "Agent task status changed.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "task_id",
++ "thread",
++ "status",
++ "at"
++ ],
++ "properties": {
++ "task_id": {
++ "type": "string",
++ "pattern": "^[a-z]{3}_[A-Za-z0-9_-]{8,80}$"
++ },
++ "thread": {
++ "type": "string",
++ "pattern": "^[a-z]{3}_[A-Za-z0-9_-]{8,80}$"
++ },
++ "status": {
++ "enum": [
++ "pending",
++ "running",
++ "completed",
++ "failed",
++ "cancelled"
++ ]
++ },
++ "at": {
++ "type": "string",
++ "format": "date-time"
++ }
++ }
++ }
}
}
}
ddiff --git a/generated/openapi/actor.json b/generated/openapi/actor.json
iindex 08aa06cc..27b87e40 100644
---- a/generated/openapi/actor.json
++++ b/generated/openapi/actor.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Actor API",
-- "version": "0.408.0",
-- "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.408.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.409.0",
++ "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.409.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/ai.json b/generated/openapi/ai.json
iindex dd71b683..03179707 100644
---- a/generated/openapi/ai.json
++++ b/generated/openapi/ai.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.AI API",
-- "version": "0.408.0",
-- "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.408.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.409.0",
++ "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.409.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/bench.json b/generated/openapi/bench.json
iindex fac44266..b6ff183a 100644
---- a/generated/openapi/bench.json
++++ b/generated/openapi/bench.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Bench API",
-- "version": "0.408.0",
-- "description": "Routes of OpenVibe.Bench as the OpenVibe contracts describe them (openvibe-contracts 0.408.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.409.0",
++ "description": "Routes of OpenVibe.Bench as the OpenVibe contracts describe them (openvibe-contracts 0.409.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/billing.json b/generated/openapi/billing.json
iindex a5bdb221..45b24826 100644
---- a/generated/openapi/billing.json
++++ b/generated/openapi/billing.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Billing API",
-- "version": "0.408.0",
-- "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.408.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.409.0",
++ "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.409.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/blog.json b/generated/openapi/blog.json
iindex dc07851b..61b08b40 100644
---- a/generated/openapi/blog.json
++++ b/generated/openapi/blog.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Blog API",
-- "version": "0.408.0",
-- "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.408.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.409.0",
++ "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.409.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/bot.json b/generated/openapi/bot.json
iindex 3a852176..1bb09440 100644
---- a/generated/openapi/bot.json
++++ b/generated/openapi/bot.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Bot API",
-- "version": "0.408.0",
-- "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.408.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.409.0",
++ "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.409.0): each operation lists the capabilities it performs; a token for the 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"
@@@ -1022,6 +1022,72 @@
}
}
},
++ "/api/v1/machines/{id}/relay": {
++ "post": {
++ "operationId": "post_api_v1_machines_id_relay",
++ "summary": "Network relays grant-checked tasks and frames to a paired machine.",
++ "description": "**bot.machine.relay** (first-party): Network relays grant-checked tasks and frames to a paired machine.",
++ "tags": [
++ "bot.machine"
++ ],
++ "x-openvibe-capabilities": [
++ "bot.machine.relay"
++ ],
++ "x-openvibe-visibility": [
++ "first-party"
++ ],
++ "x-openvibe-quota-class": "admin",
++ "security": [
++ {
++ "openvibeToken": [
++ "bot.machine.relay"
++ ]
++ }
++ ],
++ "requestBody": {
++ "required": false,
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/agent.task.v1"
++ }
++ }
++ }
++ },
++ "parameters": [
++ {
++ "name": "id",
++ "in": "path",
++ "required": true,
++ "schema": {
++ "type": "string"
++ }
++ }
++ ],
++ "responses": {
++ "2XX": {
++ "description": "Success",
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/agent.task-result.v1"
++ }
++ }
++ }
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ }
++ },
"/api/v1/machines/{id}/revoke": {
"post": {
"operationId": "post_api_v1_machines_id_revoke",
@@@ -2302,6 +2368,162 @@
},
"components": {
"schemas": {
++ "agent.task-result.v1": {
++ "title": "AgentTaskResult",
++ "description": "Asynchronous A2A task status and optional result.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "id",
++ "thread",
++ "status",
++ "updated_at"
++ ],
++ "properties": {
++ "id": {
++ "type": "string",
++ "pattern": "^[a-z]{3}_[A-Za-z0-9_-]{8,80}$"
++ },
++ "thread": {
++ "type": "string",
++ "pattern": "^[a-z]{3}_[A-Za-z0-9_-]{8,80}$"
++ },
++ "status": {
++ "enum": [
++ "pending",
++ "running",
++ "completed",
++ "failed",
++ "cancelled"
++ ]
++ },
++ "result": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "parts"
++ ],
++ "properties": {
++ "role": {
++ "enum": [
++ "user",
++ "agent"
++ ]
++ },
++ "parts": {
++ "type": "array",
++ "minItems": 1,
++ "maxItems": 20,
++ "items": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "type",
++ "text"
++ ],
++ "properties": {
++ "type": {
++ "const": "text"
++ },
++ "text": {
++ "type": "string",
++ "maxLength": 8000
++ }
++ }
++ }
++ }
++ }
++ },
++ "updated_at": {
++ "type": "string",
++ "format": "date-time"
++ },
++ "error": {
++ "type": "string",
++ "maxLength": 500
++ }
++ }
++ },
++ "agent.task.v1": {
++ "title": "AgentTask",
++ "description": "A2A task with agent, person, thread and text parts limited to 8000 characters.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "to",
++ "from",
++ "on_behalf_of",
++ "thread",
++ "message"
++ ],
++ "properties": {
++ "id": {
++ "type": "string",
++ "pattern": "^[a-z]{3}_[A-Za-z0-9_-]{8,80}$"
++ },
++ "to": {
++ "type": "string",
++ "pattern": "^agt_[0-9A-HJKMNP-TV-Z]{26}$"
++ },
++ "from": {
++ "type": "string",
++ "pattern": "^agt_[0-9A-HJKMNP-TV-Z]{26}$"
++ },
++ "on_behalf_of": {
++ "type": "string",
++ "pattern": "^usr_[0-9A-HJKMNP-TV-Z]{26}$"
++ },
++ "thread": {
++ "type": "string",
++ "pattern": "^[a-z]{3}_[A-Za-z0-9_-]{8,80}$"
++ },
++ "message": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "parts"
++ ],
++ "properties": {
++ "role": {
++ "enum": [
++ "user",
++ "agent"
++ ]
++ },
++ "parts": {
++ "type": "array",
++ "minItems": 1,
++ "maxItems": 20,
++ "items": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "type",
++ "text"
++ ],
++ "properties": {
++ "type": {
++ "const": "text"
++ },
++ "text": {
++ "type": "string",
++ "maxLength": 8000
++ }
++ }
++ }
++ }
++ }
++ },
++ "skillId": {
++ "type": "string",
++ "maxLength": 64
++ },
++ "created_at": {
++ "type": "string",
++ "format": "date-time"
++ }
++ }
++ },
"bot.desk-lease-create-request.v1": {
"title": "BotDeskLeaseCreateRequest",
"description": "bot.desk-lease-create-request@1 (the Desks plan's D6): the body of POST /api/v1/machines/{id}/desk-leases on OpenVibe.Bot (capability bot.desk.session), answered 201 with bot.desk-lease@1. DESK is the name Run chose for the session (unique per session); a desk already leased to another session, or running for the machine's owner, is refused 409 bot.desk_busy, and a repeat for the same session answers its lease (200). A machine with no room (its max_desks) is refused 409 bot.machine_busy, one that is offline 409 bot.device_offline, and one the person may not use 404 bot.device_not_found.",
ddiff --git a/generated/openapi/chat.json b/generated/openapi/chat.json
iindex a91b9912..93e5f715 100644
---- a/generated/openapi/chat.json
++++ b/generated/openapi/chat.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Chat API",
-- "version": "0.408.0",
-- "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.408.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.409.0",
++ "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.409.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/codes.json b/generated/openapi/codes.json
iindex 233c9328..4c4b7e12 100644
---- a/generated/openapi/codes.json
++++ b/generated/openapi/codes.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Codes API",
-- "version": "0.408.0",
-- "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.408.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.409.0",
++ "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.409.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/community.json b/generated/openapi/community.json
iindex 83f24912..cc47d78e 100644
---- a/generated/openapi/community.json
++++ b/generated/openapi/community.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Community API",
-- "version": "0.408.0",
-- "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.408.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.409.0",
++ "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.409.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/connect.json b/generated/openapi/connect.json
iindex 46f2f398..ea727380 100644
---- a/generated/openapi/connect.json
++++ b/generated/openapi/connect.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe Connect API",
-- "version": "0.408.0",
-- "description": "Routes of OpenVibe Connect as the OpenVibe contracts describe them (openvibe-contracts 0.408.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.409.0",
++ "description": "Routes of OpenVibe Connect as the OpenVibe contracts describe them (openvibe-contracts 0.409.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/coupons.json b/generated/openapi/coupons.json
iindex e629c20f..cbbd01ef 100644
---- a/generated/openapi/coupons.json
++++ b/generated/openapi/coupons.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Coupons API",
-- "version": "0.408.0",
-- "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.408.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.409.0",
++ "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.409.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/deals.json b/generated/openapi/deals.json
iindex 2674e86b..b3db5495 100644
---- a/generated/openapi/deals.json
++++ b/generated/openapi/deals.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Deals API",
-- "version": "0.408.0",
-- "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.408.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.409.0",
++ "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.409.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/design.json b/generated/openapi/design.json
iindex 9b67e10a..a9d4d60e 100644
---- a/generated/openapi/design.json
++++ b/generated/openapi/design.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Design API",
-- "version": "0.408.0",
-- "description": "Routes of OpenVibe.Design as the OpenVibe contracts describe them (openvibe-contracts 0.408.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.409.0",
++ "description": "Routes of OpenVibe.Design as the OpenVibe contracts describe them (openvibe-contracts 0.409.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/domains.json b/generated/openapi/domains.json
iindex 0b04649b..2e00ad9a 100644
---- a/generated/openapi/domains.json
++++ b/generated/openapi/domains.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Domains API",
-- "version": "0.408.0",
-- "description": "Routes of OpenVibe.Domains as the OpenVibe contracts describe them (openvibe-contracts 0.408.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.409.0",
++ "description": "Routes of OpenVibe.Domains as the OpenVibe contracts describe them (openvibe-contracts 0.409.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/events.json b/generated/openapi/events.json
iindex da2d3d07..61a50c84 100644
---- a/generated/openapi/events.json
++++ b/generated/openapi/events.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Events API",
-- "version": "0.408.0",
-- "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.408.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.409.0",
++ "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.409.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/exchange.json b/generated/openapi/exchange.json
iindex f32168ac..e625549a 100644
---- a/generated/openapi/exchange.json
++++ b/generated/openapi/exchange.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Exchange API",
-- "version": "0.408.0",
-- "description": "Routes of OpenVibe.Exchange as the OpenVibe contracts describe them (openvibe-contracts 0.408.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.409.0",
++ "description": "Routes of OpenVibe.Exchange as the OpenVibe contracts describe them (openvibe-contracts 0.409.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/food.json b/generated/openapi/food.json
iindex b988e572..151b8111 100644
---- a/generated/openapi/food.json
++++ b/generated/openapi/food.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Food API",
-- "version": "0.408.0",
-- "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.408.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.409.0",
++ "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.409.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/games.json b/generated/openapi/games.json
iindex 08588388..efd2257b 100644
---- a/generated/openapi/games.json
++++ b/generated/openapi/games.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Games API",
-- "version": "0.408.0",
-- "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.408.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.409.0",
++ "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.409.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/git.json b/generated/openapi/git.json
iindex 9ff678df..8ab0aaef 100644
---- a/generated/openapi/git.json
++++ b/generated/openapi/git.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Git API",
-- "version": "0.408.0",
-- "description": "Routes of OpenVibe.Git as the OpenVibe contracts describe them (openvibe-contracts 0.408.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.409.0",
++ "description": "Routes of OpenVibe.Git as the OpenVibe contracts describe them (openvibe-contracts 0.409.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/host.json b/generated/openapi/host.json
iindex 81aab37d..819088ab 100644
---- a/generated/openapi/host.json
++++ b/generated/openapi/host.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Host API",
-- "version": "0.408.0",
-- "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.408.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.409.0",
++ "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.409.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/index.json b/generated/openapi/index.json
iindex b4bd18a3..f4a474f5 100644
---- a/generated/openapi/index.json
++++ b/generated/openapi/index.json
@@@ -40,8 +40,8 @@
"service": "bot",
"name": "OpenVibe.Bot",
"origin": "https://openvibe.bot",
-- "operations": 31,
-- "capabilities": 11
++ "operations": 32,
++ "capabilities": 12
},
{
"service": "chat",
@@@ -180,8 +180,8 @@
"service": "network",
"name": "OpenVibe.Network",
"origin": "https://openvibe.network",
-- "operations": 70,
-- "capabilities": 40
++ "operations": 73,
++ "capabilities": 43
},
{
"service": "news",
ddiff --git a/generated/openapi/inventory.json b/generated/openapi/inventory.json
iindex 9b5b7747..b21bce2e 100644
---- a/generated/openapi/inventory.json
++++ b/generated/openapi/inventory.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Inventory API",
-- "version": "0.408.0",
-- "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.408.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.409.0",
++ "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.409.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/live.json b/generated/openapi/live.json
iindex 04483e00..a4670981 100644
---- a/generated/openapi/live.json
++++ b/generated/openapi/live.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Live API",
-- "version": "0.408.0",
-- "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.408.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.409.0",
++ "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.409.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/mail.json b/generated/openapi/mail.json
iindex 35506bf1..c8fd98d1 100644
---- a/generated/openapi/mail.json
++++ b/generated/openapi/mail.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Mail API",
-- "version": "0.408.0",
-- "description": "Routes of OpenVibe.Mail as the OpenVibe contracts describe them (openvibe-contracts 0.408.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.409.0",
++ "description": "Routes of OpenVibe.Mail as the OpenVibe contracts describe them (openvibe-contracts 0.409.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/media-hub.json b/generated/openapi/media-hub.json
iindex bc99ab9f..6573fc62 100644
---- a/generated/openapi/media-hub.json
++++ b/generated/openapi/media-hub.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.MediaHub API",
-- "version": "0.408.0",
-- "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.408.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.409.0",
++ "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.409.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/media.json b/generated/openapi/media.json
iindex 242df1ed..711e886f 100644
---- a/generated/openapi/media.json
++++ b/generated/openapi/media.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Media API",
-- "version": "0.408.0",
-- "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.408.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.409.0",
++ "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.409.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/network.json b/generated/openapi/network.json
iindex cd84dcd4..1d672aac 100644
---- a/generated/openapi/network.json
++++ b/generated/openapi/network.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Network API",
-- "version": "0.408.0",
-- "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.408.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.409.0",
++ "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.409.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
@@@ -16,6 +16,128 @@
}
],
"paths": {
++ "/api/v1/agents/register": {
++ "post": {
++ "operationId": "post_api_v1_agents_register",
++ "summary": "A service or paired node registers only its own agents.",
++ "description": "**network.agents.register** (first-party): A service or paired node registers only its own agents.",
++ "tags": [
++ "network.agents"
++ ],
++ "x-openvibe-capabilities": [
++ "network.agents.register"
++ ],
++ "x-openvibe-visibility": [
++ "first-party"
++ ],
++ "x-openvibe-quota-class": "admin",
++ "security": [
++ {
++ "openvibeToken": [
++ "network.agents.register"
++ ]
++ }
++ ],
++ "requestBody": {
++ "required": false,
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/agent.directory-entry.v1"
++ }
++ }
++ }
++ },
++ "responses": {
++ "2XX": {
++ "description": "Success",
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/agent.directory-entry.v1"
++ }
++ }
++ }
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ }
++ },
++ "/api/v1/agents/tasks/{id}/result": {
++ "post": {
++ "operationId": "post_api_v1_agents_tasks_id_result",
++ "summary": "Bot reports machine agent task results to Network.",
++ "description": "**network.agents.relay** (first-party): Bot reports machine agent task results to Network.",
++ "tags": [
++ "network.agents"
++ ],
++ "x-openvibe-capabilities": [
++ "network.agents.relay"
++ ],
++ "x-openvibe-visibility": [
++ "first-party"
++ ],
++ "x-openvibe-quota-class": "admin",
++ "security": [
++ {
++ "openvibeToken": [
++ "network.agents.relay"
++ ]
++ }
++ ],
++ "requestBody": {
++ "required": false,
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/agent.task-result.v1"
++ }
++ }
++ }
++ },
++ "parameters": [
++ {
++ "name": "id",
++ "in": "path",
++ "required": true,
++ "schema": {
++ "type": "string"
++ }
++ }
++ ],
++ "responses": {
++ "2XX": {
++ "description": "Success",
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/agent.task-result.v1"
++ }
++ }
++ }
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ }
++ },
"/api/v1/creators/{creator}/analytics": {
"get": {
"operationId": "get_api_v1_creators_creator_analytics",
@@@ -192,6 +314,62 @@
}
}
},
++ "/api/v1/link/self/access-requests": {
++ "post": {
++ "operationId": "post_api_v1_link_self_access_requests",
++ "summary": "A paired node requests access to another machine.",
++ "description": "**network.link.access.request** (first-party): A paired node requests access to another machine.",
++ "tags": [
++ "network.link"
++ ],
++ "x-openvibe-capabilities": [
++ "network.link.access.request"
++ ],
++ "x-openvibe-visibility": [
++ "first-party"
++ ],
++ "x-openvibe-quota-class": "admin",
++ "security": [
++ {
++ "openvibeToken": [
++ "network.link.access.request"
++ ]
++ }
++ ],
++ "requestBody": {
++ "required": false,
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/link.access-request.v1"
++ }
++ }
++ }
++ },
++ "responses": {
++ "2XX": {
++ "description": "Success",
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/link.access-request.v1"
++ }
++ }
++ }
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ }
++ },
"/api/v1/link/self/capabilities": {
"put": {
"operationId": "put_api_v1_link_self_capabilities",
@@@ -4377,6 +4555,156 @@
}
}
},
++ "agent.directory-entry.v1": {
++ "title": "AgentDirectoryEntry",
++ "description": "One discoverable A2A agent belonging to a person.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "id",
++ "owner",
++ "kind",
++ "name",
++ "skills",
++ "status",
++ "allow_others",
++ "updated_at"
++ ],
++ "properties": {
++ "id": {
++ "type": "string",
++ "pattern": "^agt_[0-9A-HJKMNP-TV-Z]{26}$"
++ },
++ "owner": {
++ "type": "string",
++ "pattern": "^usr_[0-9A-HJKMNP-TV-Z]{26}$"
++ },
++ "kind": {
++ "enum": [
++ "actor",
++ "codes",
++ "link-local",
++ "chat-bot",
++ "service"
++ ]
++ },
++ "name": {
++ "type": "string",
++ "maxLength": 120
++ },
++ "machine_id": {
++ "type": "string",
++ "pattern": "^lnk_[0-9A-HJKMNP-TV-Z]{26}$"
++ },
++ "service": {
++ "type": "string",
++ "maxLength": 60
++ },
++ "endpoint": {
++ "type": "string",
++ "format": "uri",
++ "pattern": "^https://"
++ },
++ "skills": {
++ "type": "array",
++ "items": {
++ "type": "string",
++ "maxLength": 120
++ },
++ "maxItems": 100
++ },
++ "status": {
++ "enum": [
++ "online",
++ "busy",
++ "offline"
++ ]
++ },
++ "allow_others": {
++ "type": "boolean"
++ },
++ "updated_at": {
++ "type": "string",
++ "format": "date-time"
++ }
++ }
++ },
++ "agent.task-result.v1": {
++ "title": "AgentTaskResult",
++ "description": "Asynchronous A2A task status and optional result.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "id",
++ "thread",
++ "status",
++ "updated_at"
++ ],
++ "properties": {
++ "id": {
++ "type": "string",
++ "pattern": "^[a-z]{3}_[A-Za-z0-9_-]{8,80}$"
++ },
++ "thread": {
++ "type": "string",
++ "pattern": "^[a-z]{3}_[A-Za-z0-9_-]{8,80}$"
++ },
++ "status": {
++ "enum": [
++ "pending",
++ "running",
++ "completed",
++ "failed",
++ "cancelled"
++ ]
++ },
++ "result": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "parts"
++ ],
++ "properties": {
++ "role": {
++ "enum": [
++ "user",
++ "agent"
++ ]
++ },
++ "parts": {
++ "type": "array",
++ "minItems": 1,
++ "maxItems": 20,
++ "items": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "type",
++ "text"
++ ],
++ "properties": {
++ "type": {
++ "const": "text"
++ },
++ "text": {
++ "type": "string",
++ "maxLength": 8000
++ }
++ }
++ }
++ }
++ }
++ },
++ "updated_at": {
++ "type": "string",
++ "format": "date-time"
++ },
++ "error": {
++ "type": "string",
++ "maxLength": 500
++ }
++ }
++ },
"ai.run-error.v1": {
"title": "AiRunError",
"description": "ai.run-error@1: safe, actionable words for an AI or Actor run. Raw provider responses are never display text. The code map is shared across products.",
@@@ -5404,6 +5732,90 @@
}
}
},
++ "link.access-request.v1": {
++ "title": "LinkAccessRequest",
++ "description": "A machine asks another for bounded access.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "id",
++ "from_principal",
++ "to_principal",
++ "from_owner",
++ "to_owner",
++ "scopes",
++ "status",
++ "requested_at",
++ "expires_at",
++ "duration_seconds"
++ ],
++ "properties": {
++ "id": {
++ "type": "string",
++ "pattern": "^[a-z]{3}_[A-Za-z0-9_-]{8,80}$"
++ },
++ "from_principal": {
++ "type": "string",
++ "pattern": "^lnk_[0-9A-HJKMNP-TV-Z]{26}$"
++ },
++ "to_principal": {
++ "type": "string",
++ "pattern": "^lnk_[0-9A-HJKMNP-TV-Z]{26}$"
++ },
++ "from_owner": {
++ "type": "string",
++ "pattern": "^usr_[0-9A-HJKMNP-TV-Z]{26}$"
++ },
++ "to_owner": {
++ "type": "string",
++ "pattern": "^usr_[0-9A-HJKMNP-TV-Z]{26}$"
++ },
++ "from_agent": {
++ "type": "string",
++ "pattern": "^agt_[0-9A-HJKMNP-TV-Z]{26}$"
++ },
++ "scopes": {
++ "type": "array",
++ "minItems": 1,
++ "uniqueItems": true,
++ "items": {
++ "enum": [
++ "agent",
++ "send",
++ "screen",
++ "desk",
++ "computer",
++ "worker"
++ ]
++ }
++ },
++ "reason": {
++ "type": "string",
++ "maxLength": 500
++ },
++ "status": {
++ "enum": [
++ "pending",
++ "approved",
++ "denied",
++ "expired"
++ ]
++ },
++ "requested_at": {
++ "type": "string",
++ "format": "date-time"
++ },
++ "expires_at": {
++ "type": "string",
++ "format": "date-time"
++ },
++ "duration_seconds": {
++ "type": "integer",
++ "minimum": 60,
++ "maximum": 2592000
++ }
++ }
++ },
"modules.module-record.v1": {
"title": "ModuleRecord",
"description": "One subject's value in one namespace, as returned by Network. revision increases by one on every write; a write names the revision it read (If-Match) and fails with 412 if it moved.",
ddiff --git a/generated/openapi/news.json b/generated/openapi/news.json
iindex 1cc9ec92..00a15887 100644
---- a/generated/openapi/news.json
++++ b/generated/openapi/news.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.News API",
-- "version": "0.408.0",
-- "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.408.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.409.0",
++ "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.409.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/openre.json b/generated/openapi/openre.json
iindex fab2def3..97adadc0 100644
---- a/generated/openapi/openre.json
++++ b/generated/openapi/openre.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenRestream API",
-- "version": "0.408.0",
-- "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.408.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.409.0",
++ "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.409.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/play.json b/generated/openapi/play.json
iindex 8c003251..148ee098 100644
---- a/generated/openapi/play.json
++++ b/generated/openapi/play.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Play API",
-- "version": "0.408.0",
-- "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.408.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.409.0",
++ "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.409.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/quest.json b/generated/openapi/quest.json
iindex 5b53e635..88afd913 100644
---- a/generated/openapi/quest.json
++++ b/generated/openapi/quest.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Quest API",
-- "version": "0.408.0",
-- "description": "Routes of OpenVibe.Quest as the OpenVibe contracts describe them (openvibe-contracts 0.408.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.409.0",
++ "description": "Routes of OpenVibe.Quest as the OpenVibe contracts describe them (openvibe-contracts 0.409.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/report.json b/generated/openapi/report.json
iindex e93a555b..bbd329a0 100644
---- a/generated/openapi/report.json
++++ b/generated/openapi/report.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Report API",
-- "version": "0.408.0",
-- "description": "Routes of OpenVibe.Report as the OpenVibe contracts describe them (openvibe-contracts 0.408.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.409.0",
++ "description": "Routes of OpenVibe.Report as the OpenVibe contracts describe them (openvibe-contracts 0.409.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/reviews.json b/generated/openapi/reviews.json
iindex cf10727f..687b8322 100644
---- a/generated/openapi/reviews.json
++++ b/generated/openapi/reviews.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Reviews API",
-- "version": "0.408.0",
-- "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.408.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.409.0",
++ "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.409.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/run.json b/generated/openapi/run.json
iindex 7805767b..7fbd3fc1 100644
---- a/generated/openapi/run.json
++++ b/generated/openapi/run.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Run API",
-- "version": "0.408.0",
-- "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.408.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.409.0",
++ "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.409.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/search.json b/generated/openapi/search.json
iindex 44d0280a..c2469975 100644
---- a/generated/openapi/search.json
++++ b/generated/openapi/search.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Search API",
-- "version": "0.408.0",
-- "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.408.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.409.0",
++ "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.409.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/services.json b/generated/openapi/services.json
iindex ca53c7c7..1aef708c 100644
---- a/generated/openapi/services.json
++++ b/generated/openapi/services.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Services API",
-- "version": "0.408.0",
-- "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.408.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.409.0",
++ "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.409.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/sources.json b/generated/openapi/sources.json
iindex e0aa3f85..8bb767ac 100644
---- a/generated/openapi/sources.json
++++ b/generated/openapi/sources.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Sources API",
-- "version": "0.408.0",
-- "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.408.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.409.0",
++ "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.409.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/space.json b/generated/openapi/space.json
iindex 6966e200..26550a7f 100644
---- a/generated/openapi/space.json
++++ b/generated/openapi/space.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Space API",
-- "version": "0.408.0",
-- "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.408.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.409.0",
++ "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.409.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/tips.json b/generated/openapi/tips.json
iindex 4b6e1215..774b190a 100644
---- a/generated/openapi/tips.json
++++ b/generated/openapi/tips.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Tips API",
-- "version": "0.408.0",
-- "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.408.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.409.0",
++ "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.409.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/today.json b/generated/openapi/today.json
iindex 352fe701..b06dd1a1 100644
---- a/generated/openapi/today.json
++++ b/generated/openapi/today.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Today API",
-- "version": "0.408.0",
-- "description": "Routes of OpenVibe.Today as the OpenVibe contracts describe them (openvibe-contracts 0.408.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.409.0",
++ "description": "Routes of OpenVibe.Today as the OpenVibe contracts describe them (openvibe-contracts 0.409.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/tools.json b/generated/openapi/tools.json
iindex ed4204a7..4af667d5 100644
---- a/generated/openapi/tools.json
++++ b/generated/openapi/tools.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Tools API",
-- "version": "0.408.0",
-- "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.408.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.409.0",
++ "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.409.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/trade.json b/generated/openapi/trade.json
iindex f320f93a..b7c9ae61 100644
---- a/generated/openapi/trade.json
++++ b/generated/openapi/trade.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Trade API",
-- "version": "0.408.0",
-- "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.408.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.409.0",
++ "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.409.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/vip.json b/generated/openapi/vip.json
iindex b22e997f..e969cd41 100644
---- a/generated/openapi/vip.json
++++ b/generated/openapi/vip.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.VIP API",
-- "version": "0.408.0",
-- "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.408.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.409.0",
++ "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.409.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/vision.json b/generated/openapi/vision.json
iindex aca99fb8..a6bfe466 100644
---- a/generated/openapi/vision.json
++++ b/generated/openapi/vision.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Vision API",
-- "version": "0.408.0",
-- "description": "Routes of OpenVibe.Vision as the OpenVibe contracts describe them (openvibe-contracts 0.408.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.409.0",
++ "description": "Routes of OpenVibe.Vision as the OpenVibe contracts describe them (openvibe-contracts 0.409.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/watch.json b/generated/openapi/watch.json
iindex 453980dd..b0c1cfa8 100644
---- a/generated/openapi/watch.json
++++ b/generated/openapi/watch.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Watch API",
-- "version": "0.408.0",
-- "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.408.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.409.0",
++ "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.409.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/wiki.json b/generated/openapi/wiki.json
iindex 2da95d1a..162a8962 100644
---- a/generated/openapi/wiki.json
++++ b/generated/openapi/wiki.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Wiki API",
-- "version": "0.408.0",
-- "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.408.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.409.0",
++ "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.409.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/work.json b/generated/openapi/work.json
iindex eb3d3129..7182fbb2 100644
---- a/generated/openapi/work.json
++++ b/generated/openapi/work.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Work API",
-- "version": "0.408.0",
-- "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.408.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.409.0",
++ "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.409.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/zone.json b/generated/openapi/zone.json
iindex 7f08a461..42dbb36f 100644
---- a/generated/openapi/zone.json
++++ b/generated/openapi/zone.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Zone API",
-- "version": "0.408.0",
-- "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.408.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.409.0",
++ "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.409.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/typescript/index.d.ts b/generated/typescript/index.d.ts
iindex 28192f4f..adf58d9d 100644
---- a/generated/typescript/index.d.ts
++++ b/generated/typescript/index.d.ts
@@@ -336244,3 +336244,1950 @@ export interface CompareComparison {
}[];
availability?: string[];
}
++
++/** [email protected] (owner: network) */
++/**
++ * A machine asks another for bounded access.
++ */
++export interface LinkAccessRequest {
++ id: string;
++ from_principal: string;
++ to_principal: string;
++ from_owner: string;
++ to_owner: string;
++ from_agent?: string;
++ /**
++ * @minItems 1
++ */
++ scopes: [
++ "agent" | "send" | "screen" | "desk" | "computer" | "worker",
++ ...("agent" | "send" | "screen" | "desk" | "computer" | "worker")[]
++ ];
++ reason?: string;
++ status: "pending" | "approved" | "denied" | "expired";
++ requested_at: string;
++ expires_at: string;
++ duration_seconds: number;
++}
++
++/** [email protected] (owner: network) */
++/**
++ * Approved machine access; null expiration is for same-owner agent or send only.
++ */
++export interface LinkAccessGrant {
++ id: string;
++ request_id?: string;
++ from_principal: string;
++ to_principal: string;
++ /**
++ * @minItems 1
++ */
++ scopes: [
++ "agent" | "send" | "screen" | "desk" | "computer" | "worker",
++ ...("agent" | "send" | "screen" | "desk" | "computer" | "worker")[]
++ ];
++ approved_by: string;
++ created_at: string;
++ expires_at: string | null;
++ revoked_at: string | null;
++}
++
++/** [email protected] (owner: network) */
++/**
++ * Claims of the signed grant JWT; target is audience, requester is subject.
++ */
++export interface LinkAccessGrantToken {
++ iss: string;
++ aud: string;
++ sub: string;
++ jti: string;
++ grant_id: string;
++ /**
++ * @minItems 1
++ */
++ scopes: [
++ "agent" | "send" | "screen" | "desk" | "computer" | "worker",
++ ...("agent" | "send" | "screen" | "desk" | "computer" | "worker")[]
++ ];
++ iat: number;
++ exp: number;
++}
++
++/** [email protected] (owner: network) */
++/**
++ * One discoverable A2A agent belonging to a person.
++ */
++export interface AgentDirectoryEntry {
++ id: string;
++ owner: string;
++ kind: "actor" | "codes" | "link-local" | "chat-bot" | "service";
++ name: string;
++ machine_id?: string;
++ service?: string;
++ endpoint?: string;
++ /**
++ * @maxItems 100
++ */
++ skills: string[];
++ status: "online" | "busy" | "offline";
++ allow_others: boolean;
++ updated_at: string;
++}
++
++/** [email protected] (owner: network) */
++/**
++ * A2A task with agent, person, thread and text parts limited to 8000 characters.
++ */
++export interface AgentTask {
++ id?: string;
++ to: string;
++ from: string;
++ on_behalf_of: string;
++ thread: string;
++ message: {
++ role?: "user" | "agent";
++ /**
++ * @minItems 1
++ * @maxItems 20
++ */
++ parts:
++ | [
++ {
++ type: "text";
++ text: string;
++ }
++ ]
++ | [
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ }
++ ]
++ | [
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ }
++ ]
++ | [
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ }
++ ]
++ | [
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ }
++ ]
++ | [
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ }
++ ]
++ | [
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ }
++ ]
++ | [
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ }
++ ]
++ | [
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ }
++ ]
++ | [
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ }
++ ]
++ | [
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ }
++ ]
++ | [
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ }
++ ]
++ | [
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ }
++ ]
++ | [
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ }
++ ]
++ | [
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ }
++ ]
++ | [
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ }
++ ]
++ | [
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ }
++ ]
++ | [
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ }
++ ]
++ | [
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ }
++ ]
++ | [
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ }
++ ];
++ };
++ skillId?: string;
++ created_at?: string;
++}
++
++/** [email protected] (owner: network) */
++/**
++ * Asynchronous A2A task status and optional result.
++ */
++export interface AgentTaskResult {
++ id: string;
++ thread: string;
++ status: "pending" | "running" | "completed" | "failed" | "cancelled";
++ result?: {
++ role?: "user" | "agent";
++ /**
++ * @minItems 1
++ * @maxItems 20
++ */
++ parts:
++ | [
++ {
++ type: "text";
++ text: string;
++ }
++ ]
++ | [
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ }
++ ]
++ | [
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ }
++ ]
++ | [
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ }
++ ]
++ | [
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ }
++ ]
++ | [
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ }
++ ]
++ | [
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ }
++ ]
++ | [
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ }
++ ]
++ | [
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ }
++ ]
++ | [
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ }
++ ]
++ | [
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ }
++ ]
++ | [
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ }
++ ]
++ | [
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ }
++ ]
++ | [
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ }
++ ]
++ | [
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ }
++ ]
++ | [
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ }
++ ]
++ | [
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ }
++ ]
++ | [
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ }
++ ]
++ | [
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ }
++ ]
++ | [
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ },
++ {
++ type: "text";
++ text: string;
++ }
++ ];
++ };
++ updated_at: string;
++ error?: string;
++}
++
++/** [email protected] (owner: network) */
++/**
++ * Machine access request was created.
++ */
++export interface NetworkLinkAccessRequestedPayload {
++ request_id: string;
++ from_principal: string;
++ to_principal: string;
++ at: string;
++}
++
++/** [email protected] (owner: network) */
++/**
++ * Machine access request was answered or expired.
++ */
++export interface NetworkLinkAccessAnsweredPayload {
++ request_id: string;
++ status: "approved" | "denied" | "expired";
++ grant_id?: string;
++ at: string;
++}
++
++/** [email protected] (owner: network) */
++/**
++ * Machine access grant was revoked.
++ */
++export interface NetworkLinkAccessRevokedPayload {
++ grant_id: string;
++ from_principal: string;
++ to_principal: string;
++ at: string;
++}
++
++/** [email protected] (owner: network) */
++/**
++ * Agent task was created.
++ */
++export interface NetworkAgentTaskCreatedPayload {
++ task_id: string;
++ thread: string;
++ from: string;
++ to: string;
++ at: string;
++}
++
++/** [email protected] (owner: network) */
++/**
++ * Agent task status changed.
++ */
++export interface NetworkAgentTaskUpdatedPayload {
++ task_id: string;
++ thread: string;
++ status: "pending" | "running" | "completed" | "failed" | "cancelled";
++ at: string;
++}
ddiff --git a/manifests/capabilities/bot.machine.relay.json b/manifests/capabilities/bot.machine.relay.json
nnew file mode 100644
iindex 00000000..72c5f268
---- /dev/null
++++ b/manifests/capabilities/bot.machine.relay.json
@@@ -0,0 +1,22 @@
++{
++ "id": "bot.machine.relay",
++ "version": "1.0",
++ "owner": "bot",
++ "status": "active",
++ "visibility": "first-party",
++ "sensitive": true,
++ "description": "Network relays grant-checked tasks and frames to a paired machine.",
++ "permissions": [
++ "agents:relay"
++ ],
++ "resourceConstraints": [
++ "owner"
++ ],
++ "quotaClass": "admin",
++ "events": [],
++ "implementedBy": [
++ "POST /api/v1/machines/:id/relay"
++ ],
++ "inputSchema": "agent.task@1",
++ "outputSchema": "agent.task-result@1"
++}
ddiff --git a/manifests/capabilities/network.agents.register.json b/manifests/capabilities/network.agents.register.json
nnew file mode 100644
iindex 00000000..2eabb065
---- /dev/null
++++ b/manifests/capabilities/network.agents.register.json
@@@ -0,0 +1,22 @@
++{
++ "id": "network.agents.register",
++ "version": "1.0",
++ "owner": "network",
++ "status": "active",
++ "visibility": "first-party",
++ "sensitive": true,
++ "description": "A service or paired node registers only its own agents.",
++ "permissions": [
++ "agents:register"
++ ],
++ "resourceConstraints": [
++ "owner"
++ ],
++ "quotaClass": "admin",
++ "events": [],
++ "implementedBy": [
++ "POST /api/v1/agents/register"
++ ],
++ "inputSchema": "agent.directory-entry@1",
++ "outputSchema": "agent.directory-entry@1"
++}
ddiff --git a/manifests/capabilities/network.agents.relay.json b/manifests/capabilities/network.agents.relay.json
nnew file mode 100644
iindex 00000000..6ca87abb
---- /dev/null
++++ b/manifests/capabilities/network.agents.relay.json
@@@ -0,0 +1,22 @@
++{
++ "id": "network.agents.relay",
++ "version": "1.0",
++ "owner": "network",
++ "status": "active",
++ "visibility": "first-party",
++ "sensitive": true,
++ "description": "Bot reports machine agent task results to Network.",
++ "permissions": [
++ "agents:relay"
++ ],
++ "resourceConstraints": [
++ "owner"
++ ],
++ "quotaClass": "admin",
++ "events": [],
++ "implementedBy": [
++ "POST /api/v1/agents/tasks/:id/result"
++ ],
++ "inputSchema": "agent.task-result@1",
++ "outputSchema": "agent.task-result@1"
++}
ddiff --git a/manifests/capabilities/network.link.access.request.json b/manifests/capabilities/network.link.access.request.json
nnew file mode 100644
iindex 00000000..4252c307
---- /dev/null
++++ b/manifests/capabilities/network.link.access.request.json
@@@ -0,0 +1,22 @@
++{
++ "id": "network.link.access.request",
++ "version": "1.0",
++ "owner": "network",
++ "status": "active",
++ "visibility": "first-party",
++ "sensitive": true,
++ "description": "A paired node requests access to another machine.",
++ "permissions": [
++ "nodes:self"
++ ],
++ "resourceConstraints": [
++ "owner"
++ ],
++ "quotaClass": "admin",
++ "events": [],
++ "implementedBy": [
++ "POST /api/v1/link/self/access-requests"
++ ],
++ "inputSchema": "link.access-request@1",
++ "outputSchema": "link.access-request@1"
++}
ddiff --git a/manifests/services/bot.json b/manifests/services/bot.json
iindex 375ac562..dc2f3ee5 100644
---- a/manifests/services/bot.json
++++ b/manifests/services/bot.json
@@@ -39,7 +39,8 @@
"bot.resource.control",
"bot.desk.session",
"bot.machine.manage",
-- "bot.machine.watch_link"
++ "bot.machine.watch_link",
++ "bot.machine.relay"
],
"eventsProduced": [
"bot.robot.online",
@@@ -50,7 +51,8 @@
],
"eventsConsumed": [
"network.account.export_requested",
-- "network.account.deleted"
++ "network.account.deleted",
++ "network.link.access.revoked"
],
"namespacesOwned": [],
"lifecycle": {
ddiff --git a/manifests/services/network.json b/manifests/services/network.json
iindex a04675c5..b2bc60cd 100644
---- a/manifests/services/network.json
++++ b/manifests/services/network.json
@@@ -90,7 +90,10 @@
"network.machines.read",
"network.machines.manage",
"network.presence.read",
-- "network.levels.award"
++ "network.levels.award",
++ "network.link.access.request",
++ "network.agents.register",
++ "network.agents.relay"
],
"eventsProduced": [
"network.account.deleted",
@@@ -122,7 +125,12 @@
"share.transfer.requested",
"share.transfer.accepted",
"share.transfer.declined",
-- "network.presence.changed"
++ "network.presence.changed",
++ "network.link.access.requested",
++ "network.link.access.answered",
++ "network.link.access.revoked",
++ "network.agent.task.created",
++ "network.agent.task.updated"
],
"eventsConsumed": [
"billing.staff.action",
ddiff --git a/package-lock.json b/package-lock.json
iindex 8723b378..677af419 100644
---- a/package-lock.json
++++ b/package-lock.json
@@@ -1,12 +1,12 @@
{
"name": "openvibe-contracts",
-- "version": "0.408.0",
++ "version": "0.409.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "openvibe-contracts",
-- "version": "0.408.0",
++ "version": "0.409.0",
"license": "AGPL-3.0-only",
"dependencies": {
"ajv": "^8.17.1",
ddiff --git a/package.json b/package.json
iindex dc7cf4a1..b11d4963 100644
---- a/package.json
++++ b/package.json
@@@ -1,6 +1,6 @@
{
"name": "openvibe-contracts",
-- "version": "0.408.0",
++ "version": "0.409.0",
"description": "Machine-readable contracts for the OpenVibe network: schemas, manifests, ids, error envelope, capability checks.",
"main": "index.js",
"types": "generated/typescript/index.d.ts",
ddiff --git a/test/bot-manifest.test.js b/test/bot-manifest.test.js
iindex 82b2ad90..46e4dd5a 100644
---- a/test/bot-manifest.test.js
++++ b/test/bot-manifest.test.js
@@@ -15,7 +15,7 @@ const c = require('..');
// bot.machine.manage: the machines hub (0.258.0, plan L34): Network fronts Bot for a person and for the apps that
// person consented to; Bot stays the authority and checks the machine is that person's own.
// bot.machine.watch_link: the owner's agent asks for a link that shows the desk it works on, inside a chat (plan L55).
--const BOT_CAPABILITIES = ['bot.robot.read', 'bot.robot.manage', 'bot.robot.control', 'bot.computer.control', 'bot.machine.ai', 'bot.machine.manage', 'bot.machine.watch_link', 'bot.desk.session', 'bot.device.connect', 'bot.job.dispatch', 'bot.resource.read', 'bot.resource.control'];
++const BOT_CAPABILITIES = ['bot.robot.read', 'bot.robot.manage', 'bot.robot.control', 'bot.computer.control', 'bot.machine.ai', 'bot.machine.manage', 'bot.machine.watch_link', 'bot.machine.relay', 'bot.desk.session', 'bot.device.connect', 'bot.job.dispatch', 'bot.resource.read', 'bot.resource.control'];
const BOT_EVENTS = ['bot.robot.online', 'bot.robot.offline', 'bot.estop.set', 'bot.estop.cleared', 'bot.command.refused'];
const bot = c.services.get('bot');