openvibers/openvibe.contracts Commits
Add M1 home, feed, and status contracts (#367)
Changes
@@@ -1,5 +1,11 @@# Changelog++## 0.352.0 — 2026-11-09++++- The menu's home screen and wall (M1): `network.home-screen@1`, `network.menu-feeds@2` (order and off; v1's on reads as++ the start of the order), `network.frame-today@1`, `community.status@1`, `community.pulse-contribute-request@1` and the++ person-granted capability `community.pulse.contribute`, with fixtures and the manifests' routes.++## 0.351.0 — 2026-11-09- Add the five public Report AI comparison response contracts and fixtures, and list their cached public routes in the Report service manifest.@@@ -10370,6 +10370,51 @@"visibility": "public","compatibility": "backward","status": "active"++ },++ {++ "id": "network.home-screen",++ "version": "1.0.0",++ "schema": "network/home-screen.v1.json",++ "owner": "network",++ "visibility": "public",++ "compatibility": "backward",++ "status": "active"++ },++ {++ "id": "network.menu-feeds",++ "version": "2.0.0",++ "schema": "network/menu-feeds.v2.json",++ "owner": "network",++ "visibility": "public",++ "compatibility": "backward",++ "status": "active"++ },++ {++ "id": "network.frame-today",++ "version": "1.0.0",++ "schema": "network/frame-today.v1.json",++ "owner": "network",++ "visibility": "public",++ "compatibility": "backward",++ "status": "active"++ },++ {++ "id": "community.status",++ "version": "1.0.0",++ "schema": "community/status.v1.json",++ "owner": "community",++ "visibility": "public",++ "compatibility": "backward",++ "status": "active"++ },++ {++ "id": "community.pulse-contribute-request",++ "version": "1.0.0",++ "owner": "community",++ "schema": "community/pulse-contribute-request.v1.json",++ "visibility": "public",++ "compatibility": "backward",++ "status": "active"}]}nnew file mode 100644@@@ -0,0 +1,15 @@++{++ "$schema": "https://json-schema.org/draft/2020-12/schema",++ "$id": "https://openvibe.network/contracts/community/pulse-contribute-request.v1.json",++ "title": "CommunityPulseContributeRequest",++ "description": "An app with a person's community.pulse.contribute grant posts an item about that person. The app token supplies the person and app identity; the body cannot choose either.",++ "type": "object",++ "additionalProperties": false,++ "required": ["id", "text", "url"],++ "properties": {++ "id": { "type": "string", "pattern": "^[A-Za-z0-9_-]{1,80}$" },++ "text": { "type": "string", "minLength": 1, "maxLength": 300, "pattern": "\\S" },++ "url": { "type": "string", "maxLength": 2000, "pattern": "^https://" },++ "picture_url": { "type": "string", "maxLength": 2000, "pattern": "^https://openvibe\\.media/(t|o)/" }++ }++}@@@ -52,12 +52,10 @@]},"label": {-- "enum": [-- "AI",-- "System",-- null-- ]++ "enum": ["AI", "System", null]},++ "via": { "type": "string", "maxLength": 120, "description": "A third-party contribution is shown as via <app>." },++ "picture_url": { "type": "string", "maxLength": 2000, "pattern": "^https://openvibe\\.media/(t|o)/" },"actor": {"type": ["object",nnew file mode 100644@@@ -0,0 +1,17 @@++{++ "$schema": "https://json-schema.org/draft/2020-12/schema",++ "$id": "https://openvibe.network/contracts/community/status.v1.json",++ "title": "CommunityStatus",++ "description": "community.status@1: a public status written by POST /api/v1/me/status. At most one https link may appear across text and link; Community checks this after validating the schema. The opening post id supports the existing post reaction and reply routes.",++ "type": "object",++ "additionalProperties": false,++ "required": ["text"],++ "properties": {++ "text": { "type": "string", "minLength": 1, "maxLength": 500, "pattern": "\\S" },++ "link": { "type": ["string", "null"], "maxLength": 2000, "pattern": "^https://" },++ "id": { "type": "integer" },++ "post_id": { "type": "integer" },++ "url": { "type": "string", "pattern": "^https://" },++ "created_at": { "type": "string", "format": "date-time" }++ }++}@@@ -92,6 +92,7 @@"pattern": "^usr_[0-9A-HJKMNP-TV-Z]{26}$","description": "The person who authorized an app through the authorization-code flow, or the owner an agent acts for (always present on agent tokens). Also present on a node token that asks for an audience where the machine acts for its owner (Agent Streams S1: openvibe.live and live.agent_stream.publish); absent on every other client_credentials token."},++ "app_name": { "type": "string", "maxLength": 80, "description": "Signed display name of a developer app, for attribution such as via <app>." },"consent": {"type": "array","maxItems": 4,nnew file mode 100644@@@ -0,0 +1,20 @@++{++ "$schema": "https://json-schema.org/draft/2020-12/schema",++ "$id": "https://openvibe.network/contracts/network/frame-today.v1.json",++ "title": "NetworkFrameToday",++ "description": "network.frame-today@1: public UTC-day totals from Report's stats, with a fourteen-day series. People counts new accounts. A null count means Report does not publish a daily number for that metric.",++ "type": "object",++ "additionalProperties": false,++ "required": ["day", "people_today", "streams_today", "posts_today", "new_videos_today", "series", "updated_at"],++ "properties": {++ "day": { "type": "string", "format": "date" },++ "people_today": { "type": ["integer", "null"], "minimum": 0, "description": "New accounts today, from Report's accounts.daily series." },++ "streams_today": { "type": ["integer", "null"], "minimum": 0 },++ "posts_today": { "type": ["integer", "null"], "minimum": 0 },++ "new_videos_today": { "type": ["integer", "null"], "minimum": 0 },++ "series": { "type": "array", "minItems": 14, "maxItems": 14, "items": { "type": "object", "additionalProperties": false, "required": ["day", "people", "streams", "posts", "new_videos"], "properties": {++ "day": { "type": "string", "format": "date" }, "people": { "type": ["integer", "null"], "minimum": 0 }, "streams": { "type": ["integer", "null"], "minimum": 0 }, "posts": { "type": ["integer", "null"], "minimum": 0 }, "new_videos": { "type": ["integer", "null"], "minimum": 0 }++ } } },++ "updated_at": { "type": "string", "format": "date-time" }++ }++}nnew file mode 100644@@@ -0,0 +1,18 @@++{++ "$schema": "https://json-schema.org/draft/2020-12/schema",++ "$id": "https://openvibe.network/contracts/network/home-screen.v1.json",++ "title": "NetworkHomeScreen",++ "description": "network.home-screen@1: a person's ordered Home icons and folders. GET and PUT /api/v1/me/home-screen use a Bearer user session.",++ "type": "object",++ "additionalProperties": false,++ "required": ["home", "folders", "updated_at"],++ "properties": {++ "home": { "type": "array", "maxItems": 40, "uniqueItems": true, "items": { "type": "string", "pattern": "^(?:[a-z0-9-]{1,40}|folder:[a-z0-9-]{1,40}|tools:[a-z0-9-]{1,40})$" } },++ "folders": { "type": "array", "maxItems": 40, "items": { "type": "object", "additionalProperties": false, "required": ["id", "name", "apps"], "properties": {++ "id": { "type": "string", "pattern": "^[a-z0-9-]{1,40}$" },++ "name": { "type": "string", "minLength": 1, "maxLength": 60 },++ "apps": { "type": "array", "maxItems": 40, "uniqueItems": true, "items": { "type": "string", "pattern": "^(?:[a-z0-9-]{1,40}|tools:[a-z0-9-]{1,40})$" } }++ } } },++ "updated_at": { "type": ["string", "null"], "format": "date-time" }++ }++}nnew file mode 100644@@@ -0,0 +1,14 @@++{++ "$schema": "https://json-schema.org/draft/2020-12/schema",++ "$id": "https://openvibe.network/contracts/network/menu-feeds.v2.json",++ "title": "NetworkMenuFeedsV2",++ "description": "network.menu-feeds@2: every offered feed card is on unless its id is in off. order lists cards the person has positioned; other cards follow in their default order. GET and PUT /api/v1/me/menu-feeds.",++ "type": "object",++ "additionalProperties": false,++ "required": ["order", "off", "updated_at"],++ "properties": {++ "order": { "type": "array", "maxItems": 100, "uniqueItems": true, "items": { "type": "string", "pattern": "^[a-z0-9-]{1,30}:[a-z0-9-]{1,30}$" } },++ "off": { "type": "array", "maxItems": 100, "uniqueItems": true, "items": { "type": "string", "pattern": "^[a-z0-9-]{1,30}:[a-z0-9-]{1,30}$" } },++ "updated_at": { "type": ["string", "null"], "format": "date-time" }++ }++}nnew file mode 100644@@@ -0,0 +1 @@++{ "id": "demo-2", "text": "A new demo", "url": "https://example.test/demo", "picture_url": "https://example.test/demo.jpg" }nnew file mode 100644@@@ -0,0 +1,5 @@++{++ "id": "launch-1",++ "text": "A new demo",++ "url": "http://example.test/demo"++}nnew file mode 100644@@@ -0,0 +1 @@++{ "id": "demo-2", "text": "A new demo", "url": "https://example.test/demo", "picture_url": "https://openvibe.media/t/demo.jpg" }nnew file mode 100644@@@ -0,0 +1,5 @@++{++ "id": "launch-1",++ "text": "A new demo",++ "url": "https://example.test/demo"++}nnew file mode 100644@@@ -0,0 +1,3 @@++{++ "text": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"++}nnew file mode 100644@@@ -0,0 +1,4 @@++{++ "text": "Hello OpenVibe",++ "link": "https://openvibe.live/"++}nnew file mode 100644@@@ -0,0 +1,9 @@++{++ "day": "2026-11-09",++ "people_today": 1,++ "streams_today": 2,++ "posts_today": 0,++ "new_videos_today": 0,++ "series": [],++ "updated_at": "2026-11-09T12:00:00Z"++}nnew file mode 100644@@@ -0,0 +1,108 @@++{++ "day": "2026-11-09",++ "people_today": null,++ "streams_today": 2,++ "posts_today": null,++ "new_videos_today": null,++ "series": [++ {++ "day": "2026-11-01",++ "people": null,++ "streams": null,++ "posts": null,++ "new_videos": null++ },++ {++ "day": "2026-11-02",++ "people": null,++ "streams": null,++ "posts": null,++ "new_videos": null++ },++ {++ "day": "2026-11-03",++ "people": null,++ "streams": null,++ "posts": null,++ "new_videos": null++ },++ {++ "day": "2026-11-04",++ "people": null,++ "streams": null,++ "posts": null,++ "new_videos": null++ },++ {++ "day": "2026-11-05",++ "people": null,++ "streams": null,++ "posts": null,++ "new_videos": null++ },++ {++ "day": "2026-11-06",++ "people": null,++ "streams": null,++ "posts": null,++ "new_videos": null++ },++ {++ "day": "2026-11-07",++ "people": null,++ "streams": null,++ "posts": null,++ "new_videos": null++ },++ {++ "day": "2026-11-08",++ "people": null,++ "streams": null,++ "posts": null,++ "new_videos": null++ },++ {++ "day": "2026-11-09",++ "people": null,++ "streams": null,++ "posts": null,++ "new_videos": null++ },++ {++ "day": "2026-11-10",++ "people": null,++ "streams": null,++ "posts": null,++ "new_videos": null++ },++ {++ "day": "2026-11-11",++ "people": null,++ "streams": null,++ "posts": null,++ "new_videos": null++ },++ {++ "day": "2026-11-12",++ "people": null,++ "streams": null,++ "posts": null,++ "new_videos": null++ },++ {++ "day": "2026-11-13",++ "people": null,++ "streams": null,++ "posts": null,++ "new_videos": null++ },++ {++ "day": "2026-11-14",++ "people": null,++ "streams": null,++ "posts": null,++ "new_videos": null++ }++ ],++ "updated_at": "2026-11-09T12:00:00Z"++}nnew file mode 100644@@@ -0,0 +1,47 @@++{++ "home": [++ "app0",++ "app1",++ "app2",++ "app3",++ "app4",++ "app5",++ "app6",++ "app7",++ "app8",++ "app9",++ "app10",++ "app11",++ "app12",++ "app13",++ "app14",++ "app15",++ "app16",++ "app17",++ "app18",++ "app19",++ "app20",++ "app21",++ "app22",++ "app23",++ "app24",++ "app25",++ "app26",++ "app27",++ "app28",++ "app29",++ "app30",++ "app31",++ "app32",++ "app33",++ "app34",++ "app35",++ "app36",++ "app37",++ "app38",++ "app39",++ "app40"++ ],++ "folders": [],++ "updated_at": null++}nnew file mode 100644@@@ -0,0 +1,16 @@++{++ "home": [++ "live",++ "folder:tools"++ ],++ "folders": [++ {++ "id": "tools",++ "name": "Tools",++ "apps": [++ "tools:qr"++ ]++ }++ ],++ "updated_at": "2026-11-09T12:00:00Z"++}@@@ -277,6 +277,11 @@"pattern": "^usr_[0-9A-HJKMNP-TV-Z]{26}$","description": "The person who authorized an app through the authorization-code flow, or the owner an agent acts for (always present on agent tokens). Also present on a node token that asks for an audience where the machine acts for its owner (Agent Streams S1: openvibe.live and live.agent_stream.publish); absent on every other client_credentials token."},++ "app_name": {++ "type": "string",++ "maxLength": 80,++ "description": "Signed display name of a developer app, for attribution such as via <app>."++ },"consent": {"type": "array","maxItems": 4,@@@ -66976,6 +66981,16 @@null]},++ "via": {++ "type": "string",++ "maxLength": 120,++ "description": "A third-party contribution is shown as via <app>."++ },++ "picture_url": {++ "type": "string",++ "maxLength": 2000,++ "pattern": "^https://openvibe\\.media/(t|o)/"++ },"actor": {"type": ["object",@@@ -112864,7 +112879,7 @@}}},-- "network.menu-feeds": {++ "network.menu-feeds@1": {"version": "1.0.0","owner": "network","status": "active",@@@ -113944,6 +113959,317 @@"additionalProperties": true,"description": "report.ai-picks@1: public OpenVibe.Report AI comparison response, with source dates and sample sizes for reported measurements."}++ },++ "network.home-screen": {++ "version": "1.0.0",++ "owner": "network",++ "status": "active",++ "schema": {++ "$schema": "https://json-schema.org/draft/2020-12/schema",++ "$id": "https://openvibe.network/contracts/network/home-screen.v1.json",++ "title": "NetworkHomeScreen",++ "description": "network.home-screen@1: a person's ordered Home icons and folders. GET and PUT /api/v1/me/home-screen use a Bearer user session.",++ "type": "object",++ "additionalProperties": false,++ "required": [++ "home",++ "folders",++ "updated_at"++ ],++ "properties": {++ "home": {++ "type": "array",++ "maxItems": 40,++ "uniqueItems": true,++ "items": {++ "type": "string",++ "pattern": "^(?:[a-z0-9-]{1,40}|folder:[a-z0-9-]{1,40}|tools:[a-z0-9-]{1,40})$"++ }++ },++ "folders": {++ "type": "array",++ "maxItems": 40,++ "items": {++ "type": "object",++ "additionalProperties": false,++ "required": [++ "id",++ "name",++ "apps"++ ],++ "properties": {++ "id": {++ "type": "string",++ "pattern": "^[a-z0-9-]{1,40}$"++ },++ "name": {++ "type": "string",++ "minLength": 1,++ "maxLength": 60++ },++ "apps": {++ "type": "array",++ "maxItems": 40,++ "uniqueItems": true,++ "items": {++ "type": "string",++ "pattern": "^(?:[a-z0-9-]{1,40}|tools:[a-z0-9-]{1,40})$"++ }++ }++ }++ }++ },++ "updated_at": {++ "type": [++ "string",++ "null"++ ],++ "format": "date-time"++ }++ }++ }++ },++ "network.menu-feeds@2": {++ "version": "2.0.0",++ "owner": "network",++ "status": "active",++ "schema": {++ "$schema": "https://json-schema.org/draft/2020-12/schema",++ "$id": "https://openvibe.network/contracts/network/menu-feeds.v2.json",++ "title": "NetworkMenuFeedsV2",++ "description": "network.menu-feeds@2: every offered feed card is on unless its id is in off. order lists cards the person has positioned; other cards follow in their default order. GET and PUT /api/v1/me/menu-feeds.",++ "type": "object",++ "additionalProperties": false,++ "required": [++ "order",++ "off",++ "updated_at"++ ],++ "properties": {++ "order": {++ "type": "array",++ "maxItems": 100,++ "uniqueItems": true,++ "items": {++ "type": "string",++ "pattern": "^[a-z0-9-]{1,30}:[a-z0-9-]{1,30}$"++ }++ },++ "off": {++ "type": "array",++ "maxItems": 100,++ "uniqueItems": true,++ "items": {++ "type": "string",++ "pattern": "^[a-z0-9-]{1,30}:[a-z0-9-]{1,30}$"++ }++ },++ "updated_at": {++ "type": [++ "string",++ "null"++ ],++ "format": "date-time"++ }++ }++ }++ },++ "network.frame-today": {++ "version": "1.0.0",++ "owner": "network",++ "status": "active",++ "schema": {++ "$schema": "https://json-schema.org/draft/2020-12/schema",++ "$id": "https://openvibe.network/contracts/network/frame-today.v1.json",++ "title": "NetworkFrameToday",++ "description": "network.frame-today@1: public UTC-day totals from Report's stats, with a fourteen-day series. People counts new accounts. A null count means Report does not publish a daily number for that metric.",++ "type": "object",++ "additionalProperties": false,++ "required": [++ "day",++ "people_today",++ "streams_today",++ "posts_today",++ "new_videos_today",++ "series",++ "updated_at"++ ],++ "properties": {++ "day": {++ "type": "string",++ "format": "date"++ },++ "people_today": {++ "type": [++ "integer",++ "null"++ ],++ "minimum": 0,++ "description": "New accounts today, from Report's accounts.daily series."++ },++ "streams_today": {++ "type": [++ "integer",++ "null"++ ],++ "minimum": 0++ },++ "posts_today": {++ "type": [++ "integer",++ "null"++ ],++ "minimum": 0++ },++ "new_videos_today": {++ "type": [++ "integer",++ "null"++ ],++ "minimum": 0++ },++ "series": {++ "type": "array",++ "minItems": 14,++ "maxItems": 14,++ "items": {++ "type": "object",++ "additionalProperties": false,++ "required": [++ "day",++ "people",++ "streams",++ "posts",++ "new_videos"++ ],++ "properties": {++ "day": {++ "type": "string",++ "format": "date"++ },++ "people": {++ "type": [++ "integer",++ "null"++ ],++ "minimum": 0++ },++ "streams": {++ "type": [++ "integer",++ "null"++ ],++ "minimum": 0++ },++ "posts": {++ "type": [++ "integer",++ "null"++ ],++ "minimum": 0++ },++ "new_videos": {++ "type": [++ "integer",++ "null"++ ],++ "minimum": 0++ }++ }++ }++ },++ "updated_at": {++ "type": "string",++ "format": "date-time"++ }++ }++ }++ },++ "community.status": {++ "version": "1.0.0",++ "owner": "community",++ "status": "active",++ "schema": {++ "$schema": "https://json-schema.org/draft/2020-12/schema",++ "$id": "https://openvibe.network/contracts/community/status.v1.json",++ "title": "CommunityStatus",++ "description": "community.status@1: a public status written by POST /api/v1/me/status. At most one https link may appear across text and link; Community checks this after validating the schema. The opening post id supports the existing post reaction and reply routes.",++ "type": "object",++ "additionalProperties": false,++ "required": [++ "text"++ ],++ "properties": {++ "text": {++ "type": "string",++ "minLength": 1,++ "maxLength": 500,++ "pattern": "\\S"++ },++ "link": {++ "type": [++ "string",++ "null"++ ],++ "maxLength": 2000,++ "pattern": "^https://"++ },++ "id": {++ "type": "integer"++ },++ "post_id": {++ "type": "integer"++ },++ "url": {++ "type": "string",++ "pattern": "^https://"++ },++ "created_at": {++ "type": "string",++ "format": "date-time"++ }++ }++ }++ },++ "community.pulse-contribute-request": {++ "version": "1.0.0",++ "owner": "community",++ "status": "active",++ "schema": {++ "$schema": "https://json-schema.org/draft/2020-12/schema",++ "$id": "https://openvibe.network/contracts/community/pulse-contribute-request.v1.json",++ "title": "CommunityPulseContributeRequest",++ "description": "An app with a person's community.pulse.contribute grant posts an item about that person. The app token supplies the person and app identity; the body cannot choose either.",++ "type": "object",++ "additionalProperties": false,++ "required": [++ "id",++ "text",++ "url"++ ],++ "properties": {++ "id": {++ "type": "string",++ "pattern": "^[A-Za-z0-9_-]{1,80}$"++ },++ "text": {++ "type": "string",++ "minLength": 1,++ "maxLength": 300,++ "pattern": "\\S"++ },++ "url": {++ "type": "string",++ "maxLength": 2000,++ "pattern": "^https://"++ },++ "picture_url": {++ "type": "string",++ "maxLength": 2000,++ "pattern": "^https://openvibe\\.media/(t|o)/"++ }++ }++ }}}}@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Actor API",-- "version": "0.351.0",-- "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.351.0): each operation lists the capabilities it performs; a token for 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.352.0",++ "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.352.0): each operation lists the capabilities it performs; a token for 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.AI API",-- "version": "0.351.0",-- "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.351.0): each operation lists the capabilities it performs; a token for 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.352.0",++ "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.352.0): each operation lists the capabilities it performs; a token for 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.Bench API",-- "version": "0.351.0",-- "description": "Routes of OpenVibe.Bench as the OpenVibe contracts describe them (openvibe-contracts 0.351.0): each operation lists the capabilities it performs; a token for 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.352.0",++ "description": "Routes of OpenVibe.Bench as the OpenVibe contracts describe them (openvibe-contracts 0.352.0): each operation lists the capabilities it performs; a token for 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.351.0",-- "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.351.0): each operation lists the capabilities it performs; a token for 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.352.0",++ "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.352.0): each operation lists the capabilities it performs; a token for 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.351.0",-- "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.351.0): each operation lists the capabilities it performs; a token for 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.352.0",++ "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.352.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Bot API",-- "version": "0.351.0",-- "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.351.0): each operation lists the capabilities it performs; a token for 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.352.0",++ "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.352.0): each operation lists the capabilities it performs; a token for 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.351.0",-- "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.351.0): each operation lists the capabilities it performs; a token for 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.352.0",++ "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.352.0): each operation lists the capabilities it performs; a token for 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.351.0",-- "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.351.0): each operation lists the capabilities it performs; a token for 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.352.0",++ "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.352.0): each operation lists the capabilities it performs; a token for 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.351.0",-- "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.351.0): each operation lists the capabilities it performs; a token for 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.352.0",++ "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.352.0): each operation lists the capabilities it performs; a token for 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"@@@ -1067,19 +1067,26 @@"/api/v1/pulse/items": {"post": {"operationId": "post_api_v1_pulse_items",-- "summary": "Publish public activity of the calling service's own entities to Pulse (EntityRef + title + url + origin user|ai|system + occurred_at), or retract it.",-- "description": "**community.pulse.write** (first-party): Publish public activity of the calling service's own entities to Pulse (EntityRef + title + url + origin user|ai|system + occurred_at), or retract it. Only visibility public is accepted; the ref's service must be the caller's. Provenance is kept: the first record's origin, actor (X-OV-Subject, never for ai/system) and time stand.",++ "summary": "A person grants an app permission to publish and retract public text and https links in Pulse about that person.",++ "description": "**community.pulse.contribute** (public): A person grants an app permission to publish and retract public text and https links in Pulse about that person. Community labels each item via the app and limits each app separately; pictures must use Media's public HTTPS thumbnail or object paths.\n\n**community.pulse.write** (first-party): Publish public activity of the calling service's own entities to Pulse (EntityRef + title + url + origin user|ai|system + occurred_at), or retract it. Only visibility public is accepted; the ref's service must be the caller's. Provenance is kept: the first record's origin, actor (X-OV-Subject, never for ai/system) and time stand.","tags": ["community.pulse"],"x-openvibe-capabilities": [++ "community.pulse.contribute","community.pulse.write"],"x-openvibe-visibility": [++ "public","first-party"],"x-openvibe-quota-class": "community-write","security": [++ {++ "openvibeToken": [++ "community.pulse.contribute"++ ]++ },{"openvibeToken": ["community.pulse.write"@@@ -1091,7 +1098,14 @@"content": {"application/json": {"schema": {-- "$ref": "#/components/schemas/community.pulse-write-request.v1"++ "anyOf": [++ {++ "$ref": "#/components/schemas/community.pulse-contribute-request.v1"++ },++ {++ "$ref": "#/components/schemas/community.pulse-write-request.v1"++ }++ ]}}}@@@ -1123,19 +1137,26 @@"/api/v1/pulse/items/{service}/{type}/{id}": {"delete": {"operationId": "delete_api_v1_pulse_items_service_type_id",-- "summary": "Publish public activity of the calling service's own entities to Pulse (EntityRef + title + url + origin user|ai|system + occurred_at), or retract it.",-- "description": "**community.pulse.write** (first-party): Publish public activity of the calling service's own entities to Pulse (EntityRef + title + url + origin user|ai|system + occurred_at), or retract it. Only visibility public is accepted; the ref's service must be the caller's. Provenance is kept: the first record's origin, actor (X-OV-Subject, never for ai/system) and time stand.",++ "summary": "A person grants an app permission to publish and retract public text and https links in Pulse about that person.",++ "description": "**community.pulse.contribute** (public): A person grants an app permission to publish and retract public text and https links in Pulse about that person. Community labels each item via the app and limits each app separately; pictures must use Media's public HTTPS thumbnail or object paths.\n\n**community.pulse.write** (first-party): Publish public activity of the calling service's own entities to Pulse (EntityRef + title + url + origin user|ai|system + occurred_at), or retract it. Only visibility public is accepted; the ref's service must be the caller's. Provenance is kept: the first record's origin, actor (X-OV-Subject, never for ai/system) and time stand.","tags": ["community.pulse"],"x-openvibe-capabilities": [++ "community.pulse.contribute","community.pulse.write"],"x-openvibe-visibility": [++ "public","first-party"],"x-openvibe-quota-class": "community-write","security": [++ {++ "openvibeToken": [++ "community.pulse.contribute"++ ]++ },{"openvibeToken": ["community.pulse.write"@@@ -1143,7 +1164,14 @@}],"x-openvibe-input": {-- "$ref": "#/components/schemas/community.pulse-write-request.v1"++ "anyOf": [++ {++ "$ref": "#/components/schemas/community.pulse-contribute-request.v1"++ },++ {++ "$ref": "#/components/schemas/community.pulse-write-request.v1"++ }++ ]},"parameters": [{@@@ -1169,6 +1197,37 @@"schema": {"type": "string"}++ },++ {++ "name": "text",++ "in": "query",++ "required": true,++ "schema": {++ "type": "string",++ "minLength": 1,++ "maxLength": 300,++ "pattern": "\\S"++ }++ },++ {++ "name": "url",++ "in": "query",++ "required": true,++ "schema": {++ "type": "string",++ "maxLength": 2000,++ "pattern": "^https://"++ }++ },++ {++ "name": "picture_url",++ "in": "query",++ "required": false,++ "schema": {++ "type": "string",++ "maxLength": 2000,++ "pattern": "^https://openvibe\\.media/(t|o)/"++ }}],"responses": {@@@ -4963,6 +5022,39 @@}]},++ "community.pulse-contribute-request.v1": {++ "title": "CommunityPulseContributeRequest",++ "description": "An app with a person's community.pulse.contribute grant posts an item about that person. The app token supplies the person and app identity; the body cannot choose either.",++ "type": "object",++ "additionalProperties": false,++ "required": [++ "id",++ "text",++ "url"++ ],++ "properties": {++ "id": {++ "type": "string",++ "pattern": "^[A-Za-z0-9_-]{1,80}$"++ },++ "text": {++ "type": "string",++ "minLength": 1,++ "maxLength": 300,++ "pattern": "\\S"++ },++ "url": {++ "type": "string",++ "maxLength": 2000,++ "pattern": "^https://"++ },++ "picture_url": {++ "type": "string",++ "maxLength": 2000,++ "pattern": "^https://openvibe\\.media/(t|o)/"++ }++ }++ },"community.pulse-item.v1": {"title": "CommunityPulseItem","description": "community.pulse-item@1: one item of the network's public activity on OpenVibe.Community (server/pulse/service.js shape), with provenance: its source entity, title, url, origin (user, ai or system), the AI or System label, the actor (a person for user items, never for AI or system ones) and when it happened.",@@@ -5021,6 +5113,16 @@null]},++ "via": {++ "type": "string",++ "maxLength": 120,++ "description": "A third-party contribution is shown as via <app>."++ },++ "picture_url": {++ "type": "string",++ "maxLength": 2000,++ "pattern": "^https://openvibe\\.media/(t|o)/"++ },"actor": {"type": ["object",@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe Connect API",-- "version": "0.351.0",-- "description": "Routes of OpenVibe Connect as the OpenVibe contracts describe them (openvibe-contracts 0.351.0): each operation lists the capabilities it performs; a token for 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.352.0",++ "description": "Routes of OpenVibe Connect as the OpenVibe contracts describe them (openvibe-contracts 0.352.0): each operation lists the capabilities it performs; a token for 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.351.0",-- "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.351.0): each operation lists the capabilities it performs; a token for 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.352.0",++ "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.352.0): each operation lists the capabilities it performs; a token for 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.351.0",-- "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.351.0): each operation lists the capabilities it performs; a token for 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.352.0",++ "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.352.0): each operation lists the capabilities it performs; a token for 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.Design API",-- "version": "0.351.0",-- "description": "Routes of OpenVibe.Design as the OpenVibe contracts describe them (openvibe-contracts 0.351.0): each operation lists the capabilities it performs; a token for 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.352.0",++ "description": "Routes of OpenVibe.Design as the OpenVibe contracts describe them (openvibe-contracts 0.352.0): each operation lists the capabilities it performs; a token for 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.Domains API",-- "version": "0.351.0",-- "description": "Routes of OpenVibe.Domains as the OpenVibe contracts describe them (openvibe-contracts 0.351.0): each operation lists the capabilities it performs; a token for 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.352.0",++ "description": "Routes of OpenVibe.Domains as the OpenVibe contracts describe them (openvibe-contracts 0.352.0): each operation lists the capabilities it performs; a token for 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.351.0",-- "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.351.0): each operation lists the capabilities it performs; a token for 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.352.0",++ "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.352.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Food API",-- "version": "0.351.0",-- "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.351.0): each operation lists the capabilities it performs; a token for 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.352.0",++ "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.352.0): each operation lists the capabilities it performs; a token for 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.351.0",-- "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.351.0): each operation lists the capabilities it performs; a token for 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.352.0",++ "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.352.0): each operation lists the capabilities it performs; a token for 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.351.0",-- "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.351.0): each operation lists the capabilities it performs; a token for 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.352.0",++ "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.352.0): each operation lists the capabilities it performs; a token for 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"@@@ -62,7 +62,7 @@"name": "OpenVibe.Community","origin": "https://openvibe.community","operations": 40,-- "capabilities": 13++ "capabilities": 14},{"service": "connect",@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Inventory API",-- "version": "0.351.0",-- "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.351.0): each operation lists the capabilities it performs; a token for 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.352.0",++ "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.352.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Live API",-- "version": "0.351.0",-- "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.351.0): each operation lists the capabilities it performs; a token for 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.352.0",++ "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.352.0): each operation lists the capabilities it performs; a token for 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.Mail API",-- "version": "0.351.0",-- "description": "Routes of OpenVibe.Mail as the OpenVibe contracts describe them (openvibe-contracts 0.351.0): each operation lists the capabilities it performs; a token for 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.352.0",++ "description": "Routes of OpenVibe.Mail as the OpenVibe contracts describe them (openvibe-contracts 0.352.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.MediaHub API",-- "version": "0.351.0",-- "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.351.0): each operation lists the capabilities it performs; a token for 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.352.0",++ "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.352.0): each operation lists the capabilities it performs; a token for 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.351.0",-- "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.351.0): each operation lists the capabilities it performs; a token for 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.352.0",++ "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.352.0): each operation lists the capabilities it performs; a token for 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.351.0",-- "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.351.0): each operation lists the capabilities it performs; a token for 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.352.0",++ "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.352.0): each operation lists the capabilities it performs; a token for 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.News API",-- "version": "0.351.0",-- "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.351.0): each operation lists the capabilities it performs; a token for 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.352.0",++ "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.352.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenRestream API",-- "version": "0.351.0",-- "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.351.0): each operation lists the capabilities it performs; a token for 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.352.0",++ "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.352.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Play API",-- "version": "0.351.0",-- "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.351.0): each operation lists the capabilities it performs; a token for 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.352.0",++ "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.352.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Quest API",-- "version": "0.351.0",-- "description": "Routes of OpenVibe.Quest as the OpenVibe contracts describe them (openvibe-contracts 0.351.0): each operation lists the capabilities it performs; a token for 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.352.0",++ "description": "Routes of OpenVibe.Quest as the OpenVibe contracts describe them (openvibe-contracts 0.352.0): each operation lists the capabilities it performs; a token for 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.Report API",-- "version": "0.351.0",-- "description": "Routes of OpenVibe.Report as the OpenVibe contracts describe them (openvibe-contracts 0.351.0): each operation lists the capabilities it performs; a token for 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.352.0",++ "description": "Routes of OpenVibe.Report as the OpenVibe contracts describe them (openvibe-contracts 0.352.0): each operation lists the capabilities it performs; a token for 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.351.0",-- "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.351.0): each operation lists the capabilities it performs; a token for 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.352.0",++ "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.352.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Run API",-- "version": "0.351.0",-- "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.351.0): each operation lists the capabilities it performs; a token for 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.352.0",++ "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.352.0): each operation lists the capabilities it performs; a token for 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.351.0",-- "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.351.0): each operation lists the capabilities it performs; a token for 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.352.0",++ "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.352.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Services API",-- "version": "0.351.0",-- "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.351.0): each operation lists the capabilities it performs; a token for 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.352.0",++ "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.352.0): each operation lists the capabilities it performs; a token for 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.351.0",-- "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.351.0): each operation lists the capabilities it performs; a token for 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.352.0",++ "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.352.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Space API",-- "version": "0.351.0",-- "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.351.0): each operation lists the capabilities it performs; a token for 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.352.0",++ "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.352.0): each operation lists the capabilities it performs; a token for 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.351.0",-- "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.351.0): each operation lists the capabilities it performs; a token for 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.352.0",++ "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.352.0): each operation lists the capabilities it performs; a token for 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.Today API",-- "version": "0.351.0",-- "description": "Routes of OpenVibe.Today as the OpenVibe contracts describe them (openvibe-contracts 0.351.0): each operation lists the capabilities it performs; a token for 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.352.0",++ "description": "Routes of OpenVibe.Today as the OpenVibe contracts describe them (openvibe-contracts 0.352.0): each operation lists the capabilities it performs; a token for 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.351.0",-- "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.351.0): each operation lists the capabilities it performs; a token for 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.352.0",++ "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.352.0): each operation lists the capabilities it performs; a token for 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.351.0",-- "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.351.0): each operation lists the capabilities it performs; a token for 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.352.0",++ "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.352.0): each operation lists the capabilities it performs; a token for 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.351.0",-- "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.351.0): each operation lists the capabilities it performs; a token for 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.352.0",++ "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.352.0): each operation lists the capabilities it performs; a token for 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.Vision API",-- "version": "0.351.0",-- "description": "Routes of OpenVibe.Vision as the OpenVibe contracts describe them (openvibe-contracts 0.351.0): each operation lists the capabilities it performs; a token for 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.352.0",++ "description": "Routes of OpenVibe.Vision as the OpenVibe contracts describe them (openvibe-contracts 0.352.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Watch API",-- "version": "0.351.0",-- "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.351.0): each operation lists the capabilities it performs; a token for 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.352.0",++ "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.352.0): each operation lists the capabilities it performs; a token for 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.351.0",-- "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.351.0): each operation lists the capabilities it performs; a token for 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.352.0",++ "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.352.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Work API",-- "version": "0.351.0",-- "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.351.0): each operation lists the capabilities it performs; a token for 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.352.0",++ "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.352.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Zone API",-- "version": "0.351.0",-- "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.351.0): each operation lists the capabilities it performs; a token for 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.352.0",++ "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.352.0): each operation lists the capabilities it performs; a token for 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"@@@ -95,6 +95,10 @@ export type ServiceTokenClaims = {* The person who authorized an app through the authorization-code flow, or the owner an agent acts for (always present on agent tokens). Also present on a node token that asks for an audience where the machine acts for its owner (Agent Streams S1: openvibe.live and live.agent_stream.publish); absent on every other client_credentials token.*/on_behalf_of?: string;++ /**++ * Signed display name of a developer app, for attribution such as via <app>.++ */++ app_name?: string;/*** App tokens from the authorization-code flow (0.310.0): the purposes the person (on_behalf_of) granted this app at sign-in and that are still active when the token is issued, the claim network.consent-claim@1 defines. Present when the sign-in asked for consent:<purpose> scopes, [] when none is granted, absent otherwise.*@@@ -208032,6 +208036,11 @@ export interface CommunityPulseItem {url: string;origin: "user" | "ai" | "system";label: "AI" | "System" | null;++ /**++ * A third-party contribution is shown as via <app>.++ */++ via?: string;++ picture_url?: string;actor: {subject?: string | null;username?: string | null;@@@ -317411,3 +317420,186 @@ export interface ReportAiPicks {}[];[k: string]: unknown | undefined;}++++/** [email protected] (owner: network) */++/**++ * network.home-screen@1: a person's ordered Home icons and folders. GET and PUT /api/v1/me/home-screen use a Bearer user session.++ */++export interface NetworkHomeScreen {++ /**++ * @maxItems 40++ */++ home: string[];++ /**++ * @maxItems 40++ */++ folders: {++ id: string;++ name: string;++ /**++ * @maxItems 40++ */++ apps: string[];++ }[];++ updated_at: string | null;++}++++/** [email protected] (owner: network) */++/**++ * network.menu-feeds@2: every offered feed card is on unless its id is in off. order lists cards the person has positioned; other cards follow in their default order. GET and PUT /api/v1/me/menu-feeds.++ */++export interface NetworkMenuFeedsV2 {++ /**++ * @maxItems 100++ */++ order: string[];++ /**++ * @maxItems 100++ */++ off: string[];++ updated_at: string | null;++}++++/** [email protected] (owner: network) */++/**++ * network.frame-today@1: public UTC-day totals from Report's stats, with a fourteen-day series. People counts new accounts. A null count means Report does not publish a daily number for that metric.++ */++export interface NetworkFrameToday {++ day: string;++ /**++ * New accounts today, from Report's accounts.daily series.++ */++ people_today: number | null;++ streams_today: number | null;++ posts_today: number | null;++ new_videos_today: number | null;++ /**++ * @minItems 14++ * @maxItems 14++ */++ series: [++ {++ day: string;++ people: number | null;++ streams: number | null;++ posts: number | null;++ new_videos: number | null;++ },++ {++ day: string;++ people: number | null;++ streams: number | null;++ posts: number | null;++ new_videos: number | null;++ },++ {++ day: string;++ people: number | null;++ streams: number | null;++ posts: number | null;++ new_videos: number | null;++ },++ {++ day: string;++ people: number | null;++ streams: number | null;++ posts: number | null;++ new_videos: number | null;++ },++ {++ day: string;++ people: number | null;++ streams: number | null;++ posts: number | null;++ new_videos: number | null;++ },++ {++ day: string;++ people: number | null;++ streams: number | null;++ posts: number | null;++ new_videos: number | null;++ },++ {++ day: string;++ people: number | null;++ streams: number | null;++ posts: number | null;++ new_videos: number | null;++ },++ {++ day: string;++ people: number | null;++ streams: number | null;++ posts: number | null;++ new_videos: number | null;++ },++ {++ day: string;++ people: number | null;++ streams: number | null;++ posts: number | null;++ new_videos: number | null;++ },++ {++ day: string;++ people: number | null;++ streams: number | null;++ posts: number | null;++ new_videos: number | null;++ },++ {++ day: string;++ people: number | null;++ streams: number | null;++ posts: number | null;++ new_videos: number | null;++ },++ {++ day: string;++ people: number | null;++ streams: number | null;++ posts: number | null;++ new_videos: number | null;++ },++ {++ day: string;++ people: number | null;++ streams: number | null;++ posts: number | null;++ new_videos: number | null;++ },++ {++ day: string;++ people: number | null;++ streams: number | null;++ posts: number | null;++ new_videos: number | null;++ }++ ];++ updated_at: string;++}++++/** [email protected] (owner: community) */++/**++ * community.status@1: a public status written by POST /api/v1/me/status. At most one https link may appear across text and link; Community checks this after validating the schema. The opening post id supports the existing post reaction and reply routes.++ */++export interface CommunityStatus {++ text: string;++ link?: string | null;++ id?: number;++ post_id?: number;++ url?: string;++ created_at?: string;++}++++/** [email protected] (owner: community) */++/**++ * An app with a person's community.pulse.contribute grant posts an item about that person. The app token supplies the person and app identity; the body cannot choose either.++ */++export interface CommunityPulseContributeRequest {++ id: string;++ text: string;++ url: string;++ picture_url?: string;++}nnew file mode 100644@@@ -0,0 +1,16 @@++{++ "id": "community.pulse.contribute",++ "version": "1.0",++ "owner": "community",++ "status": "active",++ "visibility": "public",++ "sensitive": true,++ "description": "A person grants an app permission to publish and retract public text and https links in Pulse about that person. Community labels each item via the app and limits each app separately; pictures must use Media's public HTTPS thumbnail or object paths.",++ "inputSchema": "community.pulse-contribute-request@1",++ "outputSchema": "community.pulse-write-result@1",++ "permissions": ["community:write"],++ "resourceConstraints": ["owner"],++ "quotaClass": "community-write",++ "events": ["community.pulse.item_recorded"],++ "implementedBy": ["POST /api/v1/pulse/items", "DELETE /api/v1/pulse/items/:service/:type/:id"]++}@@@ -20,6 +20,7 @@"community.comment.write","community.comment.moderate","community.pulse.write",++ "community.pulse.contribute","community.space.read","community.space.manage","community.thread.read",@@@ -1,12 +1,12 @@{"name": "openvibe-contracts",-- "version": "0.351.0",++ "version": "0.352.0","lockfileVersion": 3,"requires": true,"packages": {"": {"name": "openvibe-contracts",-- "version": "0.351.0",++ "version": "0.352.0","license": "AGPL-3.0-only","dependencies": {"ajv": "^8.17.1",@@@ -1,6 +1,6 @@{"name": "openvibe-contracts",-- "version": "0.351.0",++ "version": "0.352.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",@@@ -119,12 +119,16 @@ for (const c of [...new Map(contracts.catalog.map((e) => [e.id, e])).values()])ok(list.length > 0, `${c.id} has ${kind} fixtures`);for (const f of list) {const value = JSON.parse(fs.readFileSync(path.join(dir, f), 'utf8'));-- const ref = majorRef(c.id, value);++ const ref = c.id === 'network.menu-feeds' ? 'network.menu-feeds@1' : majorRef(c.id, value);const r = FULL_CHECK[c.id] ? FULL_CHECK[c.id](value, ref) : contracts.validate(ref, value);ok(r.valid === (kind === 'valid'), `${c.id} ${kind}/${f}: ${r.valid ? 'passed' : JSON.stringify(r.errors)}`);}}}++ok(contracts.validate('network.menu-feeds@2', { order: ['today:today'], off: [], updated_at: null }).valid,++ 'menu-feeds v2 keeps an ordered default-on choice');++ok(!contracts.validate('network.menu-feeds@2', { order: ['today:today', 'today:today'], off: [], updated_at: null }).valid,++ 'menu-feeds v2 refuses duplicate order ids');assert.throws(() => contracts.resolve('identity.subject-ref@2'), /not @2/);ok(contracts.resolve('ai.credential-put@1').schema === 'ai/credential-put.v1.json' && contracts.resolve('ai.credential-put@2').schema === 'ai/credential-put.v2.json'&& contracts.resolve('ai.credential-put').version === '2.0.0', 'a contract with two majors resolves by id (newest) or by major');
@@ -1,5 +1,11 @@
@@ -1,5 +1,11 @@
# Changelog
# Changelog
+## 0.352.0 — 2026-11-09
+
+- The menu's home screen and wall (M1): `network.home-screen@1`, `network.menu-feeds@2` (order and off; v1's on reads as
+ the start of the order), `network.frame-today@1`, `community.status@1`, `community.pulse-contribute-request@1` and the
+ person-granted capability `community.pulse.contribute`, with fixtures and the manifests' routes.
+
## 0.351.0 — 2026-11-09
## 0.351.0 — 2026-11-09
- Add the five public Report AI comparison response contracts and fixtures, and list their cached public routes in the Report service manifest.
- Add the five public Report AI comparison response contracts and fixtures, and list their cached public routes in the Report service manifest.
@@ -10370,6 +10370,51 @@
@@ -10370,6 +10370,51 @@
"visibility": "public",
"visibility": "public",
"compatibility": "backward",
"compatibility": "backward",
"status": "active"
"status": "active"
+ },
+ {
+ "id": "network.home-screen",
+ "version": "1.0.0",
+ "schema": "network/home-screen.v1.json",
+ "owner": "network",
+ "visibility": "public",
+ "compatibility": "backward",
+ "status": "active"
+ },
+ {
+ "id": "network.menu-feeds",
+ "version": "2.0.0",
+ "schema": "network/menu-feeds.v2.json",
+ "owner": "network",
+ "visibility": "public",
+ "compatibility": "backward",
+ "status": "active"
+ },
+ {
+ "id": "network.frame-today",
+ "version": "1.0.0",
+ "schema": "network/frame-today.v1.json",
+ "owner": "network",
+ "visibility": "public",
+ "compatibility": "backward",
+ "status": "active"
+ },
+ {
+ "id": "community.status",
+ "version": "1.0.0",
+ "schema": "community/status.v1.json",
+ "owner": "community",
+ "visibility": "public",
+ "compatibility": "backward",
+ "status": "active"
+ },
+ {
+ "id": "community.pulse-contribute-request",
+ "version": "1.0.0",
+ "owner": "community",
+ "schema": "community/pulse-contribute-request.v1.json",
+ "visibility": "public",
+ "compatibility": "backward",
+ "status": "active"
}
}
]
]
}
}
new file mode 100644
new file mode 100644
@@ -0,0 +1,15 @@
@@ -0,0 +1,15 @@
+{
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "https://openvibe.network/contracts/community/pulse-contribute-request.v1.json",
+ "title": "CommunityPulseContributeRequest",
+ "description": "An app with a person's community.pulse.contribute grant posts an item about that person. The app token supplies the person and app identity; the body cannot choose either.",
+ "type": "object",
+ "additionalProperties": false,
+ "required": ["id", "text", "url"],
+ "properties": {
+ "id": { "type": "string", "pattern": "^[A-Za-z0-9_-]{1,80}$" },
+ "text": { "type": "string", "minLength": 1, "maxLength": 300, "pattern": "\\S" },
+ "url": { "type": "string", "maxLength": 2000, "pattern": "^https://" },
+ "picture_url": { "type": "string", "maxLength": 2000, "pattern": "^https://openvibe\\.media/(t|o)/" }
+ }
+}
@@ -52,12 +52,10 @@
@@ -52,12 +52,10 @@
]
]
},
},
"label": {
"label": {
- "enum": [
- "AI",
- "System",
- null
- ]
+ "enum": ["AI", "System", null]
},
},
+ "via": { "type": "string", "maxLength": 120, "description": "A third-party contribution is shown as via <app>." },
+ "picture_url": { "type": "string", "maxLength": 2000, "pattern": "^https://openvibe\\.media/(t|o)/" },
"actor": {
"actor": {
"type": [
"type": [
"object",
"object",
new file mode 100644
new file mode 100644
@@ -0,0 +1,17 @@
@@ -0,0 +1,17 @@
+{
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "https://openvibe.network/contracts/community/status.v1.json",
+ "title": "CommunityStatus",
+ "description": "community.status@1: a public status written by POST /api/v1/me/status. At most one https link may appear across text and link; Community checks this after validating the schema. The opening post id supports the existing post reaction and reply routes.",
+ "type": "object",
+ "additionalProperties": false,
+ "required": ["text"],
+ "properties": {
+ "text": { "type": "string", "minLength": 1, "maxLength": 500, "pattern": "\\S" },
+ "link": { "type": ["string", "null"], "maxLength": 2000, "pattern": "^https://" },
+ "id": { "type": "integer" },
+ "post_id": { "type": "integer" },
+ "url": { "type": "string", "pattern": "^https://" },
+ "created_at": { "type": "string", "format": "date-time" }
+ }
+}
@@ -92,6 +92,7 @@
@@ -92,6 +92,7 @@
"pattern": "^usr_[0-9A-HJKMNP-TV-Z]{26}$",
"pattern": "^usr_[0-9A-HJKMNP-TV-Z]{26}$",
"description": "The person who authorized an app through the authorization-code flow, or the owner an agent acts for (always present on agent tokens). Also present on a node token that asks for an audience where the machine acts for its owner (Agent Streams S1: openvibe.live and live.agent_stream.publish); absent on every other client_credentials token."
"description": "The person who authorized an app through the authorization-code flow, or the owner an agent acts for (always present on agent tokens). Also present on a node token that asks for an audience where the machine acts for its owner (Agent Streams S1: openvibe.live and live.agent_stream.publish); absent on every other client_credentials token."
},
},
+ "app_name": { "type": "string", "maxLength": 80, "description": "Signed display name of a developer app, for attribution such as via <app>." },
"consent": {
"consent": {
"type": "array",
"type": "array",
"maxItems": 4,
"maxItems": 4,
new file mode 100644
new file mode 100644
@@ -0,0 +1,20 @@
@@ -0,0 +1,20 @@
+{
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "https://openvibe.network/contracts/network/frame-today.v1.json",
+ "title": "NetworkFrameToday",
+ "description": "network.frame-today@1: public UTC-day totals from Report's stats, with a fourteen-day series. People counts new accounts. A null count means Report does not publish a daily number for that metric.",
+ "type": "object",
+ "additionalProperties": false,
+ "required": ["day", "people_today", "streams_today", "posts_today", "new_videos_today", "series", "updated_at"],
+ "properties": {
+ "day": { "type": "string", "format": "date" },
+ "people_today": { "type": ["integer", "null"], "minimum": 0, "description": "New accounts today, from Report's accounts.daily series." },
+ "streams_today": { "type": ["integer", "null"], "minimum": 0 },
+ "posts_today": { "type": ["integer", "null"], "minimum": 0 },
+ "new_videos_today": { "type": ["integer", "null"], "minimum": 0 },
+ "series": { "type": "array", "minItems": 14, "maxItems": 14, "items": { "type": "object", "additionalProperties": false, "required": ["day", "people", "streams", "posts", "new_videos"], "properties": {
+ "day": { "type": "string", "format": "date" }, "people": { "type": ["integer", "null"], "minimum": 0 }, "streams": { "type": ["integer", "null"], "minimum": 0 }, "posts": { "type": ["integer", "null"], "minimum": 0 }, "new_videos": { "type": ["integer", "null"], "minimum": 0 }
+ } } },
+ "updated_at": { "type": "string", "format": "date-time" }
+ }
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,18 @@
@@ -0,0 +1,18 @@
+{
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "https://openvibe.network/contracts/network/home-screen.v1.json",
+ "title": "NetworkHomeScreen",
+ "description": "network.home-screen@1: a person's ordered Home icons and folders. GET and PUT /api/v1/me/home-screen use a Bearer user session.",
+ "type": "object",
+ "additionalProperties": false,
+ "required": ["home", "folders", "updated_at"],
+ "properties": {
+ "home": { "type": "array", "maxItems": 40, "uniqueItems": true, "items": { "type": "string", "pattern": "^(?:[a-z0-9-]{1,40}|folder:[a-z0-9-]{1,40}|tools:[a-z0-9-]{1,40})$" } },
+ "folders": { "type": "array", "maxItems": 40, "items": { "type": "object", "additionalProperties": false, "required": ["id", "name", "apps"], "properties": {
+ "id": { "type": "string", "pattern": "^[a-z0-9-]{1,40}$" },
+ "name": { "type": "string", "minLength": 1, "maxLength": 60 },
+ "apps": { "type": "array", "maxItems": 40, "uniqueItems": true, "items": { "type": "string", "pattern": "^(?:[a-z0-9-]{1,40}|tools:[a-z0-9-]{1,40})$" } }
+ } } },
+ "updated_at": { "type": ["string", "null"], "format": "date-time" }
+ }
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,14 @@
@@ -0,0 +1,14 @@
+{
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "https://openvibe.network/contracts/network/menu-feeds.v2.json",
+ "title": "NetworkMenuFeedsV2",
+ "description": "network.menu-feeds@2: every offered feed card is on unless its id is in off. order lists cards the person has positioned; other cards follow in their default order. GET and PUT /api/v1/me/menu-feeds.",
+ "type": "object",
+ "additionalProperties": false,
+ "required": ["order", "off", "updated_at"],
+ "properties": {
+ "order": { "type": "array", "maxItems": 100, "uniqueItems": true, "items": { "type": "string", "pattern": "^[a-z0-9-]{1,30}:[a-z0-9-]{1,30}$" } },
+ "off": { "type": "array", "maxItems": 100, "uniqueItems": true, "items": { "type": "string", "pattern": "^[a-z0-9-]{1,30}:[a-z0-9-]{1,30}$" } },
+ "updated_at": { "type": ["string", "null"], "format": "date-time" }
+ }
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1 @@
@@ -0,0 +1 @@
+{ "id": "demo-2", "text": "A new demo", "url": "https://example.test/demo", "picture_url": "https://example.test/demo.jpg" }
new file mode 100644
new file mode 100644
@@ -0,0 +1,5 @@
@@ -0,0 +1,5 @@
+{
+ "id": "launch-1",
+ "text": "A new demo",
+ "url": "http://example.test/demo"
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1 @@
@@ -0,0 +1 @@
+{ "id": "demo-2", "text": "A new demo", "url": "https://example.test/demo", "picture_url": "https://openvibe.media/t/demo.jpg" }
new file mode 100644
new file mode 100644
@@ -0,0 +1,5 @@
@@ -0,0 +1,5 @@
+{
+ "id": "launch-1",
+ "text": "A new demo",
+ "url": "https://example.test/demo"
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,3 @@
@@ -0,0 +1,3 @@
+{
+ "text": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,4 @@
@@ -0,0 +1,4 @@
+{
+ "text": "Hello OpenVibe",
+ "link": "https://openvibe.live/"
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,9 @@
@@ -0,0 +1,9 @@
+{
+ "day": "2026-11-09",
+ "people_today": 1,
+ "streams_today": 2,
+ "posts_today": 0,
+ "new_videos_today": 0,
+ "series": [],
+ "updated_at": "2026-11-09T12:00:00Z"
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,108 @@
@@ -0,0 +1,108 @@
+{
+ "day": "2026-11-09",
+ "people_today": null,
+ "streams_today": 2,
+ "posts_today": null,
+ "new_videos_today": null,
+ "series": [
+ {
+ "day": "2026-11-01",
+ "people": null,
+ "streams": null,
+ "posts": null,
+ "new_videos": null
+ },
+ {
+ "day": "2026-11-02",
+ "people": null,
+ "streams": null,
+ "posts": null,
+ "new_videos": null
+ },
+ {
+ "day": "2026-11-03",
+ "people": null,
+ "streams": null,
+ "posts": null,
+ "new_videos": null
+ },
+ {
+ "day": "2026-11-04",
+ "people": null,
+ "streams": null,
+ "posts": null,
+ "new_videos": null
+ },
+ {
+ "day": "2026-11-05",
+ "people": null,
+ "streams": null,
+ "posts": null,
+ "new_videos": null
+ },
+ {
+ "day": "2026-11-06",
+ "people": null,
+ "streams": null,
+ "posts": null,
+ "new_videos": null
+ },
+ {
+ "day": "2026-11-07",
+ "people": null,
+ "streams": null,
+ "posts": null,
+ "new_videos": null
+ },
+ {
+ "day": "2026-11-08",
+ "people": null,
+ "streams": null,
+ "posts": null,
+ "new_videos": null
+ },
+ {
+ "day": "2026-11-09",
+ "people": null,
+ "streams": null,
+ "posts": null,
+ "new_videos": null
+ },
+ {
+ "day": "2026-11-10",
+ "people": null,
+ "streams": null,
+ "posts": null,
+ "new_videos": null
+ },
+ {
+ "day": "2026-11-11",
+ "people": null,
+ "streams": null,
+ "posts": null,
+ "new_videos": null
+ },
+ {
+ "day": "2026-11-12",
+ "people": null,
+ "streams": null,
+ "posts": null,
+ "new_videos": null
+ },
+ {
+ "day": "2026-11-13",
+ "people": null,
+ "streams": null,
+ "posts": null,
+ "new_videos": null
+ },
+ {
+ "day": "2026-11-14",
+ "people": null,
+ "streams": null,
+ "posts": null,
+ "new_videos": null
+ }
+ ],
+ "updated_at": "2026-11-09T12:00:00Z"
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,47 @@
@@ -0,0 +1,47 @@
+{
+ "home": [
+ "app0",
+ "app1",
+ "app2",
+ "app3",
+ "app4",
+ "app5",
+ "app6",
+ "app7",
+ "app8",
+ "app9",
+ "app10",
+ "app11",
+ "app12",
+ "app13",
+ "app14",
+ "app15",
+ "app16",
+ "app17",
+ "app18",
+ "app19",
+ "app20",
+ "app21",
+ "app22",
+ "app23",
+ "app24",
+ "app25",
+ "app26",
+ "app27",
+ "app28",
+ "app29",
+ "app30",
+ "app31",
+ "app32",
+ "app33",
+ "app34",
+ "app35",
+ "app36",
+ "app37",
+ "app38",
+ "app39",
+ "app40"
+ ],
+ "folders": [],
+ "updated_at": null
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,16 @@
@@ -0,0 +1,16 @@
+{
+ "home": [
+ "live",
+ "folder:tools"
+ ],
+ "folders": [
+ {
+ "id": "tools",
+ "name": "Tools",
+ "apps": [
+ "tools:qr"
+ ]
+ }
+ ],
+ "updated_at": "2026-11-09T12:00:00Z"
+}
@@ -277,6 +277,11 @@
@@ -277,6 +277,11 @@
"pattern": "^usr_[0-9A-HJKMNP-TV-Z]{26}$",
"pattern": "^usr_[0-9A-HJKMNP-TV-Z]{26}$",
"description": "The person who authorized an app through the authorization-code flow, or the owner an agent acts for (always present on agent tokens). Also present on a node token that asks for an audience where the machine acts for its owner (Agent Streams S1: openvibe.live and live.agent_stream.publish); absent on every other client_credentials token."
"description": "The person who authorized an app through the authorization-code flow, or the owner an agent acts for (always present on agent tokens). Also present on a node token that asks for an audience where the machine acts for its owner (Agent Streams S1: openvibe.live and live.agent_stream.publish); absent on every other client_credentials token."
},
},
+ "app_name": {
+ "type": "string",
+ "maxLength": 80,
+ "description": "Signed display name of a developer app, for attribution such as via <app>."
+ },
"consent": {
"consent": {
"type": "array",
"type": "array",
"maxItems": 4,
"maxItems": 4,
@@ -66976,6 +66981,16 @@
@@ -66976,6 +66981,16 @@
null
null
]
]
},
},
+ "via": {
+ "type": "string",
+ "maxLength": 120,
+ "description": "A third-party contribution is shown as via <app>."
+ },
+ "picture_url": {
+ "type": "string",
+ "maxLength": 2000,
+ "pattern": "^https://openvibe\\.media/(t|o)/"
+ },
"actor": {
"actor": {
"type": [
"type": [
"object",
"object",
@@ -112864,7 +112879,7 @@
@@ -112864,7 +112879,7 @@
}
}
}
}
},
},
- "network.menu-feeds": {
+ "network.menu-feeds@1": {
"version": "1.0.0",
"version": "1.0.0",
"owner": "network",
"owner": "network",
"status": "active",
"status": "active",
@@ -113944,6 +113959,317 @@
@@ -113944,6 +113959,317 @@
"additionalProperties": true,
"additionalProperties": true,
"description": "report.ai-picks@1: public OpenVibe.Report AI comparison response, with source dates and sample sizes for reported measurements."
"description": "report.ai-picks@1: public OpenVibe.Report AI comparison response, with source dates and sample sizes for reported measurements."
}
}
+ },
+ "network.home-screen": {
+ "version": "1.0.0",
+ "owner": "network",
+ "status": "active",
+ "schema": {
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "https://openvibe.network/contracts/network/home-screen.v1.json",
+ "title": "NetworkHomeScreen",
+ "description": "network.home-screen@1: a person's ordered Home icons and folders. GET and PUT /api/v1/me/home-screen use a Bearer user session.",
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "home",
+ "folders",
+ "updated_at"
+ ],
+ "properties": {
+ "home": {
+ "type": "array",
+ "maxItems": 40,
+ "uniqueItems": true,
+ "items": {
+ "type": "string",
+ "pattern": "^(?:[a-z0-9-]{1,40}|folder:[a-z0-9-]{1,40}|tools:[a-z0-9-]{1,40})$"
+ }
+ },
+ "folders": {
+ "type": "array",
+ "maxItems": 40,
+ "items": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "id",
+ "name",
+ "apps"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "pattern": "^[a-z0-9-]{1,40}$"
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 60
+ },
+ "apps": {
+ "type": "array",
+ "maxItems": 40,
+ "uniqueItems": true,
+ "items": {
+ "type": "string",
+ "pattern": "^(?:[a-z0-9-]{1,40}|tools:[a-z0-9-]{1,40})$"
+ }
+ }
+ }
+ }
+ },
+ "updated_at": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "format": "date-time"
+ }
+ }
+ }
+ },
+ "network.menu-feeds@2": {
+ "version": "2.0.0",
+ "owner": "network",
+ "status": "active",
+ "schema": {
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "https://openvibe.network/contracts/network/menu-feeds.v2.json",
+ "title": "NetworkMenuFeedsV2",
+ "description": "network.menu-feeds@2: every offered feed card is on unless its id is in off. order lists cards the person has positioned; other cards follow in their default order. GET and PUT /api/v1/me/menu-feeds.",
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "order",
+ "off",
+ "updated_at"
+ ],
+ "properties": {
+ "order": {
+ "type": "array",
+ "maxItems": 100,
+ "uniqueItems": true,
+ "items": {
+ "type": "string",
+ "pattern": "^[a-z0-9-]{1,30}:[a-z0-9-]{1,30}$"
+ }
+ },
+ "off": {
+ "type": "array",
+ "maxItems": 100,
+ "uniqueItems": true,
+ "items": {
+ "type": "string",
+ "pattern": "^[a-z0-9-]{1,30}:[a-z0-9-]{1,30}$"
+ }
+ },
+ "updated_at": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "format": "date-time"
+ }
+ }
+ }
+ },
+ "network.frame-today": {
+ "version": "1.0.0",
+ "owner": "network",
+ "status": "active",
+ "schema": {
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "https://openvibe.network/contracts/network/frame-today.v1.json",
+ "title": "NetworkFrameToday",
+ "description": "network.frame-today@1: public UTC-day totals from Report's stats, with a fourteen-day series. People counts new accounts. A null count means Report does not publish a daily number for that metric.",
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "day",
+ "people_today",
+ "streams_today",
+ "posts_today",
+ "new_videos_today",
+ "series",
+ "updated_at"
+ ],
+ "properties": {
+ "day": {
+ "type": "string",
+ "format": "date"
+ },
+ "people_today": {
+ "type": [
+ "integer",
+ "null"
+ ],
+ "minimum": 0,
+ "description": "New accounts today, from Report's accounts.daily series."
+ },
+ "streams_today": {
+ "type": [
+ "integer",
+ "null"
+ ],
+ "minimum": 0
+ },
+ "posts_today": {
+ "type": [
+ "integer",
+ "null"
+ ],
+ "minimum": 0
+ },
+ "new_videos_today": {
+ "type": [
+ "integer",
+ "null"
+ ],
+ "minimum": 0
+ },
+ "series": {
+ "type": "array",
+ "minItems": 14,
+ "maxItems": 14,
+ "items": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "day",
+ "people",
+ "streams",
+ "posts",
+ "new_videos"
+ ],
+ "properties": {
+ "day": {
+ "type": "string",
+ "format": "date"
+ },
+ "people": {
+ "type": [
+ "integer",
+ "null"
+ ],
+ "minimum": 0
+ },
+ "streams": {
+ "type": [
+ "integer",
+ "null"
+ ],
+ "minimum": 0
+ },
+ "posts": {
+ "type": [
+ "integer",
+ "null"
+ ],
+ "minimum": 0
+ },
+ "new_videos": {
+ "type": [
+ "integer",
+ "null"
+ ],
+ "minimum": 0
+ }
+ }
+ }
+ },
+ "updated_at": {
+ "type": "string",
+ "format": "date-time"
+ }
+ }
+ }
+ },
+ "community.status": {
+ "version": "1.0.0",
+ "owner": "community",
+ "status": "active",
+ "schema": {
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "https://openvibe.network/contracts/community/status.v1.json",
+ "title": "CommunityStatus",
+ "description": "community.status@1: a public status written by POST /api/v1/me/status. At most one https link may appear across text and link; Community checks this after validating the schema. The opening post id supports the existing post reaction and reply routes.",
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "text"
+ ],
+ "properties": {
+ "text": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 500,
+ "pattern": "\\S"
+ },
+ "link": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "maxLength": 2000,
+ "pattern": "^https://"
+ },
+ "id": {
+ "type": "integer"
+ },
+ "post_id": {
+ "type": "integer"
+ },
+ "url": {
+ "type": "string",
+ "pattern": "^https://"
+ },
+ "created_at": {
+ "type": "string",
+ "format": "date-time"
+ }
+ }
+ }
+ },
+ "community.pulse-contribute-request": {
+ "version": "1.0.0",
+ "owner": "community",
+ "status": "active",
+ "schema": {
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "https://openvibe.network/contracts/community/pulse-contribute-request.v1.json",
+ "title": "CommunityPulseContributeRequest",
+ "description": "An app with a person's community.pulse.contribute grant posts an item about that person. The app token supplies the person and app identity; the body cannot choose either.",
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "id",
+ "text",
+ "url"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "pattern": "^[A-Za-z0-9_-]{1,80}$"
+ },
+ "text": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 300,
+ "pattern": "\\S"
+ },
+ "url": {
+ "type": "string",
+ "maxLength": 2000,
+ "pattern": "^https://"
+ },
+ "picture_url": {
+ "type": "string",
+ "maxLength": 2000,
+ "pattern": "^https://openvibe\\.media/(t|o)/"
+ }
+ }
+ }
}
}
}
}
}
}
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Actor API",
"title": "OpenVibe.Actor API",
- "version": "0.351.0",
- "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.351.0): each operation lists the capabilities it performs; a token for 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.352.0",
+ "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.352.0): each operation lists the capabilities it performs; a token for 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.AI API",
"title": "OpenVibe.AI API",
- "version": "0.351.0",
- "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.351.0): each operation lists the capabilities it performs; a token for 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.352.0",
+ "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.352.0): each operation lists the capabilities it performs; a token for 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.Bench API",
"title": "OpenVibe.Bench API",
- "version": "0.351.0",
- "description": "Routes of OpenVibe.Bench as the OpenVibe contracts describe them (openvibe-contracts 0.351.0): each operation lists the capabilities it performs; a token for 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.352.0",
+ "description": "Routes of OpenVibe.Bench as the OpenVibe contracts describe them (openvibe-contracts 0.352.0): each operation lists the capabilities it performs; a token for 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.351.0",
- "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.351.0): each operation lists the capabilities it performs; a token for 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.352.0",
+ "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.352.0): each operation lists the capabilities it performs; a token for 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.351.0",
- "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.351.0): each operation lists the capabilities it performs; a token for 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.352.0",
+ "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.352.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Bot API",
"title": "OpenVibe.Bot API",
- "version": "0.351.0",
- "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.351.0): each operation lists the capabilities it performs; a token for 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.352.0",
+ "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.352.0): each operation lists the capabilities it performs; a token for 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.351.0",
- "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.351.0): each operation lists the capabilities it performs; a token for 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.352.0",
+ "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.352.0): each operation lists the capabilities it performs; a token for 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.351.0",
- "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.351.0): each operation lists the capabilities it performs; a token for 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.352.0",
+ "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.352.0): each operation lists the capabilities it performs; a token for 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.351.0",
- "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.351.0): each operation lists the capabilities it performs; a token for 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.352.0",
+ "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.352.0): each operation lists the capabilities it performs; a token for 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"
@@ -1067,19 +1067,26 @@
@@ -1067,19 +1067,26 @@
"/api/v1/pulse/items": {
"/api/v1/pulse/items": {
"post": {
"post": {
"operationId": "post_api_v1_pulse_items",
"operationId": "post_api_v1_pulse_items",
- "summary": "Publish public activity of the calling service's own entities to Pulse (EntityRef + title + url + origin user|ai|system + occurred_at), or retract it.",
- "description": "**community.pulse.write** (first-party): Publish public activity of the calling service's own entities to Pulse (EntityRef + title + url + origin user|ai|system + occurred_at), or retract it. Only visibility public is accepted; the ref's service must be the caller's. Provenance is kept: the first record's origin, actor (X-OV-Subject, never for ai/system) and time stand.",
+ "summary": "A person grants an app permission to publish and retract public text and https links in Pulse about that person.",
+ "description": "**community.pulse.contribute** (public): A person grants an app permission to publish and retract public text and https links in Pulse about that person. Community labels each item via the app and limits each app separately; pictures must use Media's public HTTPS thumbnail or object paths.\n\n**community.pulse.write** (first-party): Publish public activity of the calling service's own entities to Pulse (EntityRef + title + url + origin user|ai|system + occurred_at), or retract it. Only visibility public is accepted; the ref's service must be the caller's. Provenance is kept: the first record's origin, actor (X-OV-Subject, never for ai/system) and time stand.",
"tags": [
"tags": [
"community.pulse"
"community.pulse"
],
],
"x-openvibe-capabilities": [
"x-openvibe-capabilities": [
+ "community.pulse.contribute",
"community.pulse.write"
"community.pulse.write"
],
],
"x-openvibe-visibility": [
"x-openvibe-visibility": [
+ "public",
"first-party"
"first-party"
],
],
"x-openvibe-quota-class": "community-write",
"x-openvibe-quota-class": "community-write",
"security": [
"security": [
+ {
+ "openvibeToken": [
+ "community.pulse.contribute"
+ ]
+ },
{
{
"openvibeToken": [
"openvibeToken": [
"community.pulse.write"
"community.pulse.write"
@@ -1091,7 +1098,14 @@
@@ -1091,7 +1098,14 @@
"content": {
"content": {
"application/json": {
"application/json": {
"schema": {
"schema": {
- "$ref": "#/components/schemas/community.pulse-write-request.v1"
+ "anyOf": [
+ {
+ "$ref": "#/components/schemas/community.pulse-contribute-request.v1"
+ },
+ {
+ "$ref": "#/components/schemas/community.pulse-write-request.v1"
+ }
+ ]
}
}
}
}
}
}
@@ -1123,19 +1137,26 @@
@@ -1123,19 +1137,26 @@
"/api/v1/pulse/items/{service}/{type}/{id}": {
"/api/v1/pulse/items/{service}/{type}/{id}": {
"delete": {
"delete": {
"operationId": "delete_api_v1_pulse_items_service_type_id",
"operationId": "delete_api_v1_pulse_items_service_type_id",
- "summary": "Publish public activity of the calling service's own entities to Pulse (EntityRef + title + url + origin user|ai|system + occurred_at), or retract it.",
- "description": "**community.pulse.write** (first-party): Publish public activity of the calling service's own entities to Pulse (EntityRef + title + url + origin user|ai|system + occurred_at), or retract it. Only visibility public is accepted; the ref's service must be the caller's. Provenance is kept: the first record's origin, actor (X-OV-Subject, never for ai/system) and time stand.",
+ "summary": "A person grants an app permission to publish and retract public text and https links in Pulse about that person.",
+ "description": "**community.pulse.contribute** (public): A person grants an app permission to publish and retract public text and https links in Pulse about that person. Community labels each item via the app and limits each app separately; pictures must use Media's public HTTPS thumbnail or object paths.\n\n**community.pulse.write** (first-party): Publish public activity of the calling service's own entities to Pulse (EntityRef + title + url + origin user|ai|system + occurred_at), or retract it. Only visibility public is accepted; the ref's service must be the caller's. Provenance is kept: the first record's origin, actor (X-OV-Subject, never for ai/system) and time stand.",
"tags": [
"tags": [
"community.pulse"
"community.pulse"
],
],
"x-openvibe-capabilities": [
"x-openvibe-capabilities": [
+ "community.pulse.contribute",
"community.pulse.write"
"community.pulse.write"
],
],
"x-openvibe-visibility": [
"x-openvibe-visibility": [
+ "public",
"first-party"
"first-party"
],
],
"x-openvibe-quota-class": "community-write",
"x-openvibe-quota-class": "community-write",
"security": [
"security": [
+ {
+ "openvibeToken": [
+ "community.pulse.contribute"
+ ]
+ },
{
{
"openvibeToken": [
"openvibeToken": [
"community.pulse.write"
"community.pulse.write"
@@ -1143,7 +1164,14 @@
@@ -1143,7 +1164,14 @@
}
}
],
],
"x-openvibe-input": {
"x-openvibe-input": {
- "$ref": "#/components/schemas/community.pulse-write-request.v1"
+ "anyOf": [
+ {
+ "$ref": "#/components/schemas/community.pulse-contribute-request.v1"
+ },
+ {
+ "$ref": "#/components/schemas/community.pulse-write-request.v1"
+ }
+ ]
},
},
"parameters": [
"parameters": [
{
{
@@ -1169,6 +1197,37 @@
@@ -1169,6 +1197,37 @@
"schema": {
"schema": {
"type": "string"
"type": "string"
}
}
+ },
+ {
+ "name": "text",
+ "in": "query",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 300,
+ "pattern": "\\S"
+ }
+ },
+ {
+ "name": "url",
+ "in": "query",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "maxLength": 2000,
+ "pattern": "^https://"
+ }
+ },
+ {
+ "name": "picture_url",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string",
+ "maxLength": 2000,
+ "pattern": "^https://openvibe\\.media/(t|o)/"
+ }
}
}
],
],
"responses": {
"responses": {
@@ -4963,6 +5022,39 @@
@@ -4963,6 +5022,39 @@
}
}
]
]
},
},
+ "community.pulse-contribute-request.v1": {
+ "title": "CommunityPulseContributeRequest",
+ "description": "An app with a person's community.pulse.contribute grant posts an item about that person. The app token supplies the person and app identity; the body cannot choose either.",
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "id",
+ "text",
+ "url"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "pattern": "^[A-Za-z0-9_-]{1,80}$"
+ },
+ "text": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 300,
+ "pattern": "\\S"
+ },
+ "url": {
+ "type": "string",
+ "maxLength": 2000,
+ "pattern": "^https://"
+ },
+ "picture_url": {
+ "type": "string",
+ "maxLength": 2000,
+ "pattern": "^https://openvibe\\.media/(t|o)/"
+ }
+ }
+ },
"community.pulse-item.v1": {
"community.pulse-item.v1": {
"title": "CommunityPulseItem",
"title": "CommunityPulseItem",
"description": "community.pulse-item@1: one item of the network's public activity on OpenVibe.Community (server/pulse/service.js shape), with provenance: its source entity, title, url, origin (user, ai or system), the AI or System label, the actor (a person for user items, never for AI or system ones) and when it happened.",
"description": "community.pulse-item@1: one item of the network's public activity on OpenVibe.Community (server/pulse/service.js shape), with provenance: its source entity, title, url, origin (user, ai or system), the AI or System label, the actor (a person for user items, never for AI or system ones) and when it happened.",
@@ -5021,6 +5113,16 @@
@@ -5021,6 +5113,16 @@
null
null
]
]
},
},
+ "via": {
+ "type": "string",
+ "maxLength": 120,
+ "description": "A third-party contribution is shown as via <app>."
+ },
+ "picture_url": {
+ "type": "string",
+ "maxLength": 2000,
+ "pattern": "^https://openvibe\\.media/(t|o)/"
+ },
"actor": {
"actor": {
"type": [
"type": [
"object",
"object",
@@ -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 Connect API",
"title": "OpenVibe Connect API",
- "version": "0.351.0",
- "description": "Routes of OpenVibe Connect as the OpenVibe contracts describe them (openvibe-contracts 0.351.0): each operation lists the capabilities it performs; a token for 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.352.0",
+ "description": "Routes of OpenVibe Connect as the OpenVibe contracts describe them (openvibe-contracts 0.352.0): each operation lists the capabilities it performs; a token for 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.351.0",
- "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.351.0): each operation lists the capabilities it performs; a token for 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.352.0",
+ "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.352.0): each operation lists the capabilities it performs; a token for 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.351.0",
- "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.351.0): each operation lists the capabilities it performs; a token for 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.352.0",
+ "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.352.0): each operation lists the capabilities it performs; a token for 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.Design API",
"title": "OpenVibe.Design API",
- "version": "0.351.0",
- "description": "Routes of OpenVibe.Design as the OpenVibe contracts describe them (openvibe-contracts 0.351.0): each operation lists the capabilities it performs; a token for 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.352.0",
+ "description": "Routes of OpenVibe.Design as the OpenVibe contracts describe them (openvibe-contracts 0.352.0): each operation lists the capabilities it performs; a token for 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.Domains API",
"title": "OpenVibe.Domains API",
- "version": "0.351.0",
- "description": "Routes of OpenVibe.Domains as the OpenVibe contracts describe them (openvibe-contracts 0.351.0): each operation lists the capabilities it performs; a token for 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.352.0",
+ "description": "Routes of OpenVibe.Domains as the OpenVibe contracts describe them (openvibe-contracts 0.352.0): each operation lists the capabilities it performs; a token for 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.351.0",
- "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.351.0): each operation lists the capabilities it performs; a token for 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.352.0",
+ "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.352.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Food API",
"title": "OpenVibe.Food API",
- "version": "0.351.0",
- "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.351.0): each operation lists the capabilities it performs; a token for 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.352.0",
+ "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.352.0): each operation lists the capabilities it performs; a token for 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.351.0",
- "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.351.0): each operation lists the capabilities it performs; a token for 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.352.0",
+ "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.352.0): each operation lists the capabilities it performs; a token for 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.351.0",
- "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.351.0): each operation lists the capabilities it performs; a token for 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.352.0",
+ "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.352.0): each operation lists the capabilities it performs; a token for 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"
@@ -62,7 +62,7 @@
@@ -62,7 +62,7 @@
"name": "OpenVibe.Community",
"name": "OpenVibe.Community",
"origin": "https://openvibe.community",
"origin": "https://openvibe.community",
"operations": 40,
"operations": 40,
- "capabilities": 13
+ "capabilities": 14
},
},
{
{
"service": "connect",
"service": "connect",
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Inventory API",
"title": "OpenVibe.Inventory API",
- "version": "0.351.0",
- "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.351.0): each operation lists the capabilities it performs; a token for 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.352.0",
+ "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.352.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Live API",
"title": "OpenVibe.Live API",
- "version": "0.351.0",
- "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.351.0): each operation lists the capabilities it performs; a token for 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.352.0",
+ "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.352.0): each operation lists the capabilities it performs; a token for 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.Mail API",
"title": "OpenVibe.Mail API",
- "version": "0.351.0",
- "description": "Routes of OpenVibe.Mail as the OpenVibe contracts describe them (openvibe-contracts 0.351.0): each operation lists the capabilities it performs; a token for 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.352.0",
+ "description": "Routes of OpenVibe.Mail as the OpenVibe contracts describe them (openvibe-contracts 0.352.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.MediaHub API",
"title": "OpenVibe.MediaHub API",
- "version": "0.351.0",
- "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.351.0): each operation lists the capabilities it performs; a token for 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.352.0",
+ "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.352.0): each operation lists the capabilities it performs; a token for 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.351.0",
- "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.351.0): each operation lists the capabilities it performs; a token for 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.352.0",
+ "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.352.0): each operation lists the capabilities it performs; a token for 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.351.0",
- "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.351.0): each operation lists the capabilities it performs; a token for 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.352.0",
+ "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.352.0): each operation lists the capabilities it performs; a token for 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.News API",
"title": "OpenVibe.News API",
- "version": "0.351.0",
- "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.351.0): each operation lists the capabilities it performs; a token for 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.352.0",
+ "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.352.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenRestream API",
"title": "OpenRestream API",
- "version": "0.351.0",
- "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.351.0): each operation lists the capabilities it performs; a token for 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.352.0",
+ "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.352.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Play API",
"title": "OpenVibe.Play API",
- "version": "0.351.0",
- "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.351.0): each operation lists the capabilities it performs; a token for 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.352.0",
+ "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.352.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Quest API",
"title": "OpenVibe.Quest API",
- "version": "0.351.0",
- "description": "Routes of OpenVibe.Quest as the OpenVibe contracts describe them (openvibe-contracts 0.351.0): each operation lists the capabilities it performs; a token for 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.352.0",
+ "description": "Routes of OpenVibe.Quest as the OpenVibe contracts describe them (openvibe-contracts 0.352.0): each operation lists the capabilities it performs; a token for 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.Report API",
"title": "OpenVibe.Report API",
- "version": "0.351.0",
- "description": "Routes of OpenVibe.Report as the OpenVibe contracts describe them (openvibe-contracts 0.351.0): each operation lists the capabilities it performs; a token for 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.352.0",
+ "description": "Routes of OpenVibe.Report as the OpenVibe contracts describe them (openvibe-contracts 0.352.0): each operation lists the capabilities it performs; a token for 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.351.0",
- "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.351.0): each operation lists the capabilities it performs; a token for 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.352.0",
+ "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.352.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Run API",
"title": "OpenVibe.Run API",
- "version": "0.351.0",
- "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.351.0): each operation lists the capabilities it performs; a token for 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.352.0",
+ "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.352.0): each operation lists the capabilities it performs; a token for 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.351.0",
- "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.351.0): each operation lists the capabilities it performs; a token for 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.352.0",
+ "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.352.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Services API",
"title": "OpenVibe.Services API",
- "version": "0.351.0",
- "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.351.0): each operation lists the capabilities it performs; a token for 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.352.0",
+ "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.352.0): each operation lists the capabilities it performs; a token for 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.351.0",
- "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.351.0): each operation lists the capabilities it performs; a token for 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.352.0",
+ "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.352.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Space API",
"title": "OpenVibe.Space API",
- "version": "0.351.0",
- "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.351.0): each operation lists the capabilities it performs; a token for 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.352.0",
+ "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.352.0): each operation lists the capabilities it performs; a token for 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.351.0",
- "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.351.0): each operation lists the capabilities it performs; a token for 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.352.0",
+ "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.352.0): each operation lists the capabilities it performs; a token for 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.Today API",
"title": "OpenVibe.Today API",
- "version": "0.351.0",
- "description": "Routes of OpenVibe.Today as the OpenVibe contracts describe them (openvibe-contracts 0.351.0): each operation lists the capabilities it performs; a token for 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.352.0",
+ "description": "Routes of OpenVibe.Today as the OpenVibe contracts describe them (openvibe-contracts 0.352.0): each operation lists the capabilities it performs; a token for 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.351.0",
- "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.351.0): each operation lists the capabilities it performs; a token for 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.352.0",
+ "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.352.0): each operation lists the capabilities it performs; a token for 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.351.0",
- "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.351.0): each operation lists the capabilities it performs; a token for 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.352.0",
+ "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.352.0): each operation lists the capabilities it performs; a token for 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.351.0",
- "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.351.0): each operation lists the capabilities it performs; a token for 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.352.0",
+ "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.352.0): each operation lists the capabilities it performs; a token for 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.Vision API",
"title": "OpenVibe.Vision API",
- "version": "0.351.0",
- "description": "Routes of OpenVibe.Vision as the OpenVibe contracts describe them (openvibe-contracts 0.351.0): each operation lists the capabilities it performs; a token for 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.352.0",
+ "description": "Routes of OpenVibe.Vision as the OpenVibe contracts describe them (openvibe-contracts 0.352.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Watch API",
"title": "OpenVibe.Watch API",
- "version": "0.351.0",
- "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.351.0): each operation lists the capabilities it performs; a token for 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.352.0",
+ "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.352.0): each operation lists the capabilities it performs; a token for 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.351.0",
- "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.351.0): each operation lists the capabilities it performs; a token for 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.352.0",
+ "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.352.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Work API",
"title": "OpenVibe.Work API",
- "version": "0.351.0",
- "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.351.0): each operation lists the capabilities it performs; a token for 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.352.0",
+ "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.352.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Zone API",
"title": "OpenVibe.Zone API",
- "version": "0.351.0",
- "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.351.0): each operation lists the capabilities it performs; a token for 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.352.0",
+ "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.352.0): each operation lists the capabilities it performs; a token for 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"
@@ -95,6 +95,10 @@ export type ServiceTokenClaims = {
@@ -95,6 +95,10 @@ export type ServiceTokenClaims = {
* The person who authorized an app through the authorization-code flow, or the owner an agent acts for (always present on agent tokens). Also present on a node token that asks for an audience where the machine acts for its owner (Agent Streams S1: openvibe.live and live.agent_stream.publish); absent on every other client_credentials token.
* The person who authorized an app through the authorization-code flow, or the owner an agent acts for (always present on agent tokens). Also present on a node token that asks for an audience where the machine acts for its owner (Agent Streams S1: openvibe.live and live.agent_stream.publish); absent on every other client_credentials token.
*/
*/
on_behalf_of?: string;
on_behalf_of?: string;
+ /**
+ * Signed display name of a developer app, for attribution such as via <app>.
+ */
+ app_name?: string;
/**
/**
* App tokens from the authorization-code flow (0.310.0): the purposes the person (on_behalf_of) granted this app at sign-in and that are still active when the token is issued, the claim network.consent-claim@1 defines. Present when the sign-in asked for consent:<purpose> scopes, [] when none is granted, absent otherwise.
* App tokens from the authorization-code flow (0.310.0): the purposes the person (on_behalf_of) granted this app at sign-in and that are still active when the token is issued, the claim network.consent-claim@1 defines. Present when the sign-in asked for consent:<purpose> scopes, [] when none is granted, absent otherwise.
*
*
@@ -208032,6 +208036,11 @@ export interface CommunityPulseItem {
@@ -208032,6 +208036,11 @@ export interface CommunityPulseItem {
url: string;
url: string;
origin: "user" | "ai" | "system";
origin: "user" | "ai" | "system";
label: "AI" | "System" | null;
label: "AI" | "System" | null;
+ /**
+ * A third-party contribution is shown as via <app>.
+ */
+ via?: string;
+ picture_url?: string;
actor: {
actor: {
subject?: string | null;
subject?: string | null;
username?: string | null;
username?: string | null;
@@ -317411,3 +317420,186 @@ export interface ReportAiPicks {
@@ -317411,3 +317420,186 @@ export interface ReportAiPicks {
}[];
}[];
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
}
}
+
+/** [email protected] (owner: network) */
+/**
+ * network.home-screen@1: a person's ordered Home icons and folders. GET and PUT /api/v1/me/home-screen use a Bearer user session.
+ */
+export interface NetworkHomeScreen {
+ /**
+ * @maxItems 40
+ */
+ home: string[];
+ /**
+ * @maxItems 40
+ */
+ folders: {
+ id: string;
+ name: string;
+ /**
+ * @maxItems 40
+ */
+ apps: string[];
+ }[];
+ updated_at: string | null;
+}
+
+/** [email protected] (owner: network) */
+/**
+ * network.menu-feeds@2: every offered feed card is on unless its id is in off. order lists cards the person has positioned; other cards follow in their default order. GET and PUT /api/v1/me/menu-feeds.
+ */
+export interface NetworkMenuFeedsV2 {
+ /**
+ * @maxItems 100
+ */
+ order: string[];
+ /**
+ * @maxItems 100
+ */
+ off: string[];
+ updated_at: string | null;
+}
+
+/** [email protected] (owner: network) */
+/**
+ * network.frame-today@1: public UTC-day totals from Report's stats, with a fourteen-day series. People counts new accounts. A null count means Report does not publish a daily number for that metric.
+ */
+export interface NetworkFrameToday {
+ day: string;
+ /**
+ * New accounts today, from Report's accounts.daily series.
+ */
+ people_today: number | null;
+ streams_today: number | null;
+ posts_today: number | null;
+ new_videos_today: number | null;
+ /**
+ * @minItems 14
+ * @maxItems 14
+ */
+ series: [
+ {
+ day: string;
+ people: number | null;
+ streams: number | null;
+ posts: number | null;
+ new_videos: number | null;
+ },
+ {
+ day: string;
+ people: number | null;
+ streams: number | null;
+ posts: number | null;
+ new_videos: number | null;
+ },
+ {
+ day: string;
+ people: number | null;
+ streams: number | null;
+ posts: number | null;
+ new_videos: number | null;
+ },
+ {
+ day: string;
+ people: number | null;
+ streams: number | null;
+ posts: number | null;
+ new_videos: number | null;
+ },
+ {
+ day: string;
+ people: number | null;
+ streams: number | null;
+ posts: number | null;
+ new_videos: number | null;
+ },
+ {
+ day: string;
+ people: number | null;
+ streams: number | null;
+ posts: number | null;
+ new_videos: number | null;
+ },
+ {
+ day: string;
+ people: number | null;
+ streams: number | null;
+ posts: number | null;
+ new_videos: number | null;
+ },
+ {
+ day: string;
+ people: number | null;
+ streams: number | null;
+ posts: number | null;
+ new_videos: number | null;
+ },
+ {
+ day: string;
+ people: number | null;
+ streams: number | null;
+ posts: number | null;
+ new_videos: number | null;
+ },
+ {
+ day: string;
+ people: number | null;
+ streams: number | null;
+ posts: number | null;
+ new_videos: number | null;
+ },
+ {
+ day: string;
+ people: number | null;
+ streams: number | null;
+ posts: number | null;
+ new_videos: number | null;
+ },
+ {
+ day: string;
+ people: number | null;
+ streams: number | null;
+ posts: number | null;
+ new_videos: number | null;
+ },
+ {
+ day: string;
+ people: number | null;
+ streams: number | null;
+ posts: number | null;
+ new_videos: number | null;
+ },
+ {
+ day: string;
+ people: number | null;
+ streams: number | null;
+ posts: number | null;
+ new_videos: number | null;
+ }
+ ];
+ updated_at: string;
+}
+
+/** [email protected] (owner: community) */
+/**
+ * community.status@1: a public status written by POST /api/v1/me/status. At most one https link may appear across text and link; Community checks this after validating the schema. The opening post id supports the existing post reaction and reply routes.
+ */
+export interface CommunityStatus {
+ text: string;
+ link?: string | null;
+ id?: number;
+ post_id?: number;
+ url?: string;
+ created_at?: string;
+}
+
+/** [email protected] (owner: community) */
+/**
+ * An app with a person's community.pulse.contribute grant posts an item about that person. The app token supplies the person and app identity; the body cannot choose either.
+ */
+export interface CommunityPulseContributeRequest {
+ id: string;
+ text: string;
+ url: string;
+ picture_url?: string;
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,16 @@
@@ -0,0 +1,16 @@
+{
+ "id": "community.pulse.contribute",
+ "version": "1.0",
+ "owner": "community",
+ "status": "active",
+ "visibility": "public",
+ "sensitive": true,
+ "description": "A person grants an app permission to publish and retract public text and https links in Pulse about that person. Community labels each item via the app and limits each app separately; pictures must use Media's public HTTPS thumbnail or object paths.",
+ "inputSchema": "community.pulse-contribute-request@1",
+ "outputSchema": "community.pulse-write-result@1",
+ "permissions": ["community:write"],
+ "resourceConstraints": ["owner"],
+ "quotaClass": "community-write",
+ "events": ["community.pulse.item_recorded"],
+ "implementedBy": ["POST /api/v1/pulse/items", "DELETE /api/v1/pulse/items/:service/:type/:id"]
+}
@@ -20,6 +20,7 @@
@@ -20,6 +20,7 @@
"community.comment.write",
"community.comment.write",
"community.comment.moderate",
"community.comment.moderate",
"community.pulse.write",
"community.pulse.write",
+ "community.pulse.contribute",
"community.space.read",
"community.space.read",
"community.space.manage",
"community.space.manage",
"community.thread.read",
"community.thread.read",
@@ -1,12 +1,12 @@
@@ -1,12 +1,12 @@
{
{
"name": "openvibe-contracts",
"name": "openvibe-contracts",
- "version": "0.351.0",
+ "version": "0.352.0",
"lockfileVersion": 3,
"lockfileVersion": 3,
"requires": true,
"requires": true,
"packages": {
"packages": {
"": {
"": {
"name": "openvibe-contracts",
"name": "openvibe-contracts",
- "version": "0.351.0",
+ "version": "0.352.0",
"license": "AGPL-3.0-only",
"license": "AGPL-3.0-only",
"dependencies": {
"dependencies": {
"ajv": "^8.17.1",
"ajv": "^8.17.1",
@@ -1,6 +1,6 @@
@@ -1,6 +1,6 @@
{
{
"name": "openvibe-contracts",
"name": "openvibe-contracts",
- "version": "0.351.0",
+ "version": "0.352.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",
@@ -119,12 +119,16 @@ for (const c of [...new Map(contracts.catalog.map((e) => [e.id, e])).values()])
@@ -119,12 +119,16 @@ for (const c of [...new Map(contracts.catalog.map((e) => [e.id, e])).values()])
ok(list.length > 0, `${c.id} has ${kind} fixtures`);
ok(list.length > 0, `${c.id} has ${kind} fixtures`);
for (const f of list) {
for (const f of list) {
const value = JSON.parse(fs.readFileSync(path.join(dir, f), 'utf8'));
const value = JSON.parse(fs.readFileSync(path.join(dir, f), 'utf8'));
- const ref = majorRef(c.id, value);
+ const ref = c.id === 'network.menu-feeds' ? 'network.menu-feeds@1' : majorRef(c.id, value);
const r = FULL_CHECK[c.id] ? FULL_CHECK[c.id](value, ref) : contracts.validate(ref, value);
const r = FULL_CHECK[c.id] ? FULL_CHECK[c.id](value, ref) : contracts.validate(ref, value);
ok(r.valid === (kind === 'valid'), `${c.id} ${kind}/${f}: ${r.valid ? 'passed' : JSON.stringify(r.errors)}`);
ok(r.valid === (kind === 'valid'), `${c.id} ${kind}/${f}: ${r.valid ? 'passed' : JSON.stringify(r.errors)}`);
}
}
}
}
}
}
+ok(contracts.validate('network.menu-feeds@2', { order: ['today:today'], off: [], updated_at: null }).valid,
+ 'menu-feeds v2 keeps an ordered default-on choice');
+ok(!contracts.validate('network.menu-feeds@2', { order: ['today:today', 'today:today'], off: [], updated_at: null }).valid,
+ 'menu-feeds v2 refuses duplicate order ids');
assert.throws(() => contracts.resolve('identity.subject-ref@2'), /not @2/);
assert.throws(() => contracts.resolve('identity.subject-ref@2'), /not @2/);
ok(contracts.resolve('ai.credential-put@1').schema === 'ai/credential-put.v1.json' && contracts.resolve('ai.credential-put@2').schema === 'ai/credential-put.v2.json'
ok(contracts.resolve('ai.credential-put@1').schema === 'ai/credential-put.v1.json' && contracts.resolve('ai.credential-put@2').schema === 'ai/credential-put.v2.json'
&& contracts.resolve('ai.credential-put').version === '2.0.0', 'a contract with two majors resolves by id (newest) or by major');
&& contracts.resolve('ai.credential-put').version === '2.0.0', 'a contract with two majors resolves by id (newest) or by major');