openvibers/openvibe.contracts Commits

0.233.0: domains.proposal@1, domains.actions.read and domains.proposal.decide; the Action Center knows domains (#241)

OP OpenVibers committed 16 days ago · c9cc4207f8 · 55 files, +1411 −101

Changes

ddiff --git a/CHANGELOG.md b/CHANGELOG.md
iindex 48a23bc1..96c95b1a 100644
---- a/CHANGELOG.md
++++ b/CHANGELOG.md
@@@ -4,6 +4,18 @@ All notable changes to `openvibe-contracts`. Releases are git tags (`vX.Y.Z`) th
from `https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/<tag>`. Before v0.30.0,
the notes were in the tag and commit messages (`git tag -n1`).
++## 0.233.0 — 2026-10-28
++
++- **OpenVibe.Domains' control panel** (plan 2026-10-28 §5.1, DOM-2):
++ - **`domains.proposal@1`** (new, public): a DNS change waiting for its person. It holds the record diff (create,
++ update, delete), why, the risk, its status (pending, applying, applied, declined, failed, rolled_back, expired) and
++ who asked. The credential is never part of it.
++ - **`domains.actions.read`** and **`domains.proposal.decide`** (new, first-party, for OpenVibe.Network): Domains'
++ proposals in the Action Center, approved or declined there.
++ - `common.action-item@1`'s `service` and `network.me-actions-result@1`'s `sources` gain `domains` (additive).
++ - The Domains manifest names both capabilities and its database (`ov_domains`). The provider credential is a Network
++ project secret (ADR-056), granted to `domains` for reveal to the provider's origin only.
++
## 0.232.0 — 2026-10-28
- **codes.task.queued|running|succeeded|failed|cancelled** (new payload contracts, first-party, owner `codes`; plan
ddiff --git a/contracts/catalog.json b/contracts/catalog.json
iindex 81d2dba5..767a51c0 100644
---- a/contracts/catalog.json
++++ b/contracts/catalog.json
@@@ -7694,6 +7694,15 @@
"visibility": "first-party",
"compatibility": "backward",
"status": "active"
++ },
++ {
++ "id": "domains.proposal",
++ "version": "1.0.0",
++ "owner": "domains",
++ "schema": "domains/proposal.v1.json",
++ "visibility": "public",
++ "compatibility": "backward",
++ "status": "active"
}
]
}
ddiff --git a/contracts/common/action-item.v1.json b/contracts/common/action-item.v1.json
iindex 7aeae3b3..da12890d 100644
---- a/contracts/common/action-item.v1.json
++++ b/contracts/common/action-item.v1.json
@@@ -24,7 +24,8 @@
"codes",
"ai",
"network",
-- "run"
++ "run",
++ "domains"
],
"description": "The authority that owns the item."
},
@@@ -32,7 +33,7 @@
"type": "string",
"minLength": 1,
"maxLength": 80,
-- "description": "The authority's own id (tsk_…, a Codes task id, run_…, a confirmation id)."
++ "description": "The authority's own id (tsk_…, a Codes task id, run_…, a confirmation id, dpr_…)."
},
"kind": {
"enum": [
ddiff --git a/contracts/common/action-list-result.v1.json b/contracts/common/action-list-result.v1.json
iindex 29164175..e966a938 100644
---- a/contracts/common/action-list-result.v1.json
++++ b/contracts/common/action-list-result.v1.json
@@@ -2,7 +2,7 @@
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://openvibe.network/contracts/common/action-list-result.v1.json",
"title": "ActionListResult",
-- "description": "One authority's Action Center items for a person (capabilities actor.actions.read, codes.actions.read, ai.actions.read): GET /api/v1/actions?subject=usr_… with the caller's service token. Everything running, waiting or scheduled, then done and failed items from the last 30 days, newest first, at most 50.",
++ "description": "One authority's Action Center items for a person (capabilities actor.actions.read, codes.actions.read, ai.actions.read, domains.actions.read): GET /api/v1/actions?subject=usr_… with the caller's service token. Everything running, waiting or scheduled, then done and failed items from the last 30 days, newest first, at most 50.",
"type": "object",
"additionalProperties": false,
"required": [
ddiff --git a/contracts/domains/proposal.v1.json b/contracts/domains/proposal.v1.json
nnew file mode 100644
iindex 00000000..063a8954
---- /dev/null
++++ b/contracts/domains/proposal.v1.json
@@@ -0,0 +1,294 @@
++{
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/domains/proposal.v1.json",
++ "title": "DomainsProposal",
++ "description": "A change to a person's DNS on OpenVibe.Domains (plan 2026-10-28 §5.1): nothing an agent, a bulk edit or the person's own edit asks for touches DNS until the person approves it. A proposal holds the record diff, why, what could break, and its rollback; approving it applies the changes in order through the provider's API with the person's connected credential (a Network project secret, ADR-056, never part of this document). A change whose record moved since the proposal was made is refused as stale; rolling back applies the inverse changes.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "id",
++ "domain",
++ "provider",
++ "connection_id",
++ "title",
++ "status",
++ "changes",
++ "created_by",
++ "created_at",
++ "href"
++ ],
++ "properties": {
++ "id": {
++ "type": "string",
++ "pattern": "^dpr_[0-9A-HJKMNP-TV-Z]{26}$"
++ },
++ "domain": {
++ "type": "string",
++ "minLength": 3,
++ "maxLength": 253
++ },
++ "provider": {
++ "enum": [
++ "cloudflare",
++ "porkbun",
++ "namecheap",
++ "spaceship"
++ ]
++ },
++ "connection_id": {
++ "type": "string",
++ "pattern": "^dcn_[0-9A-HJKMNP-TV-Z]{26}$"
++ },
++ "title": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 160
++ },
++ "why": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "maxLength": 1000
++ },
++ "risk": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "maxLength": 1000,
++ "description": "What could break, in plain words."
++ },
++ "status": {
++ "enum": [
++ "pending",
++ "applying",
++ "applied",
++ "declined",
++ "failed",
++ "rolled_back",
++ "expired"
++ ]
++ },
++ "changes": {
++ "type": "array",
++ "minItems": 1,
++ "maxItems": 50,
++ "items": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "op"
++ ],
++ "properties": {
++ "op": {
++ "enum": [
++ "create",
++ "update",
++ "delete"
++ ]
++ },
++ "record_id": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "maxLength": 64,
++ "description": "The provider's record id (update, delete; a create's after it is applied)."
++ },
++ "before": {
++ "oneOf": [
++ {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "type",
++ "name",
++ "content"
++ ],
++ "properties": {
++ "type": {
++ "enum": [
++ "A",
++ "AAAA",
++ "CNAME",
++ "TXT",
++ "MX",
++ "NS",
++ "CAA",
++ "SRV",
++ "DS"
++ ]
++ },
++ "name": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 253,
++ "description": "The full record name (example.com, www.example.com)."
++ },
++ "content": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 4096
++ },
++ "ttl": {
++ "type": "integer",
++ "minimum": 1,
++ "maximum": 86400,
++ "description": "Seconds; 1 is the provider's automatic TTL."
++ },
++ "proxied": {
++ "type": [
++ "boolean",
++ "null"
++ ],
++ "description": "Cloudflare's proxy, for A, AAAA and CNAME; null elsewhere."
++ },
++ "priority": {
++ "type": [
++ "integer",
++ "null"
++ ],
++ "minimum": 0,
++ "maximum": 65535,
++ "description": "MX and SRV only."
++ },
++ "comment": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "maxLength": 100
++ }
++ }
++ },
++ {
++ "type": "null"
++ }
++ ]
++ },
++ "after": {
++ "oneOf": [
++ {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "type",
++ "name",
++ "content"
++ ],
++ "properties": {
++ "type": {
++ "enum": [
++ "A",
++ "AAAA",
++ "CNAME",
++ "TXT",
++ "MX",
++ "NS",
++ "CAA",
++ "SRV",
++ "DS"
++ ]
++ },
++ "name": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 253,
++ "description": "The full record name (example.com, www.example.com)."
++ },
++ "content": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 4096
++ },
++ "ttl": {
++ "type": "integer",
++ "minimum": 1,
++ "maximum": 86400,
++ "description": "Seconds; 1 is the provider's automatic TTL."
++ },
++ "proxied": {
++ "type": [
++ "boolean",
++ "null"
++ ],
++ "description": "Cloudflare's proxy, for A, AAAA and CNAME; null elsewhere."
++ },
++ "priority": {
++ "type": [
++ "integer",
++ "null"
++ ],
++ "minimum": 0,
++ "maximum": 65535,
++ "description": "MX and SRV only."
++ },
++ "comment": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "maxLength": 100
++ }
++ }
++ },
++ {
++ "type": "null"
++ }
++ ]
++ }
++ }
++ }
++ },
++ "created_by": {
++ "type": "string",
++ "pattern": "^(user|agent|service):",
++ "maxLength": 120
++ },
++ "created_at": {
++ "type": "string",
++ "format": "date-time"
++ },
++ "decided_at": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "format": "date-time"
++ },
++ "applied_at": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "format": "date-time"
++ },
++ "rolled_back_at": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "format": "date-time"
++ },
++ "expires_at": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "format": "date-time"
++ },
++ "error": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "maxLength": 400
++ },
++ "href": {
++ "type": "string",
++ "format": "uri",
++ "pattern": "^https://"
++ }
++ }
++}
ddiff --git a/contracts/network/me-actions-result.v1.json b/contracts/network/me-actions-result.v1.json
iindex 6d9b47c9..6f9a89f5 100644
---- a/contracts/network/me-actions-result.v1.json
++++ b/contracts/network/me-actions-result.v1.json
@@@ -96,6 +96,7 @@
"actor",
"codes",
"ai",
++ "domains",
"network",
"run"
]
ddiff --git a/fixtures/domains.proposal/invalid/bad-op.json b/fixtures/domains.proposal/invalid/bad-op.json
nnew file mode 100644
iindex 00000000..07ae0d26
---- /dev/null
++++ b/fixtures/domains.proposal/invalid/bad-op.json
@@@ -0,0 +1,26 @@
++{
++ "id": "dpr_01J8Z3Q4R5S6T7V8W9X0Y1Z2A3",
++ "domain": "example.com",
++ "provider": "cloudflare",
++ "connection_id": "dcn_01J8Z3Q4R5S6T7V8W9X0Y1Z2A4",
++ "title": "Add the TXT record that proves example.com is yours",
++ "why": "Your mail provider asks for it.",
++ "risk": "None: a TXT record changes no traffic.",
++ "status": "pending",
++ "changes": [
++ {
++ "op": "replace_all",
++ "record_id": null,
++ "before": null,
++ "after": null
++ }
++ ],
++ "created_by": "user:usr_01J8Z3Q4R5S6T7V8W9X0Y1Z2A5",
++ "created_at": "2026-10-28T18:00:00.000Z",
++ "decided_at": null,
++ "applied_at": null,
++ "rolled_back_at": null,
++ "expires_at": "2026-11-04T18:00:00.000Z",
++ "error": null,
++ "href": "https://openvibe.domains/panel/proposals/dpr_01J8Z3Q4R5S6T7V8W9X0Y1Z2A3"
++}
ddiff --git a/fixtures/domains.proposal/invalid/token-in-proposal.json b/fixtures/domains.proposal/invalid/token-in-proposal.json
nnew file mode 100644
iindex 00000000..831f28fe
---- /dev/null
++++ b/fixtures/domains.proposal/invalid/token-in-proposal.json
@@@ -0,0 +1,35 @@
++{
++ "id": "dpr_01J8Z3Q4R5S6T7V8W9X0Y1Z2A3",
++ "domain": "example.com",
++ "provider": "cloudflare",
++ "connection_id": "dcn_01J8Z3Q4R5S6T7V8W9X0Y1Z2A4",
++ "title": "Add the TXT record that proves example.com is yours",
++ "why": "Your mail provider asks for it.",
++ "risk": "None: a TXT record changes no traffic.",
++ "status": "pending",
++ "changes": [
++ {
++ "op": "create",
++ "record_id": null,
++ "before": null,
++ "after": {
++ "type": "TXT",
++ "name": "example.com",
++ "content": "proof=abc123",
++ "ttl": 1,
++ "proxied": null,
++ "priority": null,
++ "comment": null
++ }
++ }
++ ],
++ "created_by": "user:usr_01J8Z3Q4R5S6T7V8W9X0Y1Z2A5",
++ "created_at": "2026-10-28T18:00:00.000Z",
++ "decided_at": null,
++ "applied_at": null,
++ "rolled_back_at": null,
++ "expires_at": "2026-11-04T18:00:00.000Z",
++ "error": null,
++ "href": "https://openvibe.domains/panel/proposals/dpr_01J8Z3Q4R5S6T7V8W9X0Y1Z2A3",
++ "api_token": "example-not-a-secret"
++}
ddiff --git a/fixtures/domains.proposal/valid/create-txt.json b/fixtures/domains.proposal/valid/create-txt.json
nnew file mode 100644
iindex 00000000..f908e62a
---- /dev/null
++++ b/fixtures/domains.proposal/valid/create-txt.json
@@@ -0,0 +1,34 @@
++{
++ "id": "dpr_01J8Z3Q4R5S6T7V8W9X0Y1Z2A3",
++ "domain": "example.com",
++ "provider": "cloudflare",
++ "connection_id": "dcn_01J8Z3Q4R5S6T7V8W9X0Y1Z2A4",
++ "title": "Add the TXT record that proves example.com is yours",
++ "why": "Your mail provider asks for it.",
++ "risk": "None: a TXT record changes no traffic.",
++ "status": "pending",
++ "changes": [
++ {
++ "op": "create",
++ "record_id": null,
++ "before": null,
++ "after": {
++ "type": "TXT",
++ "name": "example.com",
++ "content": "proof=abc123",
++ "ttl": 1,
++ "proxied": null,
++ "priority": null,
++ "comment": null
++ }
++ }
++ ],
++ "created_by": "user:usr_01J8Z3Q4R5S6T7V8W9X0Y1Z2A5",
++ "created_at": "2026-10-28T18:00:00.000Z",
++ "decided_at": null,
++ "applied_at": null,
++ "rolled_back_at": null,
++ "expires_at": "2026-11-04T18:00:00.000Z",
++ "error": null,
++ "href": "https://openvibe.domains/panel/proposals/dpr_01J8Z3Q4R5S6T7V8W9X0Y1Z2A3"
++}
ddiff --git a/fixtures/domains.proposal/valid/update-applied.json b/fixtures/domains.proposal/valid/update-applied.json
nnew file mode 100644
iindex 00000000..df002da4
---- /dev/null
++++ b/fixtures/domains.proposal/valid/update-applied.json
@@@ -0,0 +1,42 @@
++{
++ "id": "dpr_01J8Z3Q4R5S6T7V8W9X0Y1Z2A3",
++ "domain": "example.com",
++ "provider": "cloudflare",
++ "connection_id": "dcn_01J8Z3Q4R5S6T7V8W9X0Y1Z2A4",
++ "title": "Add the TXT record that proves example.com is yours",
++ "why": "Your mail provider asks for it.",
++ "risk": "None: a TXT record changes no traffic.",
++ "status": "applied",
++ "changes": [
++ {
++ "op": "update",
++ "record_id": "372e67954025e0ba6aaa6d586b9e0b59",
++ "before": {
++ "type": "A",
++ "name": "www.example.com",
++ "content": "192.0.2.1",
++ "ttl": 1,
++ "proxied": true,
++ "priority": null,
++ "comment": null
++ },
++ "after": {
++ "type": "A",
++ "name": "www.example.com",
++ "content": "192.0.2.7",
++ "ttl": 1,
++ "proxied": true,
++ "priority": null,
++ "comment": null
++ }
++ }
++ ],
++ "created_by": "user:usr_01J8Z3Q4R5S6T7V8W9X0Y1Z2A5",
++ "created_at": "2026-10-28T18:00:00.000Z",
++ "decided_at": "2026-10-28T18:01:59.000Z",
++ "applied_at": "2026-10-28T18:02:00.000Z",
++ "rolled_back_at": null,
++ "expires_at": "2026-11-04T18:00:00.000Z",
++ "error": null,
++ "href": "https://openvibe.domains/panel/proposals/dpr_01J8Z3Q4R5S6T7V8W9X0Y1Z2A3"
++}
ddiff --git a/generated/json-schema/bundle.json b/generated/json-schema/bundle.json
iindex 0b79d7c9..30d2ea5c 100644
---- a/generated/json-schema/bundle.json
++++ b/generated/json-schema/bundle.json
@@@ -85309,7 +85309,8 @@
"codes",
"ai",
"network",
-- "run"
++ "run",
++ "domains"
],
"description": "The authority that owns the item."
},
@@@ -85317,7 +85318,7 @@
"type": "string",
"minLength": 1,
"maxLength": 80,
-- "description": "The authority's own id (tsk_…, a Codes task id, run_…, a confirmation id)."
++ "description": "The authority's own id (tsk_…, a Codes task id, run_…, a confirmation id, dpr_…)."
},
"kind": {
"enum": [
@@@ -85439,7 +85440,7 @@
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://openvibe.network/contracts/common/action-list-result.v1.json",
"title": "ActionListResult",
-- "description": "One authority's Action Center items for a person (capabilities actor.actions.read, codes.actions.read, ai.actions.read): GET /api/v1/actions?subject=usr_… with the caller's service token. Everything running, waiting or scheduled, then done and failed items from the last 30 days, newest first, at most 50.",
++ "description": "One authority's Action Center items for a person (capabilities actor.actions.read, codes.actions.read, ai.actions.read, domains.actions.read): GET /api/v1/actions?subject=usr_… with the caller's service token. Everything running, waiting or scheduled, then done and failed items from the last 30 days, newest first, at most 50.",
"type": "object",
"additionalProperties": false,
"required": [
@@@ -85558,6 +85559,7 @@
"actor",
"codes",
"ai",
++ "domains",
"network",
"run"
]
@@@ -86317,6 +86319,305 @@
}
}
}
++ },
++ "domains.proposal": {
++ "version": "1.0.0",
++ "owner": "domains",
++ "status": "active",
++ "schema": {
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/domains/proposal.v1.json",
++ "title": "DomainsProposal",
++ "description": "A change to a person's DNS on OpenVibe.Domains (plan 2026-10-28 §5.1): nothing an agent, a bulk edit or the person's own edit asks for touches DNS until the person approves it. A proposal holds the record diff, why, what could break, and its rollback; approving it applies the changes in order through the provider's API with the person's connected credential (a Network project secret, ADR-056, never part of this document). A change whose record moved since the proposal was made is refused as stale; rolling back applies the inverse changes.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "id",
++ "domain",
++ "provider",
++ "connection_id",
++ "title",
++ "status",
++ "changes",
++ "created_by",
++ "created_at",
++ "href"
++ ],
++ "properties": {
++ "id": {
++ "type": "string",
++ "pattern": "^dpr_[0-9A-HJKMNP-TV-Z]{26}$"
++ },
++ "domain": {
++ "type": "string",
++ "minLength": 3,
++ "maxLength": 253
++ },
++ "provider": {
++ "enum": [
++ "cloudflare",
++ "porkbun",
++ "namecheap",
++ "spaceship"
++ ]
++ },
++ "connection_id": {
++ "type": "string",
++ "pattern": "^dcn_[0-9A-HJKMNP-TV-Z]{26}$"
++ },
++ "title": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 160
++ },
++ "why": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "maxLength": 1000
++ },
++ "risk": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "maxLength": 1000,
++ "description": "What could break, in plain words."
++ },
++ "status": {
++ "enum": [
++ "pending",
++ "applying",
++ "applied",
++ "declined",
++ "failed",
++ "rolled_back",
++ "expired"
++ ]
++ },
++ "changes": {
++ "type": "array",
++ "minItems": 1,
++ "maxItems": 50,
++ "items": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "op"
++ ],
++ "properties": {
++ "op": {
++ "enum": [
++ "create",
++ "update",
++ "delete"
++ ]
++ },
++ "record_id": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "maxLength": 64,
++ "description": "The provider's record id (update, delete; a create's after it is applied)."
++ },
++ "before": {
++ "oneOf": [
++ {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "type",
++ "name",
++ "content"
++ ],
++ "properties": {
++ "type": {
++ "enum": [
++ "A",
++ "AAAA",
++ "CNAME",
++ "TXT",
++ "MX",
++ "NS",
++ "CAA",
++ "SRV",
++ "DS"
++ ]
++ },
++ "name": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 253,
++ "description": "The full record name (example.com, www.example.com)."
++ },
++ "content": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 4096
++ },
++ "ttl": {
++ "type": "integer",
++ "minimum": 1,
++ "maximum": 86400,
++ "description": "Seconds; 1 is the provider's automatic TTL."
++ },
++ "proxied": {
++ "type": [
++ "boolean",
++ "null"
++ ],
++ "description": "Cloudflare's proxy, for A, AAAA and CNAME; null elsewhere."
++ },
++ "priority": {
++ "type": [
++ "integer",
++ "null"
++ ],
++ "minimum": 0,
++ "maximum": 65535,
++ "description": "MX and SRV only."
++ },
++ "comment": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "maxLength": 100
++ }
++ }
++ },
++ {
++ "type": "null"
++ }
++ ]
++ },
++ "after": {
++ "oneOf": [
++ {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "type",
++ "name",
++ "content"
++ ],
++ "properties": {
++ "type": {
++ "enum": [
++ "A",
++ "AAAA",
++ "CNAME",
++ "TXT",
++ "MX",
++ "NS",
++ "CAA",
++ "SRV",
++ "DS"
++ ]
++ },
++ "name": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 253,
++ "description": "The full record name (example.com, www.example.com)."
++ },
++ "content": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 4096
++ },
++ "ttl": {
++ "type": "integer",
++ "minimum": 1,
++ "maximum": 86400,
++ "description": "Seconds; 1 is the provider's automatic TTL."
++ },
++ "proxied": {
++ "type": [
++ "boolean",
++ "null"
++ ],
++ "description": "Cloudflare's proxy, for A, AAAA and CNAME; null elsewhere."
++ },
++ "priority": {
++ "type": [
++ "integer",
++ "null"
++ ],
++ "minimum": 0,
++ "maximum": 65535,
++ "description": "MX and SRV only."
++ },
++ "comment": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "maxLength": 100
++ }
++ }
++ },
++ {
++ "type": "null"
++ }
++ ]
++ }
++ }
++ }
++ },
++ "created_by": {
++ "type": "string",
++ "pattern": "^(user|agent|service):",
++ "maxLength": 120
++ },
++ "created_at": {
++ "type": "string",
++ "format": "date-time"
++ },
++ "decided_at": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "format": "date-time"
++ },
++ "applied_at": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "format": "date-time"
++ },
++ "rolled_back_at": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "format": "date-time"
++ },
++ "expires_at": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "format": "date-time"
++ },
++ "error": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "maxLength": 400
++ },
++ "href": {
++ "type": "string",
++ "format": "uri",
++ "pattern": "^https://"
++ }
++ }
++ }
}
}
}
ddiff --git a/generated/openapi/actor.json b/generated/openapi/actor.json
iindex 69441224..2c2530b7 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.232.0",
-- "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.232.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.233.0",
++ "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.233.0): each operation lists the capabilities it performs; a token for the 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"
@@@ -2282,7 +2282,8 @@
"codes",
"ai",
"network",
-- "run"
++ "run",
++ "domains"
],
"description": "The authority that owns the item."
},
@@@ -2290,7 +2291,7 @@
"type": "string",
"minLength": 1,
"maxLength": 80,
-- "description": "The authority's own id (tsk_…, a Codes task id, run_…, a confirmation id)."
++ "description": "The authority's own id (tsk_…, a Codes task id, run_…, a confirmation id, dpr_…)."
},
"kind": {
"enum": [
@@@ -2405,7 +2406,7 @@
},
"common.action-list-result.v1": {
"title": "ActionListResult",
-- "description": "One authority's Action Center items for a person (capabilities actor.actions.read, codes.actions.read, ai.actions.read): GET /api/v1/actions?subject=usr_… with the caller's service token. Everything running, waiting or scheduled, then done and failed items from the last 30 days, newest first, at most 50.",
++ "description": "One authority's Action Center items for a person (capabilities actor.actions.read, codes.actions.read, ai.actions.read, domains.actions.read): GET /api/v1/actions?subject=usr_… with the caller's service token. Everything running, waiting or scheduled, then done and failed items from the last 30 days, newest first, at most 50.",
"type": "object",
"additionalProperties": false,
"required": [
ddiff --git a/generated/openapi/ai.json b/generated/openapi/ai.json
iindex 7382c70e..8eeb4148 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.232.0",
-- "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.232.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.233.0",
++ "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.233.0): each operation lists the capabilities it performs; a token for the 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"
@@@ -5092,7 +5092,8 @@
"codes",
"ai",
"network",
-- "run"
++ "run",
++ "domains"
],
"description": "The authority that owns the item."
},
@@@ -5100,7 +5101,7 @@
"type": "string",
"minLength": 1,
"maxLength": 80,
-- "description": "The authority's own id (tsk_…, a Codes task id, run_…, a confirmation id)."
++ "description": "The authority's own id (tsk_…, a Codes task id, run_…, a confirmation id, dpr_…)."
},
"kind": {
"enum": [
@@@ -5215,7 +5216,7 @@
},
"common.action-list-result.v1": {
"title": "ActionListResult",
-- "description": "One authority's Action Center items for a person (capabilities actor.actions.read, codes.actions.read, ai.actions.read): GET /api/v1/actions?subject=usr_… with the caller's service token. Everything running, waiting or scheduled, then done and failed items from the last 30 days, newest first, at most 50.",
++ "description": "One authority's Action Center items for a person (capabilities actor.actions.read, codes.actions.read, ai.actions.read, domains.actions.read): GET /api/v1/actions?subject=usr_… with the caller's service token. Everything running, waiting or scheduled, then done and failed items from the last 30 days, newest first, at most 50.",
"type": "object",
"additionalProperties": false,
"required": [
ddiff --git a/generated/openapi/billing.json b/generated/openapi/billing.json
iindex aee89454..1ba12d05 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.232.0",
-- "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.232.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.233.0",
++ "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.233.0): each operation lists the capabilities it performs; a token for the 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 14b1c877..d3c11686 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.232.0",
-- "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.232.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.233.0",
++ "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.233.0): each operation lists the capabilities it performs; a token for the 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 7799f2d1..ece16030 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.232.0",
-- "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.232.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.233.0",
++ "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.233.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/chat.json b/generated/openapi/chat.json
iindex 8fa4808f..e2c612a2 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.232.0",
-- "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.232.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.233.0",
++ "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.233.0): each operation lists the capabilities it performs; a token for the 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 5b06fa59..cf7e7527 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.232.0",
-- "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.232.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.233.0",
++ "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.233.0): each operation lists the capabilities it performs; a token for the 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"
@@@ -503,7 +503,8 @@
"codes",
"ai",
"network",
-- "run"
++ "run",
++ "domains"
],
"description": "The authority that owns the item."
},
@@@ -511,7 +512,7 @@
"type": "string",
"minLength": 1,
"maxLength": 80,
-- "description": "The authority's own id (tsk_…, a Codes task id, run_…, a confirmation id)."
++ "description": "The authority's own id (tsk_…, a Codes task id, run_…, a confirmation id, dpr_…)."
},
"kind": {
"enum": [
@@@ -626,7 +627,7 @@
},
"common.action-list-result.v1": {
"title": "ActionListResult",
-- "description": "One authority's Action Center items for a person (capabilities actor.actions.read, codes.actions.read, ai.actions.read): GET /api/v1/actions?subject=usr_… with the caller's service token. Everything running, waiting or scheduled, then done and failed items from the last 30 days, newest first, at most 50.",
++ "description": "One authority's Action Center items for a person (capabilities actor.actions.read, codes.actions.read, ai.actions.read, domains.actions.read): GET /api/v1/actions?subject=usr_… with the caller's service token. Everything running, waiting or scheduled, then done and failed items from the last 30 days, newest first, at most 50.",
"type": "object",
"additionalProperties": false,
"required": [
ddiff --git a/generated/openapi/community.json b/generated/openapi/community.json
iindex 2588b9dd..14bea71e 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.232.0",
-- "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.232.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.233.0",
++ "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.233.0): each operation lists the capabilities it performs; a token for the 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 d2696290..118a5ae9 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.232.0",
-- "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.232.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.233.0",
++ "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.233.0): each operation lists the capabilities it performs; a token for the 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 2a82891c..ba793a02 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.232.0",
-- "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.232.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.233.0",
++ "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.233.0): each operation lists the capabilities it performs; a token for the 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
nnew file mode 100644
iindex 00000000..41cfe641
---- /dev/null
++++ b/generated/openapi/domains.json
@@@ -0,0 +1,364 @@
++{
++ "openapi": "3.1.0",
++ "jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
++ "info": {
++ "title": "OpenVibe.Domains API",
++ "version": "0.233.0",
++ "description": "Routes of OpenVibe.Domains as the OpenVibe contracts describe them (openvibe-contracts 0.233.0): each operation lists the capabilities it performs; a token for the 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"
++ }
++ },
++ "servers": [
++ {
++ "url": "https://openvibe.domains"
++ }
++ ],
++ "paths": {
++ "/api/v1/actions": {
++ "get": {
++ "operationId": "get_api_v1_actions",
++ "summary": "Read one person's Action Center items from OpenVibe.Domains (plan 2026-10-28 §3.10, §5.1): their DNS change proposals (waiting for approval, applied, failed or rolled back in the last 30 days), as com",
++ "description": "**domains.actions.read** (first-party): Read one person's Action Center items from OpenVibe.Domains (plan 2026-10-28 §3.10, §5.1): their DNS change proposals (waiting for approval, applied, failed or rolled back in the last 30 days), as common.action-list-result@1. GET /api/v1/actions?subject=usr_… with a service token; granted to OpenVibe.Network's aggregator only. Never another person's items, never a credential, and only the fields of common.action-item@1.",
++ "tags": [
++ "domains.actions"
++ ],
++ "x-openvibe-capabilities": [
++ "domains.actions.read"
++ ],
++ "x-openvibe-visibility": [
++ "first-party"
++ ],
++ "x-openvibe-quota-class": "standard",
++ "security": [
++ {
++ "openvibeToken": [
++ "domains.actions.read"
++ ]
++ }
++ ],
++ "responses": {
++ "2XX": {
++ "description": "Success",
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/common.action-list-result.v1"
++ }
++ }
++ }
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ }
++ },
++ "/api/v1/proposals/{id}/decide": {
++ "post": {
++ "operationId": "post_api_v1_proposals_id_decide",
++ "summary": "Approve or decline a pending OpenVibe.Domains proposal for its person (plan 2026-10-28 §5.1: no change touches DNS until its person approves it): POST /api/v1/proposals/:id/decide { decision: approve ",
++ "description": "**domains.proposal.decide** (first-party): Approve or decline a pending OpenVibe.Domains proposal for its person (plan 2026-10-28 §5.1: no change touches DNS until its person approves it): POST /api/v1/proposals/:id/decide { decision: approve | decline } with a service token and X-OV-Subject naming the proposal's owner, the same decision the person makes on the proposal's page. Approving applies the change through the provider's API with the person's connected credential; the proposal keeps its rollback. Granted to OpenVibe.Network, which acts from the Action Center for the signed-in person.",
++ "tags": [
++ "domains.proposal"
++ ],
++ "x-openvibe-capabilities": [
++ "domains.proposal.decide"
++ ],
++ "x-openvibe-visibility": [
++ "first-party"
++ ],
++ "x-openvibe-quota-class": "standard",
++ "security": [
++ {
++ "openvibeToken": [
++ "domains.proposal.decide"
++ ]
++ }
++ ],
++ "parameters": [
++ {
++ "name": "id",
++ "in": "path",
++ "required": true,
++ "schema": {
++ "type": "string"
++ }
++ }
++ ],
++ "responses": {
++ "2XX": {
++ "description": "Success",
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/common.action-item.v1"
++ }
++ }
++ }
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ }
++ }
++ },
++ "components": {
++ "schemas": {
++ "common.action-item.v1": {
++ "title": "ActionItem",
++ "description": "One piece of a person's agent work in the Action Center (plan 2026-10-28 §3.10): an agent task, a coding task, an AI run, or an approval waiting on them. Each authority answers its own items in this shape (common.action-list-result@1); OpenVibe.Network merges them into buckets (network.me-actions-result@1). Text is plain (no markup); a cost is what the person was charged in USD, null when unknown or free; href is a page on the authority's own public site.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "service",
++ "id",
++ "kind",
++ "title",
++ "bucket",
++ "state",
++ "created_at",
++ "updated_at",
++ "href",
++ "actions"
++ ],
++ "properties": {
++ "service": {
++ "enum": [
++ "actor",
++ "codes",
++ "ai",
++ "network",
++ "run",
++ "domains"
++ ],
++ "description": "The authority that owns the item."
++ },
++ "id": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 80,
++ "description": "The authority's own id (tsk_…, a Codes task id, run_…, a confirmation id, dpr_…)."
++ },
++ "kind": {
++ "enum": [
++ "agent_task",
++ "code_task",
++ "ai_run",
++ "approval",
++ "desk_session"
++ ],
++ "description": "What the item is."
++ },
++ "title": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 160,
++ "description": "A short plain-text name: the start of the task text, the workflow, or what the approval is for."
++ },
++ "summary": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "maxLength": 400,
++ "description": "The last step, the outcome, or what will happen on approval."
++ },
++ "bucket": {
++ "enum": [
++ "running",
++ "waiting",
++ "scheduled",
++ "done",
++ "failed"
++ ],
++ "description": "Where the Action Center shows it: running (queued or working), waiting (needs the person), scheduled (will run later), done, failed (failed, cancelled or expired)."
++ },
++ "state": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 32,
++ "description": "The authority's own state word (queued, running, needs_you, succeeded, failed, cancelled, pending…)."
++ },
++ "agent": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "maxLength": 80,
++ "description": "The agent, model or workflow doing it, when known."
++ },
++ "cost_usd": {
++ "type": [
++ "number",
++ "null"
++ ],
++ "minimum": 0,
++ "description": "What it cost the person, in US dollars; null when unknown or free."
++ },
++ "steps": {
++ "type": [
++ "integer",
++ "null"
++ ],
++ "minimum": 0,
++ "description": "Tool calls or steps so far, when counted."
++ },
++ "error": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "maxLength": 400,
++ "description": "Why it failed, in words a person can act on."
++ },
++ "created_at": {
++ "type": "string",
++ "format": "date-time"
++ },
++ "updated_at": {
++ "type": "string",
++ "format": "date-time"
++ },
++ "next_run_at": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "format": "date-time",
++ "description": "When a scheduled item runs next."
++ },
++ "href": {
++ "type": "string",
++ "format": "uri",
++ "pattern": "^https://",
++ "maxLength": 2048,
++ "description": "The item's page: its live steps, receipt or approval."
++ },
++ "actions": {
++ "type": "array",
++ "maxItems": 4,
++ "description": "What the person can do from the list. approve/decline/cancel/retry go through OpenVibe.Network (POST /api/v1/me/actions/:service/:id/:action); open is a link.",
++ "items": {
++ "enum": [
++ "open",
++ "approve",
++ "decline",
++ "cancel",
++ "retry"
++ ]
++ }
++ }
++ }
++ },
++ "common.action-list-result.v1": {
++ "title": "ActionListResult",
++ "description": "One authority's Action Center items for a person (capabilities actor.actions.read, codes.actions.read, ai.actions.read, domains.actions.read): GET /api/v1/actions?subject=usr_… with the caller's service token. Everything running, waiting or scheduled, then done and failed items from the last 30 days, newest first, at most 50.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "items"
++ ],
++ "properties": {
++ "items": {
++ "type": "array",
++ "maxItems": 50,
++ "items": {
++ "$ref": "#/components/schemas/common.action-item.v1"
++ }
++ }
++ }
++ },
++ "errors.problem.v1": {
++ "title": "Problem",
++ "description": "RFC 9457 problem details (application/problem+json) with a stable OpenVibe error code and trace identifiers. The legacy 'error' string is allowed during migration so existing clients keep working.",
++ "type": "object",
++ "required": [
++ "type",
++ "title",
++ "status",
++ "code"
++ ],
++ "additionalProperties": true,
++ "properties": {
++ "type": {
++ "type": "string",
++ "format": "uri-reference"
++ },
++ "title": {
++ "type": "string",
++ "minLength": 1
++ },
++ "status": {
++ "type": "integer",
++ "minimum": 400,
++ "maximum": 599
++ },
++ "detail": {
++ "type": "string"
++ },
++ "instance": {
++ "type": "string",
++ "format": "uri-reference"
++ },
++ "code": {
++ "type": "string",
++ "pattern": "^[a-z][a-z0-9_]*(\\.[a-z0-9_]+)*$"
++ },
++ "request_id": {
++ "type": "string"
++ },
++ "trace_id": {
++ "type": "string",
++ "pattern": "^[0-9a-f]{32}$"
++ },
++ "errors": {
++ "type": "array",
++ "items": {
++ "type": "object",
++ "required": [
++ "message"
++ ],
++ "properties": {
++ "path": {
++ "type": "string"
++ },
++ "message": {
++ "type": "string"
++ }
++ }
++ }
++ },
++ "error": {
++ "type": "string",
++ "description": "Deprecated compatibility field: same text as title/detail for clients that read {error}."
++ }
++ }
++ }
++ },
++ "securitySchemes": {
++ "openvibeToken": {
++ "type": "http",
++ "scheme": "bearer",
++ "bearerFormat": "JWT",
++ "description": "An OpenVibe Network token for this service: a person's token, an app token (client credentials, audience of the service) or a first-party service token. Its `cap` claim must include the capability the operation names."
++ }
++ }
++ }
++}
ddiff --git a/generated/openapi/events.json b/generated/openapi/events.json
iindex d10eb3c6..998e5bc8 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.232.0",
-- "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.232.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.233.0",
++ "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.233.0): each operation lists the capabilities it performs; a token for the 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 4174ccfe..907f191f 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.232.0",
-- "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.232.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.233.0",
++ "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.233.0): each operation lists the capabilities it performs; a token for the 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 65d78db7..17513c6f 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.232.0",
-- "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.232.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.233.0",
++ "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.233.0): each operation lists the capabilities it performs; a token for the 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 113e08a3..b97a57ee 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.232.0",
-- "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.232.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.233.0",
++ "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.233.0): each operation lists the capabilities it performs; a token for the 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 90a22ae2..c4d67967 100644
---- a/generated/openapi/index.json
++++ b/generated/openapi/index.json
@@@ -71,6 +71,13 @@
"operations": 18,
"capabilities": 12
},
++ {
++ "service": "domains",
++ "name": "OpenVibe.Domains",
++ "origin": "https://openvibe.domains",
++ "operations": 2,
++ "capabilities": 2
++ },
{
"service": "events",
"name": "OpenVibe.Events",
ddiff --git a/generated/openapi/inventory.json b/generated/openapi/inventory.json
iindex d240f5ef..88ba5839 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.232.0",
-- "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.232.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.233.0",
++ "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.233.0): each operation lists the capabilities it performs; a token for the 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 77ed8d36..91fe0dd5 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.232.0",
-- "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.232.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.233.0",
++ "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.233.0): each operation lists the capabilities it performs; a token for the 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 3847ddd6..389db778 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.232.0",
-- "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.232.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.233.0",
++ "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.233.0): each operation lists the capabilities it performs; a token for the 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 ec5ade57..5d376e80 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.232.0",
-- "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.232.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.233.0",
++ "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.233.0): each operation lists the capabilities it performs; a token for the 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 bb34b765..178f79e8 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.232.0",
-- "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.232.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.233.0",
++ "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.233.0): each operation lists the capabilities it performs; a token for the 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"
@@@ -2520,7 +2520,8 @@
"codes",
"ai",
"network",
-- "run"
++ "run",
++ "domains"
],
"description": "The authority that owns the item."
},
@@@ -2528,7 +2529,7 @@
"type": "string",
"minLength": 1,
"maxLength": 80,
-- "description": "The authority's own id (tsk_…, a Codes task id, run_…, a confirmation id)."
++ "description": "The authority's own id (tsk_…, a Codes task id, run_…, a confirmation id, dpr_…)."
},
"kind": {
"enum": [
@@@ -3952,6 +3953,7 @@
"actor",
"codes",
"ai",
++ "domains",
"network",
"run"
]
ddiff --git a/generated/openapi/news.json b/generated/openapi/news.json
iindex ad6e38d2..26136512 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.232.0",
-- "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.232.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.233.0",
++ "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.233.0): each operation lists the capabilities it performs; a token for the 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 af463d97..5b4be0f7 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.232.0",
-- "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.232.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.233.0",
++ "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.233.0): each operation lists the capabilities it performs; a token for the 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 1d4fd63c..51b60109 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.232.0",
-- "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.232.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.233.0",
++ "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.233.0): each operation lists the capabilities it performs; a token for the 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 1cc0dbfe..27ab747f 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.232.0",
-- "description": "Routes of OpenVibe.Quest as the OpenVibe contracts describe them (openvibe-contracts 0.232.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.233.0",
++ "description": "Routes of OpenVibe.Quest as the OpenVibe contracts describe them (openvibe-contracts 0.233.0): each operation lists the capabilities it performs; a token for the 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 6ae21512..b7e03f30 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.232.0",
-- "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.232.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.233.0",
++ "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.233.0): each operation lists the capabilities it performs; a token for the 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 4931f2ad..e1def4ad 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.232.0",
-- "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.232.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.233.0",
++ "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.233.0): each operation lists the capabilities it performs; a token for the 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 4b6ee630..ef630cfd 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.232.0",
-- "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.232.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.233.0",
++ "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.233.0): each operation lists the capabilities it performs; a token for the 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 531be267..0a09f53f 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.232.0",
-- "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.232.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.233.0",
++ "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.233.0): each operation lists the capabilities it performs; a token for the 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 b85bac81..a3658c31 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.232.0",
-- "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.232.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.233.0",
++ "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.233.0): each operation lists the capabilities it performs; a token for the 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 172fb270..4207958e 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.232.0",
-- "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.232.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.233.0",
++ "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.233.0): each operation lists the capabilities it performs; a token for the 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 8ba565b6..3afb4ca2 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.232.0",
-- "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.232.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.233.0",
++ "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.233.0): each operation lists the capabilities it performs; a token for the 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 f3cfd8d5..b486245b 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.232.0",
-- "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.232.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.233.0",
++ "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.233.0): each operation lists the capabilities it performs; a token for the 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 f23899f9..4d479bed 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.232.0",
-- "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.232.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.233.0",
++ "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.233.0): each operation lists the capabilities it performs; a token for the 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 a4b120aa..8ee1b026 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.232.0",
-- "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.232.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.233.0",
++ "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.233.0): each operation lists the capabilities it performs; a token for the 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 54b18e45..ec577e1f 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.232.0",
-- "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.232.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.233.0",
++ "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.233.0): each operation lists the capabilities it performs; a token for the 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 2a8b7eaf..bdfb1878 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.232.0",
-- "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.232.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.233.0",
++ "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.233.0): each operation lists the capabilities it performs; a token for the 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 68e76837..2f600d30 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.232.0",
-- "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.232.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.233.0",
++ "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.233.0): each operation lists the capabilities it performs; a token for the 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 6a0447f1..c026a9ab 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.232.0",
-- "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.232.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.233.0",
++ "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.233.0): each operation lists the capabilities it performs; a token for the 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 072d70d7..9d86807d 100644
---- a/generated/typescript/index.d.ts
++++ b/generated/typescript/index.d.ts
@@@ -212425,9 +212425,9 @@ export interface ActionItem {
/**
* The authority that owns the item.
*/
-- service: "actor" | "codes" | "ai" | "network" | "run";
++ service: "actor" | "codes" | "ai" | "network" | "run" | "domains";
/**
-- * The authority's own id (tsk_…, a Codes task id, run_…, a confirmation id).
++ * The authority's own id (tsk_…, a Codes task id, run_…, a confirmation id, dpr_…).
*/
id: string;
/**
@@@ -212500,7 +212500,7 @@ export interface ActionItem {
/** [email protected] (owner: contracts) */
/**
-- * One authority's Action Center items for a person (capabilities actor.actions.read, codes.actions.read, ai.actions.read): GET /api/v1/actions?subject=usr_… with the caller's service token. Everything running, waiting or scheduled, then done and failed items from the last 30 days, newest first, at most 50.
++ * One authority's Action Center items for a person (capabilities actor.actions.read, codes.actions.read, ai.actions.read, domains.actions.read): GET /api/v1/actions?subject=usr_… with the caller's service token. Everything running, waiting or scheduled, then done and failed items from the last 30 days, newest first, at most 50.
*/
export interface ActionListResult {
/**
@@@ -212728,3 +212728,133 @@ export interface CodesTaskCancelledPayload {
finished_at: string | null;
error: string | null;
}
++
++/** [email protected] (owner: domains) */
++/**
++ * A change to a person's DNS on OpenVibe.Domains (plan 2026-10-28 §5.1): nothing an agent, a bulk edit or the person's own edit asks for touches DNS until the person approves it. A proposal holds the record diff, why, what could break, and its rollback; approving it applies the changes in order through the provider's API with the person's connected credential (a Network project secret, ADR-056, never part of this document). A change whose record moved since the proposal was made is refused as stale; rolling back applies the inverse changes.
++ */
++export interface DomainsProposal {
++ id: string;
++ domain: string;
++ provider: "cloudflare" | "porkbun" | "namecheap" | "spaceship";
++ connection_id: string;
++ title: string;
++ why?: string | null;
++ /**
++ * What could break, in plain words.
++ */
++ risk?: string | null;
++ status: "pending" | "applying" | "applied" | "declined" | "failed" | "rolled_back" | "expired";
++ /**
++ * @minItems 1
++ * @maxItems 50
++ */
++ changes: [
++ {
++ op: "create" | "update" | "delete";
++ /**
++ * The provider's record id (update, delete; a create's after it is applied).
++ */
++ record_id?: string | null;
++ before?: {
++ type: "A" | "AAAA" | "CNAME" | "TXT" | "MX" | "NS" | "CAA" | "SRV" | "DS";
++ /**
++ * The full record name (example.com, www.example.com).
++ */
++ name: string;
++ content: string;
++ /**
++ * Seconds; 1 is the provider's automatic TTL.
++ */
++ ttl?: number;
++ /**
++ * Cloudflare's proxy, for A, AAAA and CNAME; null elsewhere.
++ */
++ proxied?: boolean | null;
++ /**
++ * MX and SRV only.
++ */
++ priority?: number | null;
++ comment?: string | null;
++ } | null;
++ after?: {
++ type: "A" | "AAAA" | "CNAME" | "TXT" | "MX" | "NS" | "CAA" | "SRV" | "DS";
++ /**
++ * The full record name (example.com, www.example.com).
++ */
++ name: string;
++ content: string;
++ /**
++ * Seconds; 1 is the provider's automatic TTL.
++ */
++ ttl?: number;
++ /**
++ * Cloudflare's proxy, for A, AAAA and CNAME; null elsewhere.
++ */
++ proxied?: boolean | null;
++ /**
++ * MX and SRV only.
++ */
++ priority?: number | null;
++ comment?: string | null;
++ } | null;
++ },
++ ...{
++ op: "create" | "update" | "delete";
++ /**
++ * The provider's record id (update, delete; a create's after it is applied).
++ */
++ record_id?: string | null;
++ before?: {
++ type: "A" | "AAAA" | "CNAME" | "TXT" | "MX" | "NS" | "CAA" | "SRV" | "DS";
++ /**
++ * The full record name (example.com, www.example.com).
++ */
++ name: string;
++ content: string;
++ /**
++ * Seconds; 1 is the provider's automatic TTL.
++ */
++ ttl?: number;
++ /**
++ * Cloudflare's proxy, for A, AAAA and CNAME; null elsewhere.
++ */
++ proxied?: boolean | null;
++ /**
++ * MX and SRV only.
++ */
++ priority?: number | null;
++ comment?: string | null;
++ } | null;
++ after?: {
++ type: "A" | "AAAA" | "CNAME" | "TXT" | "MX" | "NS" | "CAA" | "SRV" | "DS";
++ /**
++ * The full record name (example.com, www.example.com).
++ */
++ name: string;
++ content: string;
++ /**
++ * Seconds; 1 is the provider's automatic TTL.
++ */
++ ttl?: number;
++ /**
++ * Cloudflare's proxy, for A, AAAA and CNAME; null elsewhere.
++ */
++ proxied?: boolean | null;
++ /**
++ * MX and SRV only.
++ */
++ priority?: number | null;
++ comment?: string | null;
++ } | null;
++ }[]
++ ];
++ created_by: string;
++ created_at: string;
++ decided_at?: string | null;
++ applied_at?: string | null;
++ rolled_back_at?: string | null;
++ expires_at?: string | null;
++ error?: string | null;
++ href: string;
++}
ddiff --git a/manifests/capabilities/domains.actions.read.json b/manifests/capabilities/domains.actions.read.json
nnew file mode 100644
iindex 00000000..c8c8d1ea
---- /dev/null
++++ b/manifests/capabilities/domains.actions.read.json
@@@ -0,0 +1,21 @@
++{
++ "id": "domains.actions.read",
++ "version": "1.0",
++ "owner": "domains",
++ "status": "active",
++ "visibility": "first-party",
++ "description": "Read one person's Action Center items from OpenVibe.Domains (plan 2026-10-28 §3.10, §5.1): their DNS change proposals (waiting for approval, applied, failed or rolled back in the last 30 days), as common.action-list-result@1. GET /api/v1/actions?subject=usr_… with a service token; granted to OpenVibe.Network's aggregator only. Never another person's items, never a credential, and only the fields of common.action-item@1.",
++ "permissions": [
++ "domains:read"
++ ],
++ "resourceConstraints": [
++ "none"
++ ],
++ "quotaClass": "standard",
++ "events": [],
++ "implementedBy": [
++ "GET /api/v1/actions"
++ ],
++ "inputSchema": "common.no-body@1",
++ "outputSchema": "common.action-list-result@1"
++}
ddiff --git a/manifests/capabilities/domains.proposal.decide.json b/manifests/capabilities/domains.proposal.decide.json
nnew file mode 100644
iindex 00000000..c201966f
---- /dev/null
++++ b/manifests/capabilities/domains.proposal.decide.json
@@@ -0,0 +1,21 @@
++{
++ "id": "domains.proposal.decide",
++ "version": "1.0",
++ "owner": "domains",
++ "status": "active",
++ "visibility": "first-party",
++ "description": "Approve or decline a pending OpenVibe.Domains proposal for its person (plan 2026-10-28 §5.1: no change touches DNS until its person approves it): POST /api/v1/proposals/:id/decide { decision: approve | decline } with a service token and X-OV-Subject naming the proposal's owner, the same decision the person makes on the proposal's page. Approving applies the change through the provider's API with the person's connected credential; the proposal keeps its rollback. Granted to OpenVibe.Network, which acts from the Action Center for the signed-in person.",
++ "permissions": [
++ "domains:write"
++ ],
++ "resourceConstraints": [
++ "none"
++ ],
++ "quotaClass": "standard",
++ "events": [],
++ "implementedBy": [
++ "POST /api/v1/proposals/:id/decide"
++ ],
++ "inputSchema": "common.no-body@1",
++ "outputSchema": "common.action-item@1"
++}
ddiff --git a/manifests/services/domains.json b/manifests/services/domains.json
iindex b83d1b5b..42016618 100644
---- a/manifests/services/domains.json
++++ b/manifests/services/domains.json
@@@ -1,7 +1,7 @@
{
"version": "0.1.0",
"contractRanges": {
-- "openvibe-contracts": ">=0.225.0 <1.0.0"
++ "openvibe-contracts": ">=0.233.0 <1.0.0"
},
"id": "domains",
"name": "OpenVibe.Domains",
@@@ -15,7 +15,10 @@
"state": "live",
"publicSite": "service"
},
-- "capabilities": [],
++ "capabilities": [
++ "domains.actions.read",
++ "domains.proposal.decide"
++ ],
"eventsProduced": [],
"eventsConsumed": [],
"namespacesOwned": [
@@@ -37,7 +40,11 @@
"resumes": [
{
"kind": "state",
-- "what": "nothing to rebuild: v1 reads prices from OpenVibe.Host and history from OpenVibe.Tools on demand; a restart only empties the minutes-long in-memory cache, refilled on the next request"
++ "what": "connections, synced zones, proposals and their audit are rows in ov_domains; the price catalog stays in OpenVibe.Host and the net tools in OpenVibe.Tools"
++ },
++ {
++ "kind": "jobs",
++ "what": "a proposal a stop left 'applying' is marked failed at boot with what was applied, so its person can roll it back; a credential is never held outside one call"
}
]
},
@@@ -48,17 +55,17 @@
],
"window": "automatic only while ovhost waits for readiness after the restart; manual afterwards, as long as no blocker applies",
"blockers": {
-- "none": "v1 has no database and no migrations"
++ "none": "migration 0001 only creates Domains' own tables (connections, zones, proposals, audit); an earlier release reads none of them"
}
},
"contracts": {
-- "range": ">=0.225.0 <1.0.0"
++ "range": ">=0.233.0 <1.0.0"
},
"leases": {
"none": "no claims: one process serves the site"
}
},
-- "notes": "Port 5070, unit openvibe-domains.service. The Domains room (plan 2026-10-28 \u00a75.1): one box prices a name across every ending and registrar with 1-, 3- and 5-year totals and the renewal trap flagged; a page per ending with its price history; a page per domain with its public history. v1 is a stateless front over OpenVibe.Host's price catalog (catalog_tld_prices, fed by Sources) and OpenVibe.Tools' domain history; v2 adds the control panel (registrar connections as Network project secrets, the portfolio and change proposals), which is the domains.* authority.",
++ "notes": "Port 5070, unit openvibe-domains.service, database ov_domains. The Domains room (plan 2026-10-28 §5.1). v1: one box prices a name across every ending with 1/3/5-year totals (Host's price catalog), TLD pages, and domain info from OpenVibe.Tools' net tools. v2, the control panel: a signed-in person (OAuth client `domains`) connects a registrar or DNS account through its official API, Cloudflare first. The credential is stored as a Network project secret in the person's own project (ADR-056), granted to `domains` for reveal to the provider's origin only, and revealed per call (network.secret.use); Domains keeps its name, never its value. Every DNS change is a proposal (domains.proposal@1) with the record diff, why, the risk and its rollback; nothing touches DNS until the person approves it on the proposal's page or in the Action Center (domains.actions.read, domains.proposal.decide for OpenVibe.Network). A change whose record moved since the proposal is refused as stale; an applied proposal can be rolled back. Answers account export and deletion (ADR-033).",
"health": "/api/health",
"ready": "/api/ready",
"internalOrigin": "http://127.0.0.1:5070",
ddiff --git a/package.json b/package.json
iindex 762b03a8..6485c514 100644
---- a/package.json
++++ b/package.json
@@@ -1,6 +1,6 @@
{
"name": "openvibe-contracts",
-- "version": "0.232.0",
++ "version": "0.233.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",