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.
Changes
@@@ -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).@@@ -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"}]}nnew file mode 100644@@@ -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" }++ }++}nnew file mode 100644@@@ -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" } }++ }++}nnew file mode 100644@@@ -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" }++ }++}nnew file mode 100644@@@ -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" } ] }nnew file mode 100644@@@ -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" }nnew file mode 100644@@@ -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" } ] }nnew file mode 100644@@@ -0,0 +1 @@++{ "source": "openvibe-oregon", "nodes": [] }nnew file mode 100644@@@ -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" } ] }nnew file mode 100644@@@ -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" }nnew file mode 100644@@@ -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" }nnew file mode 100644@@@ -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" }nnew file mode 100644@@@ -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" }nnew file mode 100644@@@ -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" }nnew file mode 100644@@@ -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" }@@@ -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"++ }++ }++ }}}}@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -96,8 +96,8 @@"service": "network","name": "OpenVibe.Network","origin": "https://openvibe.network",-- "operations": 25,-- "capabilities": 18++ "operations": 26,++ "capabilities": 19},{"service": "news",@@@ -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"@@@ -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"@@@ -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.",@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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;++}nnew file mode 100644@@@ -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"++}@@@ -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",@@@ -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",
@@ -6,6 +6,13 @@ the notes were in the tag and commit messages (`git tag -n1`).
@@ -6,6 +6,13 @@ the notes were in the tag and commit messages (`git tag -n1`).
## Unreleased
## 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
## 0.75.0 — 2026-09-28
**Per-streamer AI budgets are AI quotas** (roadmap WS-O task 2).
**Per-streamer AI budgets are AI quotas** (roadmap WS-O task 2).
@@ -4973,6 +4973,36 @@
@@ -4973,6 +4973,36 @@
"visibility": "first-party",
"visibility": "first-party",
"compatibility": "backward",
"compatibility": "backward",
"status": "active"
"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"
}
}
]
]
}
}
new file mode 100644
new file mode 100644
@@ -0,0 +1,13 @@
@@ -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" }
+ }
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,13 @@
@@ -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" } }
+ }
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,41 @@
@@ -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" }
+ }
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1 @@
@@ -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" } ] }
new file mode 100644
new file mode 100644
@@ -0,0 +1 @@
@@ -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" }
new file mode 100644
new file mode 100644
@@ -0,0 +1 @@
@@ -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" } ] }
new file mode 100644
new file mode 100644
@@ -0,0 +1 @@
@@ -0,0 +1 @@
+{ "source": "openvibe-oregon", "nodes": [] }
new file mode 100644
new file mode 100644
@@ -0,0 +1 @@
@@ -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" } ] }
new file mode 100644
new file mode 100644
@@ -0,0 +1 @@
@@ -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" }
new file mode 100644
new file mode 100644
@@ -0,0 +1 @@
@@ -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" }
new file mode 100644
new file mode 100644
@@ -0,0 +1 @@
@@ -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" }
new file mode 100644
new file mode 100644
@@ -0,0 +1 @@
@@ -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" }
new file mode 100644
new file mode 100644
@@ -0,0 +1 @@
@@ -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" }
new file mode 100644
new file mode 100644
@@ -0,0 +1 @@
@@ -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" }
@@ -55025,6 +55025,185 @@
@@ -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"
+ }
+ }
+ }
}
}
}
}
}
}
@@ -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.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Billing API",
"title": "OpenVibe.Billing API",
- "version": "0.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": {
"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.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": {
"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.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": {
"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.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Community API",
"title": "OpenVibe.Community API",
- "version": "0.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": {
"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.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": {
"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.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Events API",
"title": "OpenVibe.Events API",
- "version": "0.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": {
"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.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": {
"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.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -96,8 +96,8 @@
@@ -96,8 +96,8 @@
"service": "network",
"service": "network",
"name": "OpenVibe.Network",
"name": "OpenVibe.Network",
"origin": "https://openvibe.network",
"origin": "https://openvibe.network",
- "operations": 25,
- "capabilities": 18
+ "operations": 26,
+ "capabilities": 19
},
},
{
{
"service": "news",
"service": "news",
@@ -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.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": {
"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.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": {
"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.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -1471,6 +1471,62 @@
@@ -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/*": {
"/internal/notifications/*": {
"post": {
"post": {
"operationId": "post_internal_notifications",
"operationId": "post_internal_notifications",
@@ -2681,6 +2737,164 @@
@@ -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": {
"network.notification-push-request.v1": {
"title": "NetworkNotificationPushRequest",
"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.",
"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.",
@@ -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.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": {
"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": "OpenRe.Stream API",
"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": {
"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.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": {
"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.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": {
"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.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": {
"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.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": {
"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.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": {
"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.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": {
"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.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": {
"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.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -46194,3 +46194,87 @@ export interface HostSite {
@@ -46194,3 +46194,87 @@ export interface HostSite {
created_at: string;
created_at: string;
updated_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;
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,21 @@
@@ -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"
+}
@@ -48,6 +48,7 @@
@@ -48,6 +48,7 @@
"network.modules.write",
"network.modules.write",
"network.notifications.push",
"network.notifications.push",
"network.operator.alert",
"network.operator.alert",
+ "network.node.report",
"network.project.manage",
"network.project.manage",
"network.project.read",
"network.project.read",
"network.staff.read",
"network.staff.read",
@@ -1,6 +1,6 @@
@@ -1,6 +1,6 @@
{
{
"name": "openvibe-contracts",
"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.",
"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",