openvibers/openvibe.contracts Commits

Contracts 0.76.0: the node registry (ADR-034 section 12, roadmap WS-X1). network.node@1 describes one machine of the platform: its roles (web, app, data, media-worker, ingest, edge-probe, edge-relay, edge-cache, gpu, staging, ci), region-level location, provider, an HTTPS beacon clients time for their round trip, and health. No addresses, capacity or secrets are public. network.node.report (internal, Host) with network.node-report-request@1 (POST /internal/nodes/report) sends the complete set of nodes an inventory knows; a node absent from a later report is marked down, never silently deleted. network.node-list-result@1 is GET /api/v1/nodes (public, ?role=, ?region=), the input of the SDK's geo nearest(). Fixtures (valid and invalid: public address, unknown role, bad country, plain-http beacon) and the regenerated OpenAPI and JSON Schema bundle. npm test: 13847 checks passed, compat vs v0.75.0 without breaking changes.

OP OpenVibers committed 28 Sept 2026 · 0f4cf3f7f2 · 46 files, +665 −51


Changes

ddiff --git a/CHANGELOG.md b/CHANGELOG.md
iindex f75eb270..c378344a 100644
---- a/CHANGELOG.md
++++ b/CHANGELOG.md
@@@ -6,6 +6,13 @@ the notes were in the tag and commit messages (`git tag -n1`).
## Unreleased
++## 0.76.0 — 2026-09-28
++
++**The node registry** (ADR-034 section 12; roadmap WS-X1).
++- `network.node@1`: one machine of the platform as the registry lists it: its roles (web, app, data, media-worker, ingest, edge-probe, edge-relay, edge-cache, gpu, staging, ci), region-level location (region, country, optional city and coordinates), provider, an HTTPS beacon clients time for their round trip, and health. No addresses, capacity or secrets are public.
++- `network.node-report-request@1` and `network.node.report` (internal, held by Host): `POST /internal/nodes/report` sends the complete set of nodes one inventory knows. A node absent from a later report of the same source is marked down, never silently deleted.
++- `network.node-list-result@1`: `GET /api/v1/nodes` (public, `?role=`, `?region=`), the input of openvibe-sdk/geo's `nearest()`.
++
## 0.75.0 — 2026-09-28
**Per-streamer AI budgets are AI quotas** (roadmap WS-O task 2).
ddiff --git a/contracts/catalog.json b/contracts/catalog.json
iindex ee96b313..35d1a0b0 100644
---- a/contracts/catalog.json
++++ b/contracts/catalog.json
@@@ -4973,6 +4973,36 @@
"visibility": "first-party",
"compatibility": "backward",
"status": "active"
++ },
++ {
++ "id": "network.node",
++ "version": "1.0.0",
++ "owner": "network",
++ "schema": "network/node.v1.json",
++ "visibility": "public",
++ "compatibility": "backward",
++ "status": "active",
++ "adr": "ADR-034"
++ },
++ {
++ "id": "network.node-report-request",
++ "version": "1.0.0",
++ "owner": "network",
++ "schema": "network/node-report-request.v1.json",
++ "visibility": "first-party",
++ "compatibility": "backward",
++ "status": "active",
++ "adr": "ADR-034"
++ },
++ {
++ "id": "network.node-list-result",
++ "version": "1.0.0",
++ "owner": "network",
++ "schema": "network/node-list-result.v1.json",
++ "visibility": "public",
++ "compatibility": "backward",
++ "status": "active",
++ "adr": "ADR-034"
}
]
}
ddiff --git a/contracts/network/node-list-result.v1.json b/contracts/network/node-list-result.v1.json
nnew file mode 100644
iindex 00000000..07979988
---- /dev/null
++++ b/contracts/network/node-list-result.v1.json
@@@ -0,0 +1,13 @@
++{
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/network/node-list-result.v1.json",
++ "title": "NetworkNodeListResult",
++ "description": "network.node-list-result@1: GET /api/v1/nodes on OpenVibe.Network (public, cacheable): every node of the platform, filterable by ?role= and ?region=. The input of openvibe-sdk/geo's nearest().",
++ "type": "object",
++ "required": ["nodes", "generated_at"],
++ "additionalProperties": false,
++ "properties": {
++ "nodes": { "type": "array", "items": { "$ref": "node.v1.json" } },
++ "generated_at": { "type": "string", "format": "date-time" }
++ }
++}
ddiff --git a/contracts/network/node-report-request.v1.json b/contracts/network/node-report-request.v1.json
nnew file mode 100644
iindex 00000000..09f77940
---- /dev/null
++++ b/contracts/network/node-report-request.v1.json
@@@ -0,0 +1,13 @@
++{
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/network/node-report-request.v1.json",
++ "title": "NetworkNodeReportRequest",
++ "description": "network.node-report-request@1: POST /internal/nodes/report on OpenVibe.Network (capability network.node.report, held by the Host principal). The complete set of nodes one Host inventory knows, with their health now: a node absent from a later report of the same source is marked down, never deleted silently.",
++ "type": "object",
++ "required": ["source", "nodes"],
++ "additionalProperties": false,
++ "properties": {
++ "source": { "type": "string", "pattern": "^[a-z][a-z0-9-]{1,39}$", "description": "The reporting inventory (e.g. the host id)." },
++ "nodes": { "type": "array", "maxItems": 500, "items": { "$ref": "node.v1.json" } }
++ }
++}
ddiff --git a/contracts/network/node.v1.json b/contracts/network/node.v1.json
nnew file mode 100644
iindex 00000000..2d44e652
---- /dev/null
++++ b/contracts/network/node.v1.json
@@@ -0,0 +1,41 @@
++{
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/network/node.v1.json",
++ "title": "NetworkNode",
++ "description": "network.node@1: one machine of the OpenVibe platform as the node registry lists it (ADR-034 section 12; roadmap WS-X1). Roles are what it serves; location is region-level; the beacon is an HTTPS URL a client times to measure its own round trip. No addresses, capacity or secrets are public: a node is found by role and location, and reached through the service that uses it.",
++ "type": "object",
++ "required": ["id", "roles", "location", "health", "updated_at"],
++ "additionalProperties": false,
++ "properties": {
++ "id": { "type": "string", "pattern": "^[a-z][a-z0-9-]{1,39}$" },
++ "name": { "type": "string", "maxLength": 80 },
++ "roles": {
++ "type": "array", "minItems": 1, "uniqueItems": true,
++ "items": { "enum": ["web", "app", "data", "media-worker", "ingest", "edge-probe", "edge-relay", "edge-cache", "gpu", "staging", "ci"] }
++ },
++ "location": {
++ "type": "object",
++ "required": ["region", "country"],
++ "additionalProperties": false,
++ "properties": {
++ "region": { "type": "string", "pattern": "^[a-z]{2}-[a-z]+(-[0-9])?$", "description": "e.g. us-west, eu-central" },
++ "country": { "type": "string", "pattern": "^[A-Z]{2}$" },
++ "city": { "type": "string", "maxLength": 80 },
++ "lat": { "type": "number", "minimum": -90, "maximum": 90 },
++ "lon": { "type": "number", "minimum": -180, "maximum": 180 }
++ }
++ },
++ "provider": { "type": "string", "maxLength": 40 },
++ "beacon": { "type": "string", "format": "uri", "pattern": "^https://", "description": "Timed by clients (GET, tiny body, no caching) to measure round-trip time." },
++ "health": {
++ "type": "object",
++ "required": ["status", "checked_at"],
++ "additionalProperties": false,
++ "properties": {
++ "status": { "enum": ["up", "degraded", "down", "unknown"] },
++ "checked_at": { "type": "string", "format": "date-time" }
++ }
++ },
++ "updated_at": { "type": "string", "format": "date-time" }
++ }
++}
ddiff --git a/fixtures/network.node-list-result/invalid/no-generated-at.json b/fixtures/network.node-list-result/invalid/no-generated-at.json
nnew file mode 100644
iindex 00000000..30e3da1f
---- /dev/null
++++ b/fixtures/network.node-list-result/invalid/no-generated-at.json
@@@ -0,0 +1 @@
++{ "nodes": [ { "id": "oregon-1", "name": "Oregon 1", "roles": ["web", "app", "data", "ingest"], "location": { "region": "us-west", "country": "US", "city": "Hillsboro", "lat": 45.52, "lon": -122.99 }, "provider": "ovh", "beacon": "https://openvibe.network/api/v1/nodes/oregon-1/beacon", "health": { "status": "up", "checked_at": "2026-09-28T12:00:00Z" }, "updated_at": "2026-09-28T12:00:00Z" } ] }
ddiff --git a/fixtures/network.node-list-result/valid/one.json b/fixtures/network.node-list-result/valid/one.json
nnew file mode 100644
iindex 00000000..8aa5657d
---- /dev/null
++++ b/fixtures/network.node-list-result/valid/one.json
@@@ -0,0 +1 @@
++{ "nodes": [ { "id": "oregon-1", "name": "Oregon 1", "roles": ["web", "app", "data", "ingest"], "location": { "region": "us-west", "country": "US", "city": "Hillsboro", "lat": 45.52, "lon": -122.99 }, "provider": "ovh", "beacon": "https://openvibe.network/api/v1/nodes/oregon-1/beacon", "health": { "status": "up", "checked_at": "2026-09-28T12:00:00Z" }, "updated_at": "2026-09-28T12:00:00Z" } ], "generated_at": "2026-09-28T12:00:05Z" }
ddiff --git a/fixtures/network.node-report-request/invalid/no-source.json b/fixtures/network.node-report-request/invalid/no-source.json
nnew file mode 100644
iindex 00000000..30e3da1f
---- /dev/null
++++ b/fixtures/network.node-report-request/invalid/no-source.json
@@@ -0,0 +1 @@
++{ "nodes": [ { "id": "oregon-1", "name": "Oregon 1", "roles": ["web", "app", "data", "ingest"], "location": { "region": "us-west", "country": "US", "city": "Hillsboro", "lat": 45.52, "lon": -122.99 }, "provider": "ovh", "beacon": "https://openvibe.network/api/v1/nodes/oregon-1/beacon", "health": { "status": "up", "checked_at": "2026-09-28T12:00:00Z" }, "updated_at": "2026-09-28T12:00:00Z" } ] }
ddiff --git a/fixtures/network.node-report-request/valid/empty.json b/fixtures/network.node-report-request/valid/empty.json
nnew file mode 100644
iindex 00000000..879066da
---- /dev/null
++++ b/fixtures/network.node-report-request/valid/empty.json
@@@ -0,0 +1 @@
++{ "source": "openvibe-oregon", "nodes": [] }
ddiff --git a/fixtures/network.node-report-request/valid/one-host.json b/fixtures/network.node-report-request/valid/one-host.json
nnew file mode 100644
iindex 00000000..6410e63b
---- /dev/null
++++ b/fixtures/network.node-report-request/valid/one-host.json
@@@ -0,0 +1 @@
++{ "source": "openvibe-oregon", "nodes": [ { "id": "oregon-1", "name": "Oregon 1", "roles": ["web", "app", "data", "ingest"], "location": { "region": "us-west", "country": "US", "city": "Hillsboro", "lat": 45.52, "lon": -122.99 }, "provider": "ovh", "beacon": "https://openvibe.network/api/v1/nodes/oregon-1/beacon", "health": { "status": "up", "checked_at": "2026-09-28T12:00:00Z" }, "updated_at": "2026-09-28T12:00:00Z" } ] }
ddiff --git a/fixtures/network.node/invalid/bad-country.json b/fixtures/network.node/invalid/bad-country.json
nnew file mode 100644
iindex 00000000..f1d5c2d1
---- /dev/null
++++ b/fixtures/network.node/invalid/bad-country.json
@@@ -0,0 +1 @@
++{ "id": "oregon-1", "name": "Oregon 1", "roles": ["web", "app", "data", "ingest"], "location": { "region": "us-west", "country": "usa", "city": "Hillsboro", "lat": 45.52, "lon": -122.99 }, "provider": "ovh", "beacon": "https://openvibe.network/api/v1/nodes/oregon-1/beacon", "health": { "status": "up", "checked_at": "2026-09-28T12:00:00Z" }, "updated_at": "2026-09-28T12:00:00Z" }
ddiff --git a/fixtures/network.node/invalid/plain-http-beacon.json b/fixtures/network.node/invalid/plain-http-beacon.json
nnew file mode 100644
iindex 00000000..4b62094a
---- /dev/null
++++ b/fixtures/network.node/invalid/plain-http-beacon.json
@@@ -0,0 +1 @@
++{ "id": "oregon-1", "name": "Oregon 1", "roles": ["web", "app", "data", "ingest"], "location": { "region": "us-west", "country": "US", "city": "Hillsboro", "lat": 45.52, "lon": -122.99 }, "provider": "ovh", "beacon": "http://openvibe.network/api/v1/nodes/oregon-1/beacon", "health": { "status": "up", "checked_at": "2026-09-28T12:00:00Z" }, "updated_at": "2026-09-28T12:00:00Z" }
ddiff --git a/fixtures/network.node/invalid/public-address.json b/fixtures/network.node/invalid/public-address.json
nnew file mode 100644
iindex 00000000..d4719f60
---- /dev/null
++++ b/fixtures/network.node/invalid/public-address.json
@@@ -0,0 +1 @@
++{ "id": "oregon-1", "name": "Oregon 1", "roles": ["web", "app", "data", "ingest"], "location": { "region": "us-west", "country": "US", "city": "Hillsboro", "lat": 45.52, "lon": -122.99 }, "address": "15.204.79.215", "beacon": "https://openvibe.network/api/v1/nodes/oregon-1/beacon", "health": { "status": "up", "checked_at": "2026-09-28T12:00:00Z" }, "updated_at": "2026-09-28T12:00:00Z" }
ddiff --git a/fixtures/network.node/invalid/unknown-role.json b/fixtures/network.node/invalid/unknown-role.json
nnew file mode 100644
iindex 00000000..eb2700f7
---- /dev/null
++++ b/fixtures/network.node/invalid/unknown-role.json
@@@ -0,0 +1 @@
++{ "id": "oregon-1", "name": "Oregon 1", "roles": ["mainframe", "app", "data", "ingest"], "location": { "region": "us-west", "country": "US", "city": "Hillsboro", "lat": 45.52, "lon": -122.99 }, "provider": "ovh", "beacon": "https://openvibe.network/api/v1/nodes/oregon-1/beacon", "health": { "status": "up", "checked_at": "2026-09-28T12:00:00Z" }, "updated_at": "2026-09-28T12:00:00Z" }
ddiff --git a/fixtures/network.node/valid/minimal-edge.json b/fixtures/network.node/valid/minimal-edge.json
nnew file mode 100644
iindex 00000000..934f34b6
---- /dev/null
++++ b/fixtures/network.node/valid/minimal-edge.json
@@@ -0,0 +1 @@
++{ "id": "probe-fra", "roles": ["edge-probe", "edge-relay"], "location": { "region": "eu-central", "country": "DE" }, "health": { "status": "unknown", "checked_at": "2026-09-28T12:00:00Z" }, "updated_at": "2026-09-28T12:00:00Z" }
ddiff --git a/fixtures/network.node/valid/oregon.json b/fixtures/network.node/valid/oregon.json
nnew file mode 100644
iindex 00000000..c0f7b2b7
---- /dev/null
++++ b/fixtures/network.node/valid/oregon.json
@@@ -0,0 +1 @@
++{ "id": "oregon-1", "name": "Oregon 1", "roles": ["web", "app", "data", "ingest"], "location": { "region": "us-west", "country": "US", "city": "Hillsboro", "lat": 45.52, "lon": -122.99 }, "provider": "ovh", "beacon": "https://openvibe.network/api/v1/nodes/oregon-1/beacon", "health": { "status": "up", "checked_at": "2026-09-28T12:00:00Z" }, "updated_at": "2026-09-28T12:00:00Z" }
ddiff --git a/generated/json-schema/bundle.json b/generated/json-schema/bundle.json
iindex a70ae45a..bf511484 100644
---- a/generated/json-schema/bundle.json
++++ b/generated/json-schema/bundle.json
@@@ -55025,6 +55025,185 @@
}
}
}
++ },
++ "network.node": {
++ "version": "1.0.0",
++ "owner": "network",
++ "status": "active",
++ "schema": {
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/network/node.v1.json",
++ "title": "NetworkNode",
++ "description": "network.node@1: one machine of the OpenVibe platform as the node registry lists it (ADR-034 section 12; roadmap WS-X1). Roles are what it serves; location is region-level; the beacon is an HTTPS URL a client times to measure its own round trip. No addresses, capacity or secrets are public: a node is found by role and location, and reached through the service that uses it.",
++ "type": "object",
++ "required": [
++ "id",
++ "roles",
++ "location",
++ "health",
++ "updated_at"
++ ],
++ "additionalProperties": false,
++ "properties": {
++ "id": {
++ "type": "string",
++ "pattern": "^[a-z][a-z0-9-]{1,39}$"
++ },
++ "name": {
++ "type": "string",
++ "maxLength": 80
++ },
++ "roles": {
++ "type": "array",
++ "minItems": 1,
++ "uniqueItems": true,
++ "items": {
++ "enum": [
++ "web",
++ "app",
++ "data",
++ "media-worker",
++ "ingest",
++ "edge-probe",
++ "edge-relay",
++ "edge-cache",
++ "gpu",
++ "staging",
++ "ci"
++ ]
++ }
++ },
++ "location": {
++ "type": "object",
++ "required": [
++ "region",
++ "country"
++ ],
++ "additionalProperties": false,
++ "properties": {
++ "region": {
++ "type": "string",
++ "pattern": "^[a-z]{2}-[a-z]+(-[0-9])?$",
++ "description": "e.g. us-west, eu-central"
++ },
++ "country": {
++ "type": "string",
++ "pattern": "^[A-Z]{2}$"
++ },
++ "city": {
++ "type": "string",
++ "maxLength": 80
++ },
++ "lat": {
++ "type": "number",
++ "minimum": -90,
++ "maximum": 90
++ },
++ "lon": {
++ "type": "number",
++ "minimum": -180,
++ "maximum": 180
++ }
++ }
++ },
++ "provider": {
++ "type": "string",
++ "maxLength": 40
++ },
++ "beacon": {
++ "type": "string",
++ "format": "uri",
++ "pattern": "^https://",
++ "description": "Timed by clients (GET, tiny body, no caching) to measure round-trip time."
++ },
++ "health": {
++ "type": "object",
++ "required": [
++ "status",
++ "checked_at"
++ ],
++ "additionalProperties": false,
++ "properties": {
++ "status": {
++ "enum": [
++ "up",
++ "degraded",
++ "down",
++ "unknown"
++ ]
++ },
++ "checked_at": {
++ "type": "string",
++ "format": "date-time"
++ }
++ }
++ },
++ "updated_at": {
++ "type": "string",
++ "format": "date-time"
++ }
++ }
++ }
++ },
++ "network.node-report-request": {
++ "version": "1.0.0",
++ "owner": "network",
++ "status": "active",
++ "schema": {
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/network/node-report-request.v1.json",
++ "title": "NetworkNodeReportRequest",
++ "description": "network.node-report-request@1: POST /internal/nodes/report on OpenVibe.Network (capability network.node.report, held by the Host principal). The complete set of nodes one Host inventory knows, with their health now: a node absent from a later report of the same source is marked down, never deleted silently.",
++ "type": "object",
++ "required": [
++ "source",
++ "nodes"
++ ],
++ "additionalProperties": false,
++ "properties": {
++ "source": {
++ "type": "string",
++ "pattern": "^[a-z][a-z0-9-]{1,39}$",
++ "description": "The reporting inventory (e.g. the host id)."
++ },
++ "nodes": {
++ "type": "array",
++ "maxItems": 500,
++ "items": {
++ "$ref": "node.v1.json"
++ }
++ }
++ }
++ }
++ },
++ "network.node-list-result": {
++ "version": "1.0.0",
++ "owner": "network",
++ "status": "active",
++ "schema": {
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/network/node-list-result.v1.json",
++ "title": "NetworkNodeListResult",
++ "description": "network.node-list-result@1: GET /api/v1/nodes on OpenVibe.Network (public, cacheable): every node of the platform, filterable by ?role= and ?region=. The input of openvibe-sdk/geo's nearest().",
++ "type": "object",
++ "required": [
++ "nodes",
++ "generated_at"
++ ],
++ "additionalProperties": false,
++ "properties": {
++ "nodes": {
++ "type": "array",
++ "items": {
++ "$ref": "node.v1.json"
++ }
++ },
++ "generated_at": {
++ "type": "string",
++ "format": "date-time"
++ }
++ }
++ }
}
}
}
ddiff --git a/generated/openapi/ai.json b/generated/openapi/ai.json
iindex 6df12f18..60b11866 100644
---- a/generated/openapi/ai.json
++++ b/generated/openapi/ai.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.AI API",
-- "version": "0.75.0",
-- "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.75.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.76.0",
++ "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.76.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/billing.json b/generated/openapi/billing.json
iindex 01622760..bb01b9b2 100644
---- a/generated/openapi/billing.json
++++ b/generated/openapi/billing.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Billing API",
-- "version": "0.75.0",
-- "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.75.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.76.0",
++ "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.76.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/blog.json b/generated/openapi/blog.json
iindex 1c76974f..a1d1a24b 100644
---- a/generated/openapi/blog.json
++++ b/generated/openapi/blog.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Blog API",
-- "version": "0.75.0",
-- "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.75.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.76.0",
++ "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.76.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/chat.json b/generated/openapi/chat.json
iindex 440b56fc..3866dff3 100644
---- a/generated/openapi/chat.json
++++ b/generated/openapi/chat.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Chat API",
-- "version": "0.75.0",
-- "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.75.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.76.0",
++ "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.76.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/codes.json b/generated/openapi/codes.json
iindex 8a133ac6..4b0edb48 100644
---- a/generated/openapi/codes.json
++++ b/generated/openapi/codes.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Codes API",
-- "version": "0.75.0",
-- "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.75.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.76.0",
++ "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.76.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/community.json b/generated/openapi/community.json
iindex a991397c..004f823b 100644
---- a/generated/openapi/community.json
++++ b/generated/openapi/community.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Community API",
-- "version": "0.75.0",
-- "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.75.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.76.0",
++ "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.76.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/coupons.json b/generated/openapi/coupons.json
iindex 96ffbc28..0c2e0b44 100644
---- a/generated/openapi/coupons.json
++++ b/generated/openapi/coupons.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Coupons API",
-- "version": "0.75.0",
-- "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.75.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.76.0",
++ "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.76.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/deals.json b/generated/openapi/deals.json
iindex 19684b1f..eccbe824 100644
---- a/generated/openapi/deals.json
++++ b/generated/openapi/deals.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Deals API",
-- "version": "0.75.0",
-- "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.75.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.76.0",
++ "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.76.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/events.json b/generated/openapi/events.json
iindex a9a4935a..56a61c74 100644
---- a/generated/openapi/events.json
++++ b/generated/openapi/events.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Events API",
-- "version": "0.75.0",
-- "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.75.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.76.0",
++ "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.76.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/games.json b/generated/openapi/games.json
iindex 517c49ad..bbcd8ea6 100644
---- a/generated/openapi/games.json
++++ b/generated/openapi/games.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Games API",
-- "version": "0.75.0",
-- "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.75.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.76.0",
++ "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.76.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/host.json b/generated/openapi/host.json
iindex 32a209ac..cab586f7 100644
---- a/generated/openapi/host.json
++++ b/generated/openapi/host.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Host API",
-- "version": "0.75.0",
-- "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.75.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.76.0",
++ "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.76.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/index.json b/generated/openapi/index.json
iindex 1bc43e8a..aca3a403 100644
---- a/generated/openapi/index.json
++++ b/generated/openapi/index.json
@@@ -96,8 +96,8 @@
"service": "network",
"name": "OpenVibe.Network",
"origin": "https://openvibe.network",
-- "operations": 25,
-- "capabilities": 18
++ "operations": 26,
++ "capabilities": 19
},
{
"service": "news",
ddiff --git a/generated/openapi/live.json b/generated/openapi/live.json
iindex 4a5983eb..855b7ec7 100644
---- a/generated/openapi/live.json
++++ b/generated/openapi/live.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Live API",
-- "version": "0.75.0",
-- "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.75.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.76.0",
++ "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.76.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/media.json b/generated/openapi/media.json
iindex 3260257b..0e5af305 100644
---- a/generated/openapi/media.json
++++ b/generated/openapi/media.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Media API",
-- "version": "0.75.0",
-- "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.75.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.76.0",
++ "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.76.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/network.json b/generated/openapi/network.json
iindex d2ec45ed..0bd3b640 100644
---- a/generated/openapi/network.json
++++ b/generated/openapi/network.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Network API",
-- "version": "0.75.0",
-- "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.75.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.76.0",
++ "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.76.0): each operation lists the capabilities it performs; a token for the 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"
@@@ -1471,6 +1471,62 @@
}
}
},
++ "/internal/nodes/report": {
++ "post": {
++ "operationId": "post_internal_nodes_report",
++ "summary": "Report the machines of the platform (roles, region-level location, beacon, health) to the node registry, which the geo API and every location-aware product read (ADR-034 section 12).",
++ "description": "**network.node.report** (internal): Report the machines of the platform (roles, region-level location, beacon, health) to the node registry, which the geo API and every location-aware product read (ADR-034 section 12).",
++ "tags": [
++ "network.node"
++ ],
++ "x-openvibe-capabilities": [
++ "network.node.report"
++ ],
++ "x-openvibe-visibility": [
++ "internal"
++ ],
++ "x-openvibe-quota-class": "admin",
++ "security": [
++ {
++ "openvibeToken": [
++ "network.node.report"
++ ]
++ }
++ ],
++ "requestBody": {
++ "required": false,
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/network.node-report-request.v1"
++ }
++ }
++ }
++ },
++ "responses": {
++ "2XX": {
++ "description": "Success",
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/network.node-list-result.v1"
++ }
++ }
++ }
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ }
++ },
"/internal/notifications/*": {
"post": {
"operationId": "post_internal_notifications",
@@@ -2681,6 +2737,164 @@
}
]
},
++ "network.node-list-result.v1": {
++ "title": "NetworkNodeListResult",
++ "description": "network.node-list-result@1: GET /api/v1/nodes on OpenVibe.Network (public, cacheable): every node of the platform, filterable by ?role= and ?region=. The input of openvibe-sdk/geo's nearest().",
++ "type": "object",
++ "required": [
++ "nodes",
++ "generated_at"
++ ],
++ "additionalProperties": false,
++ "properties": {
++ "nodes": {
++ "type": "array",
++ "items": {
++ "$ref": "#/components/schemas/network.node.v1"
++ }
++ },
++ "generated_at": {
++ "type": "string",
++ "format": "date-time"
++ }
++ }
++ },
++ "network.node-report-request.v1": {
++ "title": "NetworkNodeReportRequest",
++ "description": "network.node-report-request@1: POST /internal/nodes/report on OpenVibe.Network (capability network.node.report, held by the Host principal). The complete set of nodes one Host inventory knows, with their health now: a node absent from a later report of the same source is marked down, never deleted silently.",
++ "type": "object",
++ "required": [
++ "source",
++ "nodes"
++ ],
++ "additionalProperties": false,
++ "properties": {
++ "source": {
++ "type": "string",
++ "pattern": "^[a-z][a-z0-9-]{1,39}$",
++ "description": "The reporting inventory (e.g. the host id)."
++ },
++ "nodes": {
++ "type": "array",
++ "maxItems": 500,
++ "items": {
++ "$ref": "#/components/schemas/network.node.v1"
++ }
++ }
++ }
++ },
++ "network.node.v1": {
++ "title": "NetworkNode",
++ "description": "network.node@1: one machine of the OpenVibe platform as the node registry lists it (ADR-034 section 12; roadmap WS-X1). Roles are what it serves; location is region-level; the beacon is an HTTPS URL a client times to measure its own round trip. No addresses, capacity or secrets are public: a node is found by role and location, and reached through the service that uses it.",
++ "type": "object",
++ "required": [
++ "id",
++ "roles",
++ "location",
++ "health",
++ "updated_at"
++ ],
++ "additionalProperties": false,
++ "properties": {
++ "id": {
++ "type": "string",
++ "pattern": "^[a-z][a-z0-9-]{1,39}$"
++ },
++ "name": {
++ "type": "string",
++ "maxLength": 80
++ },
++ "roles": {
++ "type": "array",
++ "minItems": 1,
++ "uniqueItems": true,
++ "items": {
++ "enum": [
++ "web",
++ "app",
++ "data",
++ "media-worker",
++ "ingest",
++ "edge-probe",
++ "edge-relay",
++ "edge-cache",
++ "gpu",
++ "staging",
++ "ci"
++ ]
++ }
++ },
++ "location": {
++ "type": "object",
++ "required": [
++ "region",
++ "country"
++ ],
++ "additionalProperties": false,
++ "properties": {
++ "region": {
++ "type": "string",
++ "pattern": "^[a-z]{2}-[a-z]+(-[0-9])?$",
++ "description": "e.g. us-west, eu-central"
++ },
++ "country": {
++ "type": "string",
++ "pattern": "^[A-Z]{2}$"
++ },
++ "city": {
++ "type": "string",
++ "maxLength": 80
++ },
++ "lat": {
++ "type": "number",
++ "minimum": -90,
++ "maximum": 90
++ },
++ "lon": {
++ "type": "number",
++ "minimum": -180,
++ "maximum": 180
++ }
++ }
++ },
++ "provider": {
++ "type": "string",
++ "maxLength": 40
++ },
++ "beacon": {
++ "type": "string",
++ "format": "uri",
++ "pattern": "^https://",
++ "description": "Timed by clients (GET, tiny body, no caching) to measure round-trip time."
++ },
++ "health": {
++ "type": "object",
++ "required": [
++ "status",
++ "checked_at"
++ ],
++ "additionalProperties": false,
++ "properties": {
++ "status": {
++ "enum": [
++ "up",
++ "degraded",
++ "down",
++ "unknown"
++ ]
++ },
++ "checked_at": {
++ "type": "string",
++ "format": "date-time"
++ }
++ }
++ },
++ "updated_at": {
++ "type": "string",
++ "format": "date-time"
++ }
++ }
++ },
"network.notification-push-request.v1": {
"title": "NetworkNotificationPushRequest",
"description": "network.notification-push-request@1: bodies of network.notifications.push on OpenVibe.Network (a service token holding the capability, or the internal key). POST /internal/notifications/push: { user_id, type?, title?, message?, … } creates one notification (400 { error: user_id required } without user_id). POST /internal/notifications/push-bulk: { user_ids, …same fields } creates it for each recipient (400 without a non-empty user_ids, or with more than 1000). Recipients are Network user ids. Unknown fields are ignored; 503 when the notification service is not running. The other /internal/notifications/* routes (unread, mark-read, resolve-users) take the internal key only and are not part of this capability.",
ddiff --git a/generated/openapi/news.json b/generated/openapi/news.json
iindex 2cc8a5ca..6b2f15ee 100644
---- a/generated/openapi/news.json
++++ b/generated/openapi/news.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.News API",
-- "version": "0.75.0",
-- "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.75.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.76.0",
++ "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.76.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/openre.json b/generated/openapi/openre.json
iindex 8dff803b..41aa4e11 100644
---- a/generated/openapi/openre.json
++++ b/generated/openapi/openre.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenRe.Stream API",
-- "version": "0.75.0",
-- "description": "Routes of OpenRe.Stream as the OpenVibe contracts describe them (openvibe-contracts 0.75.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.76.0",
++ "description": "Routes of OpenRe.Stream as the OpenVibe contracts describe them (openvibe-contracts 0.76.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/reviews.json b/generated/openapi/reviews.json
iindex 2b955519..882be129 100644
---- a/generated/openapi/reviews.json
++++ b/generated/openapi/reviews.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Reviews API",
-- "version": "0.75.0",
-- "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.75.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.76.0",
++ "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.76.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/search.json b/generated/openapi/search.json
iindex 779feb92..f89c06e6 100644
---- a/generated/openapi/search.json
++++ b/generated/openapi/search.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Search API",
-- "version": "0.75.0",
-- "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.75.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.76.0",
++ "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.76.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/sources.json b/generated/openapi/sources.json
iindex a458ea7c..bed3b566 100644
---- a/generated/openapi/sources.json
++++ b/generated/openapi/sources.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Sources API",
-- "version": "0.75.0",
-- "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.75.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.76.0",
++ "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.76.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/tips.json b/generated/openapi/tips.json
iindex 192ca693..fee7e54f 100644
---- a/generated/openapi/tips.json
++++ b/generated/openapi/tips.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Tips API",
-- "version": "0.75.0",
-- "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.75.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.76.0",
++ "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.76.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/tools.json b/generated/openapi/tools.json
iindex 68495dc1..a0498b46 100644
---- a/generated/openapi/tools.json
++++ b/generated/openapi/tools.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Tools API",
-- "version": "0.75.0",
-- "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.75.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.76.0",
++ "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.76.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/trade.json b/generated/openapi/trade.json
iindex 46d5916c..753da70f 100644
---- a/generated/openapi/trade.json
++++ b/generated/openapi/trade.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Trade API",
-- "version": "0.75.0",
-- "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.75.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.76.0",
++ "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.76.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/vip.json b/generated/openapi/vip.json
iindex 066274bb..2a93fde0 100644
---- a/generated/openapi/vip.json
++++ b/generated/openapi/vip.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.VIP API",
-- "version": "0.75.0",
-- "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.75.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.76.0",
++ "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.76.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/wiki.json b/generated/openapi/wiki.json
iindex 282ec327..c3de3c0b 100644
---- a/generated/openapi/wiki.json
++++ b/generated/openapi/wiki.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Wiki API",
-- "version": "0.75.0",
-- "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.75.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.76.0",
++ "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.76.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/typescript/index.d.ts b/generated/typescript/index.d.ts
iindex c314a45d..be482d80 100644
---- a/generated/typescript/index.d.ts
++++ b/generated/typescript/index.d.ts
@@@ -46194,3 +46194,87 @@ export interface HostSite {
created_at: string;
updated_at: string;
}
++
++/** [email protected] (owner: network) */
++/**
++ * network.node@1: one machine of the OpenVibe platform as the node registry lists it (ADR-034 section 12; roadmap WS-X1). Roles are what it serves; location is region-level; the beacon is an HTTPS URL a client times to measure its own round trip. No addresses, capacity or secrets are public: a node is found by role and location, and reached through the service that uses it.
++ */
++export interface NetworkNode {
++ id: string;
++ name?: string;
++ /**
++ * @minItems 1
++ */
++ roles: [
++ (
++ | "web"
++ | "app"
++ | "data"
++ | "media-worker"
++ | "ingest"
++ | "edge-probe"
++ | "edge-relay"
++ | "edge-cache"
++ | "gpu"
++ | "staging"
++ | "ci"
++ ),
++ ...(
++ | "web"
++ | "app"
++ | "data"
++ | "media-worker"
++ | "ingest"
++ | "edge-probe"
++ | "edge-relay"
++ | "edge-cache"
++ | "gpu"
++ | "staging"
++ | "ci"
++ )[]
++ ];
++ location: {
++ /**
++ * e.g. us-west, eu-central
++ */
++ region: string;
++ country: string;
++ city?: string;
++ lat?: number;
++ lon?: number;
++ };
++ provider?: string;
++ /**
++ * Timed by clients (GET, tiny body, no caching) to measure round-trip time.
++ */
++ beacon?: string;
++ health: {
++ status: "up" | "degraded" | "down" | "unknown";
++ checked_at: string;
++ };
++ updated_at: string;
++}
++
++/** [email protected] (owner: network) */
++/**
++ * network.node-report-request@1: POST /internal/nodes/report on OpenVibe.Network (capability network.node.report, held by the Host principal). The complete set of nodes one Host inventory knows, with their health now: a node absent from a later report of the same source is marked down, never deleted silently.
++ */
++export interface NetworkNodeReportRequest {
++ /**
++ * The reporting inventory (e.g. the host id).
++ */
++ source: string;
++ /**
++ * @maxItems 500
++ */
++ nodes: NetworkNode[];
++}
++
++/** [email protected] (owner: network) */
++/**
++ * network.node-list-result@1: GET /api/v1/nodes on OpenVibe.Network (public, cacheable): every node of the platform, filterable by ?role= and ?region=. The input of openvibe-sdk/geo's nearest().
++ */
++export interface NetworkNodeListResult {
++ nodes: NetworkNode[];
++ generated_at: string;
++}
ddiff --git a/manifests/capabilities/network.node.report.json b/manifests/capabilities/network.node.report.json
nnew file mode 100644
iindex 00000000..8dab7308
---- /dev/null
++++ b/manifests/capabilities/network.node.report.json
@@@ -0,0 +1,21 @@
++{
++ "id": "network.node.report",
++ "version": "1.0",
++ "owner": "network",
++ "status": "active",
++ "visibility": "internal",
++ "description": "Report the machines of the platform (roles, region-level location, beacon, health) to the node registry, which the geo API and every location-aware product read (ADR-034 section 12).",
++ "permissions": [
++ "nodes:write"
++ ],
++ "resourceConstraints": [
++ "none"
++ ],
++ "quotaClass": "admin",
++ "events": [],
++ "implementedBy": [
++ "POST /internal/nodes/report"
++ ],
++ "inputSchema": "network.node-report-request@1",
++ "outputSchema": "network.node-list-result@1"
++}
ddiff --git a/manifests/services/network.json b/manifests/services/network.json
iindex e613ae3b..e540f5aa 100644
---- a/manifests/services/network.json
++++ b/manifests/services/network.json
@@@ -48,6 +48,7 @@
"network.modules.write",
"network.notifications.push",
"network.operator.alert",
++ "network.node.report",
"network.project.manage",
"network.project.read",
"network.staff.read",
ddiff --git a/package.json b/package.json
iindex 940d7489..fa5afecf 100644
---- a/package.json
++++ b/package.json
@@@ -1,6 +1,6 @@
{
"name": "openvibe-contracts",
-- "version": "0.75.0",
++ "version": "0.76.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",