openvibers/openvibe.contracts Commits

Add M1 home, feed, and status contracts (#367)

OP OpenVibers committed 4 days ago · da68a09213 · 72 files, +1081 −107

* Add M1 home and feed contracts and contribution grant

* 0.352.0: the menu's home screen and wall contracts (M1), merged with main

Merges main (0.351.0, Report's AI contracts) into the M1 contracts: the catalog keeps both sets, generated/ rebuilt,
version 0.352.0.

Changes

ddiff --git a/CHANGELOG.md b/CHANGELOG.md
iindex 8622ed05..63cab582 100644
---- a/CHANGELOG.md
++++ b/CHANGELOG.md
@@@ -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.
ddiff --git a/contracts/catalog.json b/contracts/catalog.json
iindex e8ffe41a..80d3e416 100644
---- a/contracts/catalog.json
++++ b/contracts/catalog.json
@@@ -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"
}
]
}
ddiff --git a/contracts/community/pulse-contribute-request.v1.json b/contracts/community/pulse-contribute-request.v1.json
nnew file mode 100644
iindex 00000000..7177724c
---- /dev/null
++++ b/contracts/community/pulse-contribute-request.v1.json
@@@ -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)/" }
++ }
++}
ddiff --git a/contracts/community/pulse-item.v1.json b/contracts/community/pulse-item.v1.json
iindex f840b182..35ea4def 100644
---- a/contracts/community/pulse-item.v1.json
++++ b/contracts/community/pulse-item.v1.json
@@@ -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",
ddiff --git a/contracts/community/status.v1.json b/contracts/community/status.v1.json
nnew file mode 100644
iindex 00000000..39b0128c
---- /dev/null
++++ b/contracts/community/status.v1.json
@@@ -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" }
++ }
++}
ddiff --git a/contracts/identity/service-token-claims.v1.json b/contracts/identity/service-token-claims.v1.json
iindex 8a7b8f96..bdc64316 100644
---- a/contracts/identity/service-token-claims.v1.json
++++ b/contracts/identity/service-token-claims.v1.json
@@@ -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,
ddiff --git a/contracts/network/frame-today.v1.json b/contracts/network/frame-today.v1.json
nnew file mode 100644
iindex 00000000..860b58d7
---- /dev/null
++++ b/contracts/network/frame-today.v1.json
@@@ -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" }
++ }
++}
ddiff --git a/contracts/network/home-screen.v1.json b/contracts/network/home-screen.v1.json
nnew file mode 100644
iindex 00000000..eb6cddc3
---- /dev/null
++++ b/contracts/network/home-screen.v1.json
@@@ -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" }
++ }
++}
ddiff --git a/contracts/network/menu-feeds.v2.json b/contracts/network/menu-feeds.v2.json
nnew file mode 100644
iindex 00000000..9b0079e6
---- /dev/null
++++ b/contracts/network/menu-feeds.v2.json
@@@ -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" }
++ }
++}
ddiff --git a/fixtures/community.pulse-contribute-request/invalid/external-picture.json b/fixtures/community.pulse-contribute-request/invalid/external-picture.json
nnew file mode 100644
iindex 00000000..18a3a42f
---- /dev/null
++++ b/fixtures/community.pulse-contribute-request/invalid/external-picture.json
@@@ -0,0 +1 @@
++{ "id": "demo-2", "text": "A new demo", "url": "https://example.test/demo", "picture_url": "https://example.test/demo.jpg" }
ddiff --git a/fixtures/community.pulse-contribute-request/invalid/http.json b/fixtures/community.pulse-contribute-request/invalid/http.json
nnew file mode 100644
iindex 00000000..a8399242
---- /dev/null
++++ b/fixtures/community.pulse-contribute-request/invalid/http.json
@@@ -0,0 +1,5 @@
++{
++ "id": "launch-1",
++ "text": "A new demo",
++ "url": "http://example.test/demo"
++}
ddiff --git a/fixtures/community.pulse-contribute-request/valid/picture.json b/fixtures/community.pulse-contribute-request/valid/picture.json
nnew file mode 100644
iindex 00000000..12c0fcab
---- /dev/null
++++ b/fixtures/community.pulse-contribute-request/valid/picture.json
@@@ -0,0 +1 @@
++{ "id": "demo-2", "text": "A new demo", "url": "https://example.test/demo", "picture_url": "https://openvibe.media/t/demo.jpg" }
ddiff --git a/fixtures/community.pulse-contribute-request/valid/text.json b/fixtures/community.pulse-contribute-request/valid/text.json
nnew file mode 100644
iindex 00000000..d636dbaf
---- /dev/null
++++ b/fixtures/community.pulse-contribute-request/valid/text.json
@@@ -0,0 +1,5 @@
++{
++ "id": "launch-1",
++ "text": "A new demo",
++ "url": "https://example.test/demo"
++}
ddiff --git a/fixtures/community.status/invalid/too-long.json b/fixtures/community.status/invalid/too-long.json
nnew file mode 100644
iindex 00000000..3ed75786
---- /dev/null
++++ b/fixtures/community.status/invalid/too-long.json
@@@ -0,0 +1,3 @@
++{
++ "text": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
++}
ddiff --git a/fixtures/community.status/valid/text.json b/fixtures/community.status/valid/text.json
nnew file mode 100644
iindex 00000000..5fca5138
---- /dev/null
++++ b/fixtures/community.status/valid/text.json
@@@ -0,0 +1,4 @@
++{
++ "text": "Hello OpenVibe",
++ "link": "https://openvibe.live/"
++}
ddiff --git a/fixtures/network.frame-today/invalid/short-series.json b/fixtures/network.frame-today/invalid/short-series.json
nnew file mode 100644
iindex 00000000..a9ee0d5a
---- /dev/null
++++ b/fixtures/network.frame-today/invalid/short-series.json
@@@ -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"
++}
ddiff --git a/fixtures/network.frame-today/valid/empty.json b/fixtures/network.frame-today/valid/empty.json
nnew file mode 100644
iindex 00000000..00e32af7
---- /dev/null
++++ b/fixtures/network.frame-today/valid/empty.json
@@@ -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"
++}
ddiff --git a/fixtures/network.home-screen/invalid/too-many.json b/fixtures/network.home-screen/invalid/too-many.json
nnew file mode 100644
iindex 00000000..6182977b
---- /dev/null
++++ b/fixtures/network.home-screen/invalid/too-many.json
@@@ -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
++}
ddiff --git a/fixtures/network.home-screen/valid/folder.json b/fixtures/network.home-screen/valid/folder.json
nnew file mode 100644
iindex 00000000..65ca7f28
---- /dev/null
++++ b/fixtures/network.home-screen/valid/folder.json
@@@ -0,0 +1,16 @@
++{
++ "home": [
++ "live",
++ "folder:tools"
++ ],
++ "folders": [
++ {
++ "id": "tools",
++ "name": "Tools",
++ "apps": [
++ "tools:qr"
++ ]
++ }
++ ],
++ "updated_at": "2026-11-09T12:00:00Z"
++}
ddiff --git a/generated/json-schema/bundle.json b/generated/json-schema/bundle.json
iindex d77f9e12..e4c74a12 100644
---- a/generated/json-schema/bundle.json
++++ b/generated/json-schema/bundle.json
@@@ -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)/"
++ }
++ }
++ }
}
}
}
ddiff --git a/generated/openapi/actor.json b/generated/openapi/actor.json
iindex e0989dc8..45f10c66 100644
---- a/generated/openapi/actor.json
++++ b/generated/openapi/actor.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Actor API",
-- "version": "0.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"
ddiff --git a/generated/openapi/ai.json b/generated/openapi/ai.json
iindex 9b1c1514..df21135c 100644
---- a/generated/openapi/ai.json
++++ b/generated/openapi/ai.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.AI API",
-- "version": "0.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"
ddiff --git a/generated/openapi/bench.json b/generated/openapi/bench.json
iindex 0fc504d9..275e80e5 100644
---- a/generated/openapi/bench.json
++++ b/generated/openapi/bench.json
@@@ -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"
ddiff --git a/generated/openapi/billing.json b/generated/openapi/billing.json
iindex 0995fab9..a0446fae 100644
---- a/generated/openapi/billing.json
++++ b/generated/openapi/billing.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Billing API",
-- "version": "0.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"
ddiff --git a/generated/openapi/blog.json b/generated/openapi/blog.json
iindex fe8e8396..af170865 100644
---- a/generated/openapi/blog.json
++++ b/generated/openapi/blog.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Blog API",
-- "version": "0.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"
ddiff --git a/generated/openapi/bot.json b/generated/openapi/bot.json
iindex 35ed1ce4..79210598 100644
---- a/generated/openapi/bot.json
++++ b/generated/openapi/bot.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Bot API",
-- "version": "0.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"
ddiff --git a/generated/openapi/chat.json b/generated/openapi/chat.json
iindex 0e03b15c..cad58906 100644
---- a/generated/openapi/chat.json
++++ b/generated/openapi/chat.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Chat API",
-- "version": "0.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"
ddiff --git a/generated/openapi/codes.json b/generated/openapi/codes.json
iindex 8ca68b46..b587623e 100644
---- a/generated/openapi/codes.json
++++ b/generated/openapi/codes.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Codes API",
-- "version": "0.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"
ddiff --git a/generated/openapi/community.json b/generated/openapi/community.json
iindex 1a735b35..50e0ac31 100644
---- a/generated/openapi/community.json
++++ b/generated/openapi/community.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Community API",
-- "version": "0.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",
ddiff --git a/generated/openapi/connect.json b/generated/openapi/connect.json
iindex f4f4c2f4..95dd3ef4 100644
---- a/generated/openapi/connect.json
++++ b/generated/openapi/connect.json
@@@ -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"
ddiff --git a/generated/openapi/coupons.json b/generated/openapi/coupons.json
iindex 4e62dafe..fbc31d7e 100644
---- a/generated/openapi/coupons.json
++++ b/generated/openapi/coupons.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Coupons API",
-- "version": "0.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"
ddiff --git a/generated/openapi/deals.json b/generated/openapi/deals.json
iindex 6bf38b57..00c615b7 100644
---- a/generated/openapi/deals.json
++++ b/generated/openapi/deals.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Deals API",
-- "version": "0.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"
ddiff --git a/generated/openapi/design.json b/generated/openapi/design.json
iindex 1eb3bd3e..c2c01a1c 100644
---- a/generated/openapi/design.json
++++ b/generated/openapi/design.json
@@@ -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"
ddiff --git a/generated/openapi/domains.json b/generated/openapi/domains.json
iindex b7aeda6a..08116c3a 100644
---- a/generated/openapi/domains.json
++++ b/generated/openapi/domains.json
@@@ -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"
ddiff --git a/generated/openapi/events.json b/generated/openapi/events.json
iindex f4674cc4..86b281e0 100644
---- a/generated/openapi/events.json
++++ b/generated/openapi/events.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Events API",
-- "version": "0.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"
ddiff --git a/generated/openapi/food.json b/generated/openapi/food.json
iindex 0ec2ea15..921f428c 100644
---- a/generated/openapi/food.json
++++ b/generated/openapi/food.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Food API",
-- "version": "0.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"
ddiff --git a/generated/openapi/games.json b/generated/openapi/games.json
iindex 6b40b45d..817d85f8 100644
---- a/generated/openapi/games.json
++++ b/generated/openapi/games.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Games API",
-- "version": "0.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"
ddiff --git a/generated/openapi/host.json b/generated/openapi/host.json
iindex e09c20b7..2b54701e 100644
---- a/generated/openapi/host.json
++++ b/generated/openapi/host.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Host API",
-- "version": "0.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"
ddiff --git a/generated/openapi/index.json b/generated/openapi/index.json
iindex 16f69822..4669ecac 100644
---- a/generated/openapi/index.json
++++ b/generated/openapi/index.json
@@@ -62,7 +62,7 @@
"name": "OpenVibe.Community",
"origin": "https://openvibe.community",
"operations": 40,
-- "capabilities": 13
++ "capabilities": 14
},
{
"service": "connect",
ddiff --git a/generated/openapi/inventory.json b/generated/openapi/inventory.json
iindex 5e8eb45c..5ba50ddd 100644
---- a/generated/openapi/inventory.json
++++ b/generated/openapi/inventory.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Inventory API",
-- "version": "0.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"
ddiff --git a/generated/openapi/live.json b/generated/openapi/live.json
iindex 692b2cdb..334ee442 100644
---- a/generated/openapi/live.json
++++ b/generated/openapi/live.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Live API",
-- "version": "0.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"
ddiff --git a/generated/openapi/mail.json b/generated/openapi/mail.json
iindex ce3cc838..46e19378 100644
---- a/generated/openapi/mail.json
++++ b/generated/openapi/mail.json
@@@ -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"
ddiff --git a/generated/openapi/media-hub.json b/generated/openapi/media-hub.json
iindex 9cfb2bcd..2743e269 100644
---- a/generated/openapi/media-hub.json
++++ b/generated/openapi/media-hub.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.MediaHub API",
-- "version": "0.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"
ddiff --git a/generated/openapi/media.json b/generated/openapi/media.json
iindex d3e65a9b..8978c2f1 100644
---- a/generated/openapi/media.json
++++ b/generated/openapi/media.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Media API",
-- "version": "0.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"
ddiff --git a/generated/openapi/network.json b/generated/openapi/network.json
iindex ca886a70..be3de886 100644
---- a/generated/openapi/network.json
++++ b/generated/openapi/network.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Network API",
-- "version": "0.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"
ddiff --git a/generated/openapi/news.json b/generated/openapi/news.json
iindex 0233cacd..c02fa5b2 100644
---- a/generated/openapi/news.json
++++ b/generated/openapi/news.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.News API",
-- "version": "0.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"
ddiff --git a/generated/openapi/openre.json b/generated/openapi/openre.json
iindex 7388713a..ce1f5f3d 100644
---- a/generated/openapi/openre.json
++++ b/generated/openapi/openre.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenRestream API",
-- "version": "0.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"
ddiff --git a/generated/openapi/play.json b/generated/openapi/play.json
iindex 991258a7..358e9655 100644
---- a/generated/openapi/play.json
++++ b/generated/openapi/play.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Play API",
-- "version": "0.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"
ddiff --git a/generated/openapi/quest.json b/generated/openapi/quest.json
iindex 1d493160..a06d2412 100644
---- a/generated/openapi/quest.json
++++ b/generated/openapi/quest.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Quest API",
-- "version": "0.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"
ddiff --git a/generated/openapi/report.json b/generated/openapi/report.json
iindex a4dc42c9..ebbcf230 100644
---- a/generated/openapi/report.json
++++ b/generated/openapi/report.json
@@@ -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"
ddiff --git a/generated/openapi/reviews.json b/generated/openapi/reviews.json
iindex aba4c3da..a2429cf4 100644
---- a/generated/openapi/reviews.json
++++ b/generated/openapi/reviews.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Reviews API",
-- "version": "0.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"
ddiff --git a/generated/openapi/run.json b/generated/openapi/run.json
iindex 9676f418..e2fe6354 100644
---- a/generated/openapi/run.json
++++ b/generated/openapi/run.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Run API",
-- "version": "0.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"
ddiff --git a/generated/openapi/search.json b/generated/openapi/search.json
iindex 43477783..ee5a0e32 100644
---- a/generated/openapi/search.json
++++ b/generated/openapi/search.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Search API",
-- "version": "0.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"
ddiff --git a/generated/openapi/services.json b/generated/openapi/services.json
iindex 1d14e05a..9a6471b1 100644
---- a/generated/openapi/services.json
++++ b/generated/openapi/services.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Services API",
-- "version": "0.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"
ddiff --git a/generated/openapi/sources.json b/generated/openapi/sources.json
iindex b26efda7..be0cde65 100644
---- a/generated/openapi/sources.json
++++ b/generated/openapi/sources.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Sources API",
-- "version": "0.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"
ddiff --git a/generated/openapi/space.json b/generated/openapi/space.json
iindex 4ed40b4a..7d2bf67f 100644
---- a/generated/openapi/space.json
++++ b/generated/openapi/space.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Space API",
-- "version": "0.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"
ddiff --git a/generated/openapi/tips.json b/generated/openapi/tips.json
iindex 1d403d31..8788952a 100644
---- a/generated/openapi/tips.json
++++ b/generated/openapi/tips.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Tips API",
-- "version": "0.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"
ddiff --git a/generated/openapi/today.json b/generated/openapi/today.json
iindex fad7c067..f3e2b479 100644
---- a/generated/openapi/today.json
++++ b/generated/openapi/today.json
@@@ -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"
ddiff --git a/generated/openapi/tools.json b/generated/openapi/tools.json
iindex 24934cec..220292ad 100644
---- a/generated/openapi/tools.json
++++ b/generated/openapi/tools.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Tools API",
-- "version": "0.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"
ddiff --git a/generated/openapi/trade.json b/generated/openapi/trade.json
iindex 947383b3..af06bf24 100644
---- a/generated/openapi/trade.json
++++ b/generated/openapi/trade.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Trade API",
-- "version": "0.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"
ddiff --git a/generated/openapi/vip.json b/generated/openapi/vip.json
iindex df06c088..c01b3a07 100644
---- a/generated/openapi/vip.json
++++ b/generated/openapi/vip.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.VIP API",
-- "version": "0.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"
ddiff --git a/generated/openapi/vision.json b/generated/openapi/vision.json
iindex 7705f4f2..d07c748f 100644
---- a/generated/openapi/vision.json
++++ b/generated/openapi/vision.json
@@@ -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"
ddiff --git a/generated/openapi/watch.json b/generated/openapi/watch.json
iindex d13b8115..1574aaee 100644
---- a/generated/openapi/watch.json
++++ b/generated/openapi/watch.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Watch API",
-- "version": "0.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"
ddiff --git a/generated/openapi/wiki.json b/generated/openapi/wiki.json
iindex 1fa90ded..58631de5 100644
---- a/generated/openapi/wiki.json
++++ b/generated/openapi/wiki.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Wiki API",
-- "version": "0.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"
ddiff --git a/generated/openapi/work.json b/generated/openapi/work.json
iindex 705d3f86..47767a6c 100644
---- a/generated/openapi/work.json
++++ b/generated/openapi/work.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Work API",
-- "version": "0.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"
ddiff --git a/generated/openapi/zone.json b/generated/openapi/zone.json
iindex 38244b8f..4d723a35 100644
---- a/generated/openapi/zone.json
++++ b/generated/openapi/zone.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Zone API",
-- "version": "0.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"
ddiff --git a/generated/typescript/index.d.ts b/generated/typescript/index.d.ts
iindex 5d346ab3..8ab2dd35 100644
---- a/generated/typescript/index.d.ts
++++ b/generated/typescript/index.d.ts
@@@ -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;
++}
ddiff --git a/manifests/capabilities/community.pulse.contribute.json b/manifests/capabilities/community.pulse.contribute.json
nnew file mode 100644
iindex 00000000..51d46f23
---- /dev/null
++++ b/manifests/capabilities/community.pulse.contribute.json
@@@ -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"]
++}
ddiff --git a/manifests/services/community.json b/manifests/services/community.json
iindex c2463aa1..6d1993a4 100644
---- a/manifests/services/community.json
++++ b/manifests/services/community.json
@@@ -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",
ddiff --git a/package-lock.json b/package-lock.json
iindex 313b8a3f..73269975 100644
---- a/package-lock.json
++++ b/package-lock.json
@@@ -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",
ddiff --git a/package.json b/package.json
iindex 332dfbd6..5ffed993 100644
---- a/package.json
++++ b/package.json
@@@ -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",
ddiff --git a/test/run.js b/test/run.js
iindex 0034e811..efd93b1a 100644
---- a/test/run.js
++++ b/test/run.js
@@@ -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');