openvibers/openvibe.contracts Commits
0.233.0: domains.proposal@1, domains.actions.read and domains.proposal.decide; the Action Center knows domains (#241)
Changes
@@@ -4,6 +4,18 @@ All notable changes to `openvibe-contracts`. Releases are git tags (`vX.Y.Z`) thfrom `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@@@ -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"}]}@@@ -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": [@@@ -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": [nnew file mode 100644@@@ -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://"++ }++ }++}@@@ -96,6 +96,7 @@"actor","codes","ai",++ "domains","network","run"]nnew file mode 100644@@@ -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"++}nnew file mode 100644@@@ -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"++}nnew file mode 100644@@@ -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"++}nnew file mode 100644@@@ -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"++}@@@ -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://"++ }++ }++ }}}}@@@ -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": [@@@ -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": [@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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": [@@@ -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"@@@ -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"@@@ -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"nnew file mode 100644@@@ -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."++ }++ }++ }++}@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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",@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"]@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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;++}nnew file mode 100644@@@ -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"++}nnew file mode 100644@@@ -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"++}@@@ -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",@@@ -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",
@@ -4,6 +4,18 @@ All notable changes to `openvibe-contracts`. Releases are git tags (`vX.Y.Z`) th
@@ -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,
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`).
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
## 0.232.0 — 2026-10-28
- **codes.task.queued|running|succeeded|failed|cancelled** (new payload contracts, first-party, owner `codes`; plan
- **codes.task.queued|running|succeeded|failed|cancelled** (new payload contracts, first-party, owner `codes`; plan
@@ -7694,6 +7694,15 @@
@@ -7694,6 +7694,15 @@
"visibility": "first-party",
"visibility": "first-party",
"compatibility": "backward",
"compatibility": "backward",
"status": "active"
"status": "active"
+ },
+ {
+ "id": "domains.proposal",
+ "version": "1.0.0",
+ "owner": "domains",
+ "schema": "domains/proposal.v1.json",
+ "visibility": "public",
+ "compatibility": "backward",
+ "status": "active"
}
}
]
]
}
}
@@ -24,7 +24,8 @@
@@ -24,7 +24,8 @@
"codes",
"codes",
"ai",
"ai",
"network",
"network",
- "run"
+ "run",
+ "domains"
],
],
"description": "The authority that owns the item."
"description": "The authority that owns the item."
},
},
@@ -32,7 +33,7 @@
@@ -32,7 +33,7 @@
"type": "string",
"type": "string",
"minLength": 1,
"minLength": 1,
"maxLength": 80,
"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": {
"kind": {
"enum": [
"enum": [
@@ -2,7 +2,7 @@
@@ -2,7 +2,7 @@
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://openvibe.network/contracts/common/action-list-result.v1.json",
"$id": "https://openvibe.network/contracts/common/action-list-result.v1.json",
"title": "ActionListResult",
"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",
"type": "object",
"additionalProperties": false,
"additionalProperties": false,
"required": [
"required": [
new file mode 100644
new file mode 100644
@@ -0,0 +1,294 @@
@@ -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://"
+ }
+ }
+}
@@ -96,6 +96,7 @@
@@ -96,6 +96,7 @@
"actor",
"actor",
"codes",
"codes",
"ai",
"ai",
+ "domains",
"network",
"network",
"run"
"run"
]
]
new file mode 100644
new file mode 100644
@@ -0,0 +1,26 @@
@@ -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"
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,35 @@
@@ -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"
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,34 @@
@@ -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"
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,42 @@
@@ -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"
+}
@@ -85309,7 +85309,8 @@
@@ -85309,7 +85309,8 @@
"codes",
"codes",
"ai",
"ai",
"network",
"network",
- "run"
+ "run",
+ "domains"
],
],
"description": "The authority that owns the item."
"description": "The authority that owns the item."
},
},
@@ -85317,7 +85318,7 @@
@@ -85317,7 +85318,7 @@
"type": "string",
"type": "string",
"minLength": 1,
"minLength": 1,
"maxLength": 80,
"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": {
"kind": {
"enum": [
"enum": [
@@ -85439,7 +85440,7 @@
@@ -85439,7 +85440,7 @@
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://openvibe.network/contracts/common/action-list-result.v1.json",
"$id": "https://openvibe.network/contracts/common/action-list-result.v1.json",
"title": "ActionListResult",
"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",
"type": "object",
"additionalProperties": false,
"additionalProperties": false,
"required": [
"required": [
@@ -85558,6 +85559,7 @@
@@ -85558,6 +85559,7 @@
"actor",
"actor",
"codes",
"codes",
"ai",
"ai",
+ "domains",
"network",
"network",
"run"
"run"
]
]
@@ -86317,6 +86319,305 @@
@@ -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://"
+ }
+ }
+ }
}
}
}
}
}
}
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Actor API",
"title": "OpenVibe.Actor API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -2282,7 +2282,8 @@
@@ -2282,7 +2282,8 @@
"codes",
"codes",
"ai",
"ai",
"network",
"network",
- "run"
+ "run",
+ "domains"
],
],
"description": "The authority that owns the item."
"description": "The authority that owns the item."
},
},
@@ -2290,7 +2291,7 @@
@@ -2290,7 +2291,7 @@
"type": "string",
"type": "string",
"minLength": 1,
"minLength": 1,
"maxLength": 80,
"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": {
"kind": {
"enum": [
"enum": [
@@ -2405,7 +2406,7 @@
@@ -2405,7 +2406,7 @@
},
},
"common.action-list-result.v1": {
"common.action-list-result.v1": {
"title": "ActionListResult",
"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",
"type": "object",
"additionalProperties": false,
"additionalProperties": false,
"required": [
"required": [
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.AI API",
"title": "OpenVibe.AI API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -5092,7 +5092,8 @@
@@ -5092,7 +5092,8 @@
"codes",
"codes",
"ai",
"ai",
"network",
"network",
- "run"
+ "run",
+ "domains"
],
],
"description": "The authority that owns the item."
"description": "The authority that owns the item."
},
},
@@ -5100,7 +5101,7 @@
@@ -5100,7 +5101,7 @@
"type": "string",
"type": "string",
"minLength": 1,
"minLength": 1,
"maxLength": 80,
"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": {
"kind": {
"enum": [
"enum": [
@@ -5215,7 +5216,7 @@
@@ -5215,7 +5216,7 @@
},
},
"common.action-list-result.v1": {
"common.action-list-result.v1": {
"title": "ActionListResult",
"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",
"type": "object",
"additionalProperties": false,
"additionalProperties": false,
"required": [
"required": [
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Billing API",
"title": "OpenVibe.Billing API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Blog API",
"title": "OpenVibe.Blog API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Bot API",
"title": "OpenVibe.Bot API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Chat API",
"title": "OpenVibe.Chat API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Codes API",
"title": "OpenVibe.Codes API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -503,7 +503,8 @@
@@ -503,7 +503,8 @@
"codes",
"codes",
"ai",
"ai",
"network",
"network",
- "run"
+ "run",
+ "domains"
],
],
"description": "The authority that owns the item."
"description": "The authority that owns the item."
},
},
@@ -511,7 +512,7 @@
@@ -511,7 +512,7 @@
"type": "string",
"type": "string",
"minLength": 1,
"minLength": 1,
"maxLength": 80,
"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": {
"kind": {
"enum": [
"enum": [
@@ -626,7 +627,7 @@
@@ -626,7 +627,7 @@
},
},
"common.action-list-result.v1": {
"common.action-list-result.v1": {
"title": "ActionListResult",
"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",
"type": "object",
"additionalProperties": false,
"additionalProperties": false,
"required": [
"required": [
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Community API",
"title": "OpenVibe.Community API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Coupons API",
"title": "OpenVibe.Coupons API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Deals API",
"title": "OpenVibe.Deals API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
new file mode 100644
new file mode 100644
@@ -0,0 +1,364 @@
@@ -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."
+ }
+ }
+ }
+}
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Events API",
"title": "OpenVibe.Events API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Food API",
"title": "OpenVibe.Food API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Games API",
"title": "OpenVibe.Games API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Host API",
"title": "OpenVibe.Host API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -71,6 +71,13 @@
@@ -71,6 +71,13 @@
"operations": 18,
"operations": 18,
"capabilities": 12
"capabilities": 12
},
},
+ {
+ "service": "domains",
+ "name": "OpenVibe.Domains",
+ "origin": "https://openvibe.domains",
+ "operations": 2,
+ "capabilities": 2
+ },
{
{
"service": "events",
"service": "events",
"name": "OpenVibe.Events",
"name": "OpenVibe.Events",
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Inventory API",
"title": "OpenVibe.Inventory API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Live API",
"title": "OpenVibe.Live API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.MediaHub API",
"title": "OpenVibe.MediaHub API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Media API",
"title": "OpenVibe.Media API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Network API",
"title": "OpenVibe.Network API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -2520,7 +2520,8 @@
@@ -2520,7 +2520,8 @@
"codes",
"codes",
"ai",
"ai",
"network",
"network",
- "run"
+ "run",
+ "domains"
],
],
"description": "The authority that owns the item."
"description": "The authority that owns the item."
},
},
@@ -2528,7 +2529,7 @@
@@ -2528,7 +2529,7 @@
"type": "string",
"type": "string",
"minLength": 1,
"minLength": 1,
"maxLength": 80,
"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": {
"kind": {
"enum": [
"enum": [
@@ -3952,6 +3953,7 @@
@@ -3952,6 +3953,7 @@
"actor",
"actor",
"codes",
"codes",
"ai",
"ai",
+ "domains",
"network",
"network",
"run"
"run"
]
]
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.News API",
"title": "OpenVibe.News API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenRestream API",
"title": "OpenRestream API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Play API",
"title": "OpenVibe.Play API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Quest API",
"title": "OpenVibe.Quest API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Reviews API",
"title": "OpenVibe.Reviews API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Run API",
"title": "OpenVibe.Run API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Search API",
"title": "OpenVibe.Search API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Services API",
"title": "OpenVibe.Services API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Sources API",
"title": "OpenVibe.Sources API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Space API",
"title": "OpenVibe.Space API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Tips API",
"title": "OpenVibe.Tips API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Tools API",
"title": "OpenVibe.Tools API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Trade API",
"title": "OpenVibe.Trade API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.VIP API",
"title": "OpenVibe.VIP API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Watch API",
"title": "OpenVibe.Watch API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Wiki API",
"title": "OpenVibe.Wiki API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Work API",
"title": "OpenVibe.Work API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Zone API",
"title": "OpenVibe.Zone API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -212425,9 +212425,9 @@ export interface ActionItem {
@@ -212425,9 +212425,9 @@ export interface ActionItem {
/**
/**
* The authority that owns the item.
* 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;
id: string;
/**
/**
@@ -212500,7 +212500,7 @@ export interface ActionItem {
@@ -212500,7 +212500,7 @@ export interface ActionItem {
/** [email protected] (owner: contracts) */
/** [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 {
export interface ActionListResult {
/**
/**
@@ -212728,3 +212728,133 @@ export interface CodesTaskCancelledPayload {
@@ -212728,3 +212728,133 @@ export interface CodesTaskCancelledPayload {
finished_at: string | null;
finished_at: string | null;
error: 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;
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,21 @@
@@ -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"
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,21 @@
@@ -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"
+}
@@ -1,7 +1,7 @@
@@ -1,7 +1,7 @@
{
{
"version": "0.1.0",
"version": "0.1.0",
"contractRanges": {
"contractRanges": {
- "openvibe-contracts": ">=0.225.0 <1.0.0"
+ "openvibe-contracts": ">=0.233.0 <1.0.0"
},
},
"id": "domains",
"id": "domains",
"name": "OpenVibe.Domains",
"name": "OpenVibe.Domains",
@@ -15,7 +15,10 @@
@@ -15,7 +15,10 @@
"state": "live",
"state": "live",
"publicSite": "service"
"publicSite": "service"
},
},
- "capabilities": [],
+ "capabilities": [
+ "domains.actions.read",
+ "domains.proposal.decide"
+ ],
"eventsProduced": [],
"eventsProduced": [],
"eventsConsumed": [],
"eventsConsumed": [],
"namespacesOwned": [
"namespacesOwned": [
@@ -37,7 +40,11 @@
@@ -37,7 +40,11 @@
"resumes": [
"resumes": [
{
{
"kind": "state",
"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 @@
@@ -48,17 +55,17 @@
],
],
"window": "automatic only while ovhost waits for readiness after the restart; manual afterwards, as long as no blocker applies",
"window": "automatic only while ovhost waits for readiness after the restart; manual afterwards, as long as no blocker applies",
"blockers": {
"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": {
"contracts": {
- "range": ">=0.225.0 <1.0.0"
+ "range": ">=0.233.0 <1.0.0"
},
},
"leases": {
"leases": {
"none": "no claims: one process serves the site"
"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",
"health": "/api/health",
"ready": "/api/ready",
"ready": "/api/ready",
"internalOrigin": "http://127.0.0.1:5070",
"internalOrigin": "http://127.0.0.1:5070",
@@ -1,6 +1,6 @@
@@ -1,6 +1,6 @@
{
{
"name": "openvibe-contracts",
"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.",
"description": "Machine-readable contracts for the OpenVibe network: schemas, manifests, ids, error envelope, capability checks.",
"main": "index.js",
"main": "index.js",
"types": "generated/typescript/index.d.ts",
"types": "generated/typescript/index.d.ts",