openvibers/openvibe.contracts Commits

One feed: feed.item@1, a card for every kind (#466)

OP OpenVibers committed 23 h ago · a628ee6932 · 88 files, +1327 −95

One feed for all of OpenVibe: feed.item@1, the card Network serves and Pulse reads.

Changes

ddiff --git a/CHANGELOG.md b/CHANGELOG.md
iindex c0dd4f6b..d65e8022 100644
---- a/CHANGELOG.md
++++ b/CHANGELOG.md
@@@ -1,5 +1,18 @@
# Changelog
++## 0.415.0 — 2026-11-12
++
++One feed for all of OpenVibe: the card OpenVibe.Network serves from /api/v1/feed and /api/frame/feed, and that
++OpenVibe.Community's Pulse reads instead of its own collector.
++
++- Add `feed.item@1`: each card's stable id, kind (post, pic, clip, video, live, stream, rundown, quest, member,
++ chat, event, wiki, update, work, deal, news, report, poll, game, meme, paste, episode, space, avatar, banner,
++ follow, site), link, source site, actor and subject, first picture, counts (views, likes, comments, watchers,
++ people), live_now, a folded group of the same kind, a report trend, starts_at and follower visibility.
++- Fixtures for every kind, plus invalid ones (unknown kind, missing id, a URL without a scheme, a negative count, a
++ subject that is not a usr_ id, private visibility, a one-item group, a trend without a direction), and the
++ generated JSON Schema and TypeScript. Additive and new: no existing contract changes.
++
## 0.414.0 — 2026-11-12
The whole run (the agent engine, `docs/agents-runs.md`; design `agent-engine.md`). The owner, 11-12, with the menu's
ddiff --git a/contracts/catalog.json b/contracts/catalog.json
iindex a213c964..61e908f3 100644
---- a/contracts/catalog.json
++++ b/contracts/catalog.json
@@@ -11798,6 +11798,15 @@
"compatibility": "backward",
"status": "active",
"adr": "ADR-044"
++ },
++ {
++ "id": "feed.item",
++ "version": "1.0.0",
++ "owner": "network",
++ "schema": "feed/item.v1.json",
++ "visibility": "public",
++ "compatibility": "backward",
++ "status": "active"
}
]
}
ddiff --git a/contracts/feed/item.v1.json b/contracts/feed/item.v1.json
nnew file mode 100644
iindex 00000000..4deee6b9
---- /dev/null
++++ b/contracts/feed/item.v1.json
@@@ -0,0 +1,135 @@
++{
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/feed/item.v1.json",
++ "title": "FeedItem",
++ "description": "feed.item@1: one card of OpenVibe's one feed, served by OpenVibe.Network (GET /api/v1/feed and GET /api/frame/feed; OpenVibe.Community's Pulse reads the same feed). Every card names the service it came from, a stable id, its own link, and only public or follower-visible activity. Kinds: post, pic, clip, video, live, stream, rundown, quest, member, chat, event, wiki, update, work, deal, news, report, poll, game, meme, paste, episode, space, avatar, banner, follow, site.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": ["id", "kind", "url", "title", "text", "at", "site", "site_name", "actor", "subject", "media", "counts"],
++ "properties": {
++ "id": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 500,
++ "description": "Stable across feeds and restarts: f:<service>:<type>:<id> for a source item and t:<site>:<url> for a trending card."
++ },
++ "kind": {
++ "description": "What happened. live is a channel on air now (a go-live that ended is stream); stream is a past broadcast, including a watched-together summary; work is one grouped row of new jobs per hour; report is a number with its trend.",
++ "enum": ["post", "pic", "clip", "video", "live", "stream", "rundown", "quest", "member", "chat", "event", "wiki", "update", "work", "deal", "news", "report", "poll", "game", "meme", "paste", "episode", "space", "avatar", "banner", "follow", "site"]
++ },
++ "url": {
++ "type": "string",
++ "pattern": "^https?://",
++ "maxLength": 2000,
++ "description": "The thing itself: the post, stream, job board, report page or wiki page."
++ },
++ "title": { "type": "string", "maxLength": 300 },
++ "text": {
++ "type": "string",
++ "maxLength": 280,
++ "description": "The source's first 280 characters, on one line; empty when it has none."
++ },
++ "at": {
++ "type": ["string", "null"],
++ "format": "date-time",
++ "description": "When it happened; null only for a trending card."
++ },
++ "starts_at": {
++ "type": "string",
++ "format": "date-time",
++ "description": "When a scheduled event begins; present only on event cards."
++ },
++ "site": {
++ "type": "string",
++ "maxLength": 40,
++ "description": "The source service: live, community, media-hub, pics, games, quest, chat, today, work, deals, news, report, wiki, blog, tools, network…"
++ },
++ "site_name": { "type": "string", "maxLength": 40 },
++ "actor": {
++ "type": ["object", "null"],
++ "description": "Who did it; null for AI, system, aggregate and trending cards.",
++ "required": ["name", "avatar"],
++ "properties": {
++ "name": { "type": ["string", "null"], "maxLength": 80 },
++ "avatar": { "type": ["string", "null"], "maxLength": 2000 }
++ },
++ "additionalProperties": false
++ },
++ "subject": {
++ "type": ["string", "null"],
++ "pattern": "^usr_[0-9A-HJKMNP-TV-Z]{26}$",
++ "description": "The acting person's subject, when one is known; null for AI, system and aggregate cards. The Following filter and For you ranking read it."
++ },
++ "media": {
++ "type": ["object", "null"],
++ "description": "The card's first picture, as a Media thumbnail; null when it has none.",
++ "required": ["thumb", "ratio"],
++ "properties": {
++ "thumb": { "type": "string", "pattern": "^https://", "maxLength": 2000 },
++ "preview": { "type": "string", "pattern": "^https://", "maxLength": 2000 },
++ "ratio": { "type": "number", "exclusiveMinimum": 0 },
++ "length": { "type": "number", "minimum": 0, "description": "Seconds, when the card is a video." }
++ },
++ "additionalProperties": false
++ },
++ "counts": {
++ "type": "object",
++ "description": "The numbers the source knows; each present only when it knows it.",
++ "properties": {
++ "views": { "type": "integer", "minimum": 0 },
++ "likes": { "type": "integer", "minimum": 0 },
++ "comments": { "type": "integer", "minimum": 0 },
++ "watchers": { "type": "integer", "minimum": 0, "description": "People who watched a stream (peak for a past broadcast)." },
++ "people": { "type": "integer", "minimum": 0, "description": "A count a report card is about (people online, jobs, stories)." }
++ },
++ "additionalProperties": false
++ },
++ "live_now": {
++ "type": "boolean",
++ "description": "Present on live and stream cards: true only while the channel is on air."
++ },
++ "trend": {
++ "type": "object",
++ "description": "Present on report cards: which way the number moved and by how much.",
++ "required": ["direction"],
++ "properties": {
++ "direction": { "enum": ["up", "down", "flat"] },
++ "pct": { "type": "number", "minimum": 0 },
++ "previous": { "type": "integer", "minimum": 0 }
++ },
++ "additionalProperties": false
++ },
++ "group": {
++ "type": "object",
++ "description": "A run of the same kind folded into one card (two or more items).",
++ "required": ["count", "items"],
++ "properties": {
++ "count": { "type": "integer", "minimum": 2 },
++ "items": {
++ "type": "array",
++ "minItems": 2,
++ "items": {
++ "type": "object",
++ "required": ["id", "url", "title", "media"],
++ "properties": {
++ "id": { "type": "string" },
++ "url": { "type": "string", "pattern": "^https://" },
++ "title": { "type": "string" },
++ "media": { "type": ["object", "null"] }
++ },
++ "additionalProperties": false
++ }
++ }
++ },
++ "additionalProperties": false
++ },
++ "label": {
++ "enum": ["Trending", "AI", "System", "Live"],
++ "description": "Present only when the card needs one."
++ },
++ "visibility": {
++ "enum": ["followers"],
++ "description": "Present only for an item returned to a follower or its author; never public."
++ }
++ }
++}
ddiff --git a/fixtures/feed.item/invalid/bad-subject.json b/fixtures/feed.item/invalid/bad-subject.json
nnew file mode 100644
iindex 00000000..ef410518
---- /dev/null
++++ b/fixtures/feed.item/invalid/bad-subject.json
@@@ -0,0 +1,17 @@
++{
++ "id": "f:example:post:1",
++ "kind": "post",
++ "url": "https://openvibe.example/reference",
++ "title": "An example post",
++ "text": "",
++ "at": "2026-11-12T09:00:00.000Z",
++ "site": "example",
++ "site_name": "Example",
++ "actor": {
++ "name": "Alex",
++ "avatar": null
++ },
++ "subject": "alex",
++ "media": null,
++ "counts": {}
++}
ddiff --git a/fixtures/feed.item/invalid/group-too-small.json b/fixtures/feed.item/invalid/group-too-small.json
nnew file mode 100644
iindex 00000000..23fc2383
---- /dev/null
++++ b/fixtures/feed.item/invalid/group-too-small.json
@@@ -0,0 +1,21 @@
++{
++ "id": "f:example:video:1",
++ "kind": "video",
++ "url": "https://openvibe.example/reference",
++ "title": "An example video",
++ "text": "",
++ "at": "2026-11-12T09:00:00.000Z",
++ "site": "example",
++ "site_name": "Example",
++ "actor": {
++ "name": "Alex",
++ "avatar": null
++ },
++ "subject": "usr_01JQ8Z6K6M0V8Y2Q3R4S5T6V7W",
++ "media": null,
++ "counts": {},
++ "group": {
++ "count": 1,
++ "items": []
++ }
++}
ddiff --git a/fixtures/feed.item/invalid/missing-id.json b/fixtures/feed.item/invalid/missing-id.json
nnew file mode 100644
iindex 00000000..64bb0ea4
---- /dev/null
++++ b/fixtures/feed.item/invalid/missing-id.json
@@@ -0,0 +1,16 @@
++{
++ "kind": "post",
++ "url": "https://openvibe.example/reference",
++ "title": "An example post",
++ "text": "",
++ "at": "2026-11-12T09:00:00.000Z",
++ "site": "example",
++ "site_name": "Example",
++ "actor": {
++ "name": "Alex",
++ "avatar": null
++ },
++ "subject": "usr_01JQ8Z6K6M0V8Y2Q3R4S5T6V7W",
++ "media": null,
++ "counts": {}
++}
ddiff --git a/fixtures/feed.item/invalid/negative-count.json b/fixtures/feed.item/invalid/negative-count.json
nnew file mode 100644
iindex 00000000..02bc80d8
---- /dev/null
++++ b/fixtures/feed.item/invalid/negative-count.json
@@@ -0,0 +1,19 @@
++{
++ "id": "f:example:post:1",
++ "kind": "post",
++ "url": "https://openvibe.example/reference",
++ "title": "An example post",
++ "text": "",
++ "at": "2026-11-12T09:00:00.000Z",
++ "site": "example",
++ "site_name": "Example",
++ "actor": {
++ "name": "Alex",
++ "avatar": null
++ },
++ "subject": "usr_01JQ8Z6K6M0V8Y2Q3R4S5T6V7W",
++ "media": null,
++ "counts": {
++ "likes": -1
++ }
++}
ddiff --git a/fixtures/feed.item/invalid/not-a-url.json b/fixtures/feed.item/invalid/not-a-url.json
nnew file mode 100644
iindex 00000000..0ca21a5b
---- /dev/null
++++ b/fixtures/feed.item/invalid/not-a-url.json
@@@ -0,0 +1,20 @@
++{
++ "id": "f:example:post:1",
++ "kind": "post",
++ "url": "openvibe.community/no-scheme",
++ "title": "Hello, network",
++ "text": "A first post.",
++ "at": "2026-11-12T09:00:00.000Z",
++ "site": "community",
++ "site_name": "Community",
++ "actor": {
++ "name": "Alex",
++ "avatar": null
++ },
++ "subject": "usr_01JQ8Z6K6M0V8Y2Q3R4S5T6V7W",
++ "media": null,
++ "counts": {
++ "likes": 4,
++ "comments": 2
++ }
++}
ddiff --git a/fixtures/feed.item/invalid/private-visibility.json b/fixtures/feed.item/invalid/private-visibility.json
nnew file mode 100644
iindex 00000000..815b9f14
---- /dev/null
++++ b/fixtures/feed.item/invalid/private-visibility.json
@@@ -0,0 +1,18 @@
++{
++ "id": "f:example:post:1",
++ "kind": "post",
++ "url": "https://openvibe.example/reference",
++ "title": "An example post",
++ "text": "",
++ "at": "2026-11-12T09:00:00.000Z",
++ "site": "example",
++ "site_name": "Example",
++ "actor": {
++ "name": "Alex",
++ "avatar": null
++ },
++ "subject": "usr_01JQ8Z6K6M0V8Y2Q3R4S5T6V7W",
++ "media": null,
++ "counts": {},
++ "visibility": "private"
++}
ddiff --git a/fixtures/feed.item/invalid/trend-without-direction.json b/fixtures/feed.item/invalid/trend-without-direction.json
nnew file mode 100644
iindex 00000000..5976583d
---- /dev/null
++++ b/fixtures/feed.item/invalid/trend-without-direction.json
@@@ -0,0 +1,20 @@
++{
++ "id": "f:example:report:1",
++ "kind": "report",
++ "url": "https://openvibe.example/reference",
++ "title": "An example report",
++ "text": "",
++ "at": "2026-11-12T09:00:00.000Z",
++ "site": "example",
++ "site_name": "Example",
++ "actor": {
++ "name": "Alex",
++ "avatar": null
++ },
++ "subject": "usr_01JQ8Z6K6M0V8Y2Q3R4S5T6V7W",
++ "media": null,
++ "counts": {},
++ "trend": {
++ "pct": 4
++ }
++}
ddiff --git a/fixtures/feed.item/invalid/unknown-kind.json b/fixtures/feed.item/invalid/unknown-kind.json
nnew file mode 100644
iindex 00000000..46eae51e
---- /dev/null
++++ b/fixtures/feed.item/invalid/unknown-kind.json
@@@ -0,0 +1,17 @@
++{
++ "id": "f:example:post:1",
++ "kind": "not-a-kind",
++ "url": "https://openvibe.example/reference",
++ "title": "An example post",
++ "text": "",
++ "at": "2026-11-12T09:00:00.000Z",
++ "site": "example",
++ "site_name": "Example",
++ "actor": {
++ "name": "Alex",
++ "avatar": null
++ },
++ "subject": "usr_01JQ8Z6K6M0V8Y2Q3R4S5T6V7W",
++ "media": null,
++ "counts": {}
++}
ddiff --git a/fixtures/feed.item/valid/avatar.json b/fixtures/feed.item/valid/avatar.json
nnew file mode 100644
iindex 00000000..b544717a
---- /dev/null
++++ b/fixtures/feed.item/valid/avatar.json
@@@ -0,0 +1,17 @@
++{
++ "id": "f:example:avatar:1",
++ "kind": "avatar",
++ "url": "https://openvibe.network/@alex",
++ "title": "Alex changed their picture",
++ "text": "",
++ "at": "2026-11-12T09:00:00.000Z",
++ "site": "network",
++ "site_name": "Network",
++ "actor": {
++ "name": "Alex",
++ "avatar": null
++ },
++ "subject": "usr_01JQ8Z6K6M0V8Y2Q3R4S5T6V7W",
++ "media": null,
++ "counts": {}
++}
ddiff --git a/fixtures/feed.item/valid/banner.json b/fixtures/feed.item/valid/banner.json
nnew file mode 100644
iindex 00000000..440bd582
---- /dev/null
++++ b/fixtures/feed.item/valid/banner.json
@@@ -0,0 +1,17 @@
++{
++ "id": "f:example:banner:1",
++ "kind": "banner",
++ "url": "https://openvibe.network/@alex",
++ "title": "Alex changed their banner",
++ "text": "",
++ "at": "2026-11-12T09:00:00.000Z",
++ "site": "network",
++ "site_name": "Network",
++ "actor": {
++ "name": "Alex",
++ "avatar": null
++ },
++ "subject": "usr_01JQ8Z6K6M0V8Y2Q3R4S5T6V7W",
++ "media": null,
++ "counts": {}
++}
ddiff --git a/fixtures/feed.item/valid/chat.json b/fixtures/feed.item/valid/chat.json
nnew file mode 100644
iindex 00000000..ce2eb009
---- /dev/null
++++ b/fixtures/feed.item/valid/chat.json
@@@ -0,0 +1,16 @@
++{
++ "id": "f:example:chat:1",
++ "kind": "chat",
++ "url": "https://openvibe.chat/r/feed",
++ "title": "A busy hour in #feed",
++ "text": "28 messages",
++ "at": "2026-11-12T09:00:00.000Z",
++ "site": "chat",
++ "site_name": "Chat",
++ "actor": null,
++ "subject": null,
++ "media": null,
++ "counts": {
++ "people": 9
++ }
++}
ddiff --git a/fixtures/feed.item/valid/clip.json b/fixtures/feed.item/valid/clip.json
nnew file mode 100644
iindex 00000000..8ef9cb5d
---- /dev/null
++++ b/fixtures/feed.item/valid/clip.json
@@@ -0,0 +1,21 @@
++{
++ "id": "f:example:clip:1",
++ "kind": "clip",
++ "url": "https://openvibe.live/clip/c1",
++ "title": "A clip",
++ "text": "",
++ "at": "2026-11-12T09:00:00.000Z",
++ "site": "live",
++ "site_name": "Live",
++ "actor": {
++ "name": "Alex",
++ "avatar": null
++ },
++ "subject": "usr_01JQ8Z6K6M0V8Y2Q3R4S5T6V7W",
++ "media": {
++ "thumb": "https://openvibe.media/t/clip.jpg",
++ "ratio": 1.777,
++ "length": 42
++ },
++ "counts": {}
++}
ddiff --git a/fixtures/feed.item/valid/deal.json b/fixtures/feed.item/valid/deal.json
nnew file mode 100644
iindex 00000000..6417d931
---- /dev/null
++++ b/fixtures/feed.item/valid/deal.json
@@@ -0,0 +1,19 @@
++{
++ "id": "f:example:deal:1",
++ "kind": "deal",
++ "url": "https://openvibe.deals/d/example",
++ "title": "A deal on a keyboard",
++ "text": "20% off",
++ "at": "2026-11-12T09:00:00.000Z",
++ "site": "deals",
++ "site_name": "Deals",
++ "actor": {
++ "name": "Alex",
++ "avatar": null
++ },
++ "subject": "usr_01JQ8Z6K6M0V8Y2Q3R4S5T6V7W",
++ "media": null,
++ "counts": {
++ "likes": 3
++ }
++}
ddiff --git a/fixtures/feed.item/valid/episode.json b/fixtures/feed.item/valid/episode.json
nnew file mode 100644
iindex 00000000..774365cd
---- /dev/null
++++ b/fixtures/feed.item/valid/episode.json
@@@ -0,0 +1,14 @@
++{
++ "id": "f:example:episode:1",
++ "kind": "episode",
++ "url": "https://openvibe.live/rundown/e/3005",
++ "title": "Rundown: an episode",
++ "text": "A logline",
++ "at": "2026-11-12T09:00:00.000Z",
++ "site": "live",
++ "site_name": "Live",
++ "actor": null,
++ "subject": null,
++ "media": null,
++ "counts": {}
++}
ddiff --git a/fixtures/feed.item/valid/event.json b/fixtures/feed.item/valid/event.json
nnew file mode 100644
iindex 00000000..e7ee9e4a
---- /dev/null
++++ b/fixtures/feed.item/valid/event.json
@@@ -0,0 +1,15 @@
++{
++ "id": "f:example:event:1",
++ "kind": "event",
++ "url": "https://openvibe.today/e/tev_example",
++ "title": "Coming up: a stream about feeds",
++ "text": "",
++ "at": "2026-11-12T09:00:00.000Z",
++ "site": "today",
++ "site_name": "Today",
++ "actor": null,
++ "subject": null,
++ "media": null,
++ "counts": {},
++ "starts_at": "2026-11-13T18:00:00.000Z"
++}
ddiff --git a/fixtures/feed.item/valid/follow.json b/fixtures/feed.item/valid/follow.json
nnew file mode 100644
iindex 00000000..92f28da4
---- /dev/null
++++ b/fixtures/feed.item/valid/follow.json
@@@ -0,0 +1,17 @@
++{
++ "id": "f:example:follow:1",
++ "kind": "follow",
++ "url": "https://openvibe.live/@alex",
++ "title": "Alex followed Maticus",
++ "text": "",
++ "at": "2026-11-12T09:00:00.000Z",
++ "site": "network",
++ "site_name": "Network",
++ "actor": {
++ "name": "Alex",
++ "avatar": null
++ },
++ "subject": "usr_01JQ8Z6K6M0V8Y2Q3R4S5T6V7W",
++ "media": null,
++ "counts": {}
++}
ddiff --git a/fixtures/feed.item/valid/game.json b/fixtures/feed.item/valid/game.json
nnew file mode 100644
iindex 00000000..c5026939
---- /dev/null
++++ b/fixtures/feed.item/valid/game.json
@@@ -0,0 +1,17 @@
++{
++ "id": "f:example:game:1",
++ "kind": "game",
++ "url": "https://openvibe.games/world/example",
++ "title": "Unlocked a level in Scraplandia",
++ "text": "Level 15",
++ "at": "2026-11-12T09:00:00.000Z",
++ "site": "games",
++ "site_name": "Games",
++ "actor": {
++ "name": "Alex",
++ "avatar": null
++ },
++ "subject": "usr_01JQ8Z6K6M0V8Y2Q3R4S5T6V7W",
++ "media": null,
++ "counts": {}
++}
ddiff --git a/fixtures/feed.item/valid/live.json b/fixtures/feed.item/valid/live.json
nnew file mode 100644
iindex 00000000..6efe568b
---- /dev/null
++++ b/fixtures/feed.item/valid/live.json
@@@ -0,0 +1,21 @@
++{
++ "id": "f:example:live:1",
++ "kind": "live",
++ "url": "https://openvibe.live/@alex",
++ "title": "Alex went live: building a feed",
++ "text": "",
++ "at": "2026-11-12T09:00:00.000Z",
++ "site": "live",
++ "site_name": "Live",
++ "actor": {
++ "name": "Alex",
++ "avatar": null
++ },
++ "subject": "usr_01JQ8Z6K6M0V8Y2Q3R4S5T6V7W",
++ "media": null,
++ "counts": {
++ "watchers": 12
++ },
++ "live_now": true,
++ "label": "Live"
++}
ddiff --git a/fixtures/feed.item/valid/member.json b/fixtures/feed.item/valid/member.json
nnew file mode 100644
iindex 00000000..cb2ca0c1
---- /dev/null
++++ b/fixtures/feed.item/valid/member.json
@@@ -0,0 +1,15 @@
++{
++ "id": "f:example:member:1",
++ "kind": "member",
++ "url": "https://openvibe.network/stats",
++ "title": "5 people joined today",
++ "text": "",
++ "at": "2026-11-12T09:00:00.000Z",
++ "site": "network",
++ "site_name": "Network",
++ "actor": null,
++ "subject": null,
++ "media": null,
++ "counts": {},
++ "label": "System"
++}
ddiff --git a/fixtures/feed.item/valid/meme.json b/fixtures/feed.item/valid/meme.json
nnew file mode 100644
iindex 00000000..df82c1ec
---- /dev/null
++++ b/fixtures/feed.item/valid/meme.json
@@@ -0,0 +1,15 @@
++{
++ "id": "f:example:meme:1",
++ "kind": "meme",
++ "url": "https://openvibe.meme/m/example",
++ "title": "A meme with receipts",
++ "text": "Weaker rulers show mercy.",
++ "at": "2026-11-12T09:00:00.000Z",
++ "site": "meme",
++ "site_name": "Meme",
++ "actor": null,
++ "subject": null,
++ "media": null,
++ "counts": {},
++ "label": "System"
++}
ddiff --git a/fixtures/feed.item/valid/news.json b/fixtures/feed.item/valid/news.json
nnew file mode 100644
iindex 00000000..142c0fb2
---- /dev/null
++++ b/fixtures/feed.item/valid/news.json
@@@ -0,0 +1,17 @@
++{
++ "id": "f:example:news:1",
++ "kind": "news",
++ "url": "https://openvibe.news/s/example",
++ "title": "News: the feed ships",
++ "text": "Sourced, not spun.",
++ "at": "2026-11-12T09:00:00.000Z",
++ "site": "news",
++ "site_name": "News",
++ "actor": {
++ "name": "Alex",
++ "avatar": null
++ },
++ "subject": "usr_01JQ8Z6K6M0V8Y2Q3R4S5T6V7W",
++ "media": null,
++ "counts": {}
++}
ddiff --git a/fixtures/feed.item/valid/paste.json b/fixtures/feed.item/valid/paste.json
nnew file mode 100644
iindex 00000000..48a33b37
---- /dev/null
++++ b/fixtures/feed.item/valid/paste.json
@@@ -0,0 +1,20 @@
++{
++ "id": "f:example:paste:1",
++ "kind": "paste",
++ "url": "https://openvibe.community/p/example",
++ "title": "A paste",
++ "text": "print(\"hello\")",
++ "at": "2026-11-12T09:00:00.000Z",
++ "site": "community",
++ "site_name": "Community",
++ "actor": {
++ "name": "Alex",
++ "avatar": null
++ },
++ "subject": "usr_01JQ8Z6K6M0V8Y2Q3R4S5T6V7W",
++ "media": null,
++ "counts": {
++ "views": 10,
++ "likes": 1
++ }
++}
ddiff --git a/fixtures/feed.item/valid/pic.json b/fixtures/feed.item/valid/pic.json
nnew file mode 100644
iindex 00000000..8556358a
---- /dev/null
++++ b/fixtures/feed.item/valid/pic.json
@@@ -0,0 +1,20 @@
++{
++ "id": "f:example:pic:1",
++ "kind": "pic",
++ "url": "https://openvibe.pics/p/pic_01JQ8Z6K6M0V8Y2Q3R4S5T6V7W",
++ "title": "A picture",
++ "text": "",
++ "at": "2026-11-12T09:00:00.000Z",
++ "site": "pics",
++ "site_name": "Pics",
++ "actor": {
++ "name": "Alex",
++ "avatar": null
++ },
++ "subject": "usr_01JQ8Z6K6M0V8Y2Q3R4S5T6V7W",
++ "media": {
++ "thumb": "https://openvibe.media/t/example.jpg",
++ "ratio": 1.5
++ },
++ "counts": {}
++}
ddiff --git a/fixtures/feed.item/valid/poll.json b/fixtures/feed.item/valid/poll.json
nnew file mode 100644
iindex 00000000..68ce8cad
---- /dev/null
++++ b/fixtures/feed.item/valid/poll.json
@@@ -0,0 +1,19 @@
++{
++ "id": "f:example:poll:1",
++ "kind": "poll",
++ "url": "https://openvibe.community/forum/status/poll",
++ "title": "Which feed kind do you open first?",
++ "text": "A poll",
++ "at": "2026-11-12T09:00:00.000Z",
++ "site": "community",
++ "site_name": "Community",
++ "actor": {
++ "name": "Alex",
++ "avatar": null
++ },
++ "subject": "usr_01JQ8Z6K6M0V8Y2Q3R4S5T6V7W",
++ "media": null,
++ "counts": {
++ "people": 41
++ }
++}
ddiff --git a/fixtures/feed.item/valid/post.json b/fixtures/feed.item/valid/post.json
nnew file mode 100644
iindex 00000000..288b90c0
---- /dev/null
++++ b/fixtures/feed.item/valid/post.json
@@@ -0,0 +1,20 @@
++{
++ "id": "f:example:post:1",
++ "kind": "post",
++ "url": "https://openvibe.community/forum/status/hello",
++ "title": "Hello, network",
++ "text": "A first post.",
++ "at": "2026-11-12T09:00:00.000Z",
++ "site": "community",
++ "site_name": "Community",
++ "actor": {
++ "name": "Alex",
++ "avatar": null
++ },
++ "subject": "usr_01JQ8Z6K6M0V8Y2Q3R4S5T6V7W",
++ "media": null,
++ "counts": {
++ "likes": 4,
++ "comments": 2
++ }
++}
ddiff --git a/fixtures/feed.item/valid/quest.json b/fixtures/feed.item/valid/quest.json
nnew file mode 100644
iindex 00000000..addd2bd1
---- /dev/null
++++ b/fixtures/feed.item/valid/quest.json
@@@ -0,0 +1,17 @@
++{
++ "id": "f:example:quest:1",
++ "kind": "quest",
++ "url": "https://openvibe.quest/",
++ "title": "Finished a quest: first broadcast",
++ "text": "",
++ "at": "2026-11-12T09:00:00.000Z",
++ "site": "quest",
++ "site_name": "Quest",
++ "actor": {
++ "name": "Alex",
++ "avatar": null
++ },
++ "subject": "usr_01JQ8Z6K6M0V8Y2Q3R4S5T6V7W",
++ "media": null,
++ "counts": {}
++}
ddiff --git a/fixtures/feed.item/valid/report.json b/fixtures/feed.item/valid/report.json
nnew file mode 100644
iindex 00000000..19180a68
---- /dev/null
++++ b/fixtures/feed.item/valid/report.json
@@@ -0,0 +1,21 @@
++{
++ "id": "f:example:report:1",
++ "kind": "report",
++ "url": "https://openvibe.report/network",
++ "title": "Peak today: 1,204 people online at 9 PM",
++ "text": "Online peak across the network",
++ "at": "2026-11-12T09:00:00.000Z",
++ "site": "report",
++ "site_name": "Report",
++ "actor": null,
++ "subject": null,
++ "media": null,
++ "counts": {
++ "people": 1204
++ },
++ "trend": {
++ "direction": "up",
++ "pct": 12
++ },
++ "label": "System"
++}
ddiff --git a/fixtures/feed.item/valid/rundown.json b/fixtures/feed.item/valid/rundown.json
nnew file mode 100644
iindex 00000000..b2b0f684
---- /dev/null
++++ b/fixtures/feed.item/valid/rundown.json
@@@ -0,0 +1,18 @@
++{
++ "id": "f:example:rundown:1",
++ "kind": "rundown",
++ "url": "https://openvibe.live/rundown/e/3005",
++ "title": "Rundown: the case for a feed",
++ "text": "What the episode was about.",
++ "at": "2026-11-12T09:00:00.000Z",
++ "site": "live",
++ "site_name": "Live",
++ "actor": null,
++ "subject": null,
++ "media": {
++ "thumb": "https://openvibe.media/t/episode.jpg",
++ "ratio": 1.777
++ },
++ "counts": {},
++ "label": "System"
++}
ddiff --git a/fixtures/feed.item/valid/site.json b/fixtures/feed.item/valid/site.json
nnew file mode 100644
iindex 00000000..fee32f6e
---- /dev/null
++++ b/fixtures/feed.item/valid/site.json
@@@ -0,0 +1,17 @@
++{
++ "id": "f:example:site:1",
++ "kind": "site",
++ "url": "https://openvibe.network/",
++ "title": "A new site joined the network",
++ "text": "",
++ "at": "2026-11-12T09:00:00.000Z",
++ "site": "network",
++ "site_name": "Network",
++ "actor": {
++ "name": "Alex",
++ "avatar": null
++ },
++ "subject": "usr_01JQ8Z6K6M0V8Y2Q3R4S5T6V7W",
++ "media": null,
++ "counts": {}
++}
ddiff --git a/fixtures/feed.item/valid/space.json b/fixtures/feed.item/valid/space.json
nnew file mode 100644
iindex 00000000..4b65f81f
---- /dev/null
++++ b/fixtures/feed.item/valid/space.json
@@@ -0,0 +1,17 @@
++{
++ "id": "f:example:space:1",
++ "kind": "space",
++ "url": "https://openvibe.space/s/example",
++ "title": "A new space",
++ "text": "A site for a project.",
++ "at": "2026-11-12T09:00:00.000Z",
++ "site": "space",
++ "site_name": "Space",
++ "actor": {
++ "name": "Alex",
++ "avatar": null
++ },
++ "subject": "usr_01JQ8Z6K6M0V8Y2Q3R4S5T6V7W",
++ "media": null,
++ "counts": {}
++}
ddiff --git a/fixtures/feed.item/valid/stream.json b/fixtures/feed.item/valid/stream.json
nnew file mode 100644
iindex 00000000..f7d4829f
---- /dev/null
++++ b/fixtures/feed.item/valid/stream.json
@@@ -0,0 +1,21 @@
++{
++ "id": "f:example:stream:1",
++ "kind": "stream",
++ "url": "https://openvibe.live/@alex",
++ "title": "312 people watched Alex tonight",
++ "text": "A watched-together stream.",
++ "at": "2026-11-12T09:00:00.000Z",
++ "site": "live",
++ "site_name": "Live",
++ "actor": {
++ "name": "Alex",
++ "avatar": null
++ },
++ "subject": "usr_01JQ8Z6K6M0V8Y2Q3R4S5T6V7W",
++ "media": null,
++ "counts": {
++ "watchers": 312,
++ "views": 410
++ },
++ "live_now": false
++}
ddiff --git a/fixtures/feed.item/valid/update.json b/fixtures/feed.item/valid/update.json
nnew file mode 100644
iindex 00000000..0b8bf4a0
---- /dev/null
++++ b/fixtures/feed.item/valid/update.json
@@@ -0,0 +1,17 @@
++{
++ "id": "f:example:update:1",
++ "kind": "update",
++ "url": "https://openvibe.blog/p/feed",
++ "title": "New post on the OpenVibe blog",
++ "text": "The feed is one.",
++ "at": "2026-11-12T09:00:00.000Z",
++ "site": "blog",
++ "site_name": "Blog",
++ "actor": {
++ "name": "Alex",
++ "avatar": null
++ },
++ "subject": "usr_01JQ8Z6K6M0V8Y2Q3R4S5T6V7W",
++ "media": null,
++ "counts": {}
++}
ddiff --git a/fixtures/feed.item/valid/video.json b/fixtures/feed.item/valid/video.json
nnew file mode 100644
iindex 00000000..9e438d5e
---- /dev/null
++++ b/fixtures/feed.item/valid/video.json
@@@ -0,0 +1,21 @@
++{
++ "id": "f:example:video:1",
++ "kind": "video",
++ "url": "https://openvibe.video/watch?v=example",
++ "title": "Recording: an evening",
++ "text": "",
++ "at": "2026-11-12T09:00:00.000Z",
++ "site": "live",
++ "site_name": "Live",
++ "actor": {
++ "name": "Alex",
++ "avatar": null
++ },
++ "subject": "usr_01JQ8Z6K6M0V8Y2Q3R4S5T6V7W",
++ "media": {
++ "thumb": "https://openvibe.media/t/vod.jpg",
++ "ratio": 1.777,
++ "length": 3600
++ },
++ "counts": {}
++}
ddiff --git a/fixtures/feed.item/valid/wiki.json b/fixtures/feed.item/valid/wiki.json
nnew file mode 100644
iindex 00000000..250c0a09
---- /dev/null
++++ b/fixtures/feed.item/valid/wiki.json
@@@ -0,0 +1,17 @@
++{
++ "id": "f:example:wiki:1",
++ "kind": "wiki",
++ "url": "https://openvibe.wiki/space/page",
++ "title": "Wiki: OpenVibe / feed",
++ "text": "How the one feed works.",
++ "at": "2026-11-12T09:00:00.000Z",
++ "site": "wiki",
++ "site_name": "Wiki",
++ "actor": {
++ "name": "Alex",
++ "avatar": null
++ },
++ "subject": "usr_01JQ8Z6K6M0V8Y2Q3R4S5T6V7W",
++ "media": null,
++ "counts": {}
++}
ddiff --git a/fixtures/feed.item/valid/work.json b/fixtures/feed.item/valid/work.json
nnew file mode 100644
iindex 00000000..8b1ba92f
---- /dev/null
++++ b/fixtures/feed.item/valid/work.json
@@@ -0,0 +1,16 @@
++{
++ "id": "f:example:work:1",
++ "kind": "work",
++ "url": "https://openvibe.work/jobs",
++ "title": "14 new jobs this hour",
++ "text": "Remote: GIS engineer, and more",
++ "at": "2026-11-12T09:00:00.000Z",
++ "site": "work",
++ "site_name": "Work",
++ "actor": null,
++ "subject": null,
++ "media": null,
++ "counts": {
++ "people": 14
++ }
++}
ddiff --git a/generated/json-schema/bundle.json b/generated/json-schema/bundle.json
iindex 73e78a45..dc391d1b 100644
---- a/generated/json-schema/bundle.json
++++ b/generated/json-schema/bundle.json
@@@ -136326,6 +136326,299 @@
"description": "agents.run.updated v1 (agent-engine.md, 2026-11-12). A run changed in a way a list shows: it started, its status, title, doing, waiting or preview changed, or it ended. The payload is the run's agents.run@1 snapshot, whole. OpenVibe.Events carries it with the run's owner as the subject, the product that stores it as the source and visibility subject, so the person's run list anywhere stays current without polling. A step is agents.step.appended; this event is not sent for every step, only when the snapshot a list draws changed (at most about once a second per run).",
"$ref": "../../agents/run.v1.json"
}
++ },
++ "feed.item": {
++ "version": "1.0.0",
++ "owner": "network",
++ "status": "active",
++ "schema": {
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/feed/item.v1.json",
++ "title": "FeedItem",
++ "description": "feed.item@1: one card of OpenVibe's one feed, served by OpenVibe.Network (GET /api/v1/feed and GET /api/frame/feed; OpenVibe.Community's Pulse reads the same feed). Every card names the service it came from, a stable id, its own link, and only public or follower-visible activity. Kinds: post, pic, clip, video, live, stream, rundown, quest, member, chat, event, wiki, update, work, deal, news, report, poll, game, meme, paste, episode, space, avatar, banner, follow, site.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "id",
++ "kind",
++ "url",
++ "title",
++ "text",
++ "at",
++ "site",
++ "site_name",
++ "actor",
++ "subject",
++ "media",
++ "counts"
++ ],
++ "properties": {
++ "id": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 500,
++ "description": "Stable across feeds and restarts: f:<service>:<type>:<id> for a source item and t:<site>:<url> for a trending card."
++ },
++ "kind": {
++ "description": "What happened. live is a channel on air now (a go-live that ended is stream); stream is a past broadcast, including a watched-together summary; work is one grouped row of new jobs per hour; report is a number with its trend.",
++ "enum": [
++ "post",
++ "pic",
++ "clip",
++ "video",
++ "live",
++ "stream",
++ "rundown",
++ "quest",
++ "member",
++ "chat",
++ "event",
++ "wiki",
++ "update",
++ "work",
++ "deal",
++ "news",
++ "report",
++ "poll",
++ "game",
++ "meme",
++ "paste",
++ "episode",
++ "space",
++ "avatar",
++ "banner",
++ "follow",
++ "site"
++ ]
++ },
++ "url": {
++ "type": "string",
++ "pattern": "^https?://",
++ "maxLength": 2000,
++ "description": "The thing itself: the post, stream, job board, report page or wiki page."
++ },
++ "title": {
++ "type": "string",
++ "maxLength": 300
++ },
++ "text": {
++ "type": "string",
++ "maxLength": 280,
++ "description": "The source's first 280 characters, on one line; empty when it has none."
++ },
++ "at": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "format": "date-time",
++ "description": "When it happened; null only for a trending card."
++ },
++ "starts_at": {
++ "type": "string",
++ "format": "date-time",
++ "description": "When a scheduled event begins; present only on event cards."
++ },
++ "site": {
++ "type": "string",
++ "maxLength": 40,
++ "description": "The source service: live, community, media-hub, pics, games, quest, chat, today, work, deals, news, report, wiki, blog, tools, network…"
++ },
++ "site_name": {
++ "type": "string",
++ "maxLength": 40
++ },
++ "actor": {
++ "type": [
++ "object",
++ "null"
++ ],
++ "description": "Who did it; null for AI, system, aggregate and trending cards.",
++ "required": [
++ "name",
++ "avatar"
++ ],
++ "properties": {
++ "name": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "maxLength": 80
++ },
++ "avatar": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "maxLength": 2000
++ }
++ },
++ "additionalProperties": false
++ },
++ "subject": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "pattern": "^usr_[0-9A-HJKMNP-TV-Z]{26}$",
++ "description": "The acting person's subject, when one is known; null for AI, system and aggregate cards. The Following filter and For you ranking read it."
++ },
++ "media": {
++ "type": [
++ "object",
++ "null"
++ ],
++ "description": "The card's first picture, as a Media thumbnail; null when it has none.",
++ "required": [
++ "thumb",
++ "ratio"
++ ],
++ "properties": {
++ "thumb": {
++ "type": "string",
++ "pattern": "^https://",
++ "maxLength": 2000
++ },
++ "preview": {
++ "type": "string",
++ "pattern": "^https://",
++ "maxLength": 2000
++ },
++ "ratio": {
++ "type": "number",
++ "exclusiveMinimum": 0
++ },
++ "length": {
++ "type": "number",
++ "minimum": 0,
++ "description": "Seconds, when the card is a video."
++ }
++ },
++ "additionalProperties": false
++ },
++ "counts": {
++ "type": "object",
++ "description": "The numbers the source knows; each present only when it knows it.",
++ "properties": {
++ "views": {
++ "type": "integer",
++ "minimum": 0
++ },
++ "likes": {
++ "type": "integer",
++ "minimum": 0
++ },
++ "comments": {
++ "type": "integer",
++ "minimum": 0
++ },
++ "watchers": {
++ "type": "integer",
++ "minimum": 0,
++ "description": "People who watched a stream (peak for a past broadcast)."
++ },
++ "people": {
++ "type": "integer",
++ "minimum": 0,
++ "description": "A count a report card is about (people online, jobs, stories)."
++ }
++ },
++ "additionalProperties": false
++ },
++ "live_now": {
++ "type": "boolean",
++ "description": "Present on live and stream cards: true only while the channel is on air."
++ },
++ "trend": {
++ "type": "object",
++ "description": "Present on report cards: which way the number moved and by how much.",
++ "required": [
++ "direction"
++ ],
++ "properties": {
++ "direction": {
++ "enum": [
++ "up",
++ "down",
++ "flat"
++ ]
++ },
++ "pct": {
++ "type": "number",
++ "minimum": 0
++ },
++ "previous": {
++ "type": "integer",
++ "minimum": 0
++ }
++ },
++ "additionalProperties": false
++ },
++ "group": {
++ "type": "object",
++ "description": "A run of the same kind folded into one card (two or more items).",
++ "required": [
++ "count",
++ "items"
++ ],
++ "properties": {
++ "count": {
++ "type": "integer",
++ "minimum": 2
++ },
++ "items": {
++ "type": "array",
++ "minItems": 2,
++ "items": {
++ "type": "object",
++ "required": [
++ "id",
++ "url",
++ "title",
++ "media"
++ ],
++ "properties": {
++ "id": {
++ "type": "string"
++ },
++ "url": {
++ "type": "string",
++ "pattern": "^https://"
++ },
++ "title": {
++ "type": "string"
++ },
++ "media": {
++ "type": [
++ "object",
++ "null"
++ ]
++ }
++ },
++ "additionalProperties": false
++ }
++ }
++ },
++ "additionalProperties": false
++ },
++ "label": {
++ "enum": [
++ "Trending",
++ "AI",
++ "System",
++ "Live"
++ ],
++ "description": "Present only when the card needs one."
++ },
++ "visibility": {
++ "enum": [
++ "followers"
++ ],
++ "description": "Present only for an item returned to a follower or its author; never public."
++ }
++ }
++ }
}
}
}
ddiff --git a/generated/openapi/actor.json b/generated/openapi/actor.json
iindex 0c31e2f1..8f22d29e 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.414.0",
-- "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.414.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.415.0",
++ "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.415.0): each operation lists the capabilities it performs; a token for the 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 0039a9e9..ffdcb432 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.414.0",
-- "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.414.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.415.0",
++ "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.415.0): each operation lists the capabilities it performs; a token for the 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 ad6a17f6..1ea4e58e 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.414.0",
-- "description": "Routes of OpenVibe.Bench as the OpenVibe contracts describe them (openvibe-contracts 0.414.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.415.0",
++ "description": "Routes of OpenVibe.Bench as the OpenVibe contracts describe them (openvibe-contracts 0.415.0): each operation lists the capabilities it performs; a token for the 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 f092200c..a56bfbe2 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.414.0",
-- "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.414.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.415.0",
++ "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.415.0): each operation lists the capabilities it performs; a token for the 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 0a9afb64..9b7c55b5 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.414.0",
-- "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.414.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.415.0",
++ "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.415.0): each operation lists the capabilities it performs; a token for the 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 94bd6a65..546e97c0 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.414.0",
-- "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.414.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.415.0",
++ "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.415.0): each operation lists the capabilities it performs; a token for the 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 5a6e5366..f4f2a607 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.414.0",
-- "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.414.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.415.0",
++ "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.415.0): each operation lists the capabilities it performs; a token for the 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 8f016776..92d344dc 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.414.0",
-- "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.414.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.415.0",
++ "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.415.0): each operation lists the capabilities it performs; a token for the 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 c35c4a60..344487ba 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.414.0",
-- "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.414.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.415.0",
++ "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.415.0): each operation lists the capabilities it performs; a token for the 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/connect.json b/generated/openapi/connect.json
iindex a7ac4262..728aa268 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.414.0",
-- "description": "Routes of OpenVibe Connect as the OpenVibe contracts describe them (openvibe-contracts 0.414.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.415.0",
++ "description": "Routes of OpenVibe Connect as the OpenVibe contracts describe them (openvibe-contracts 0.415.0): each operation lists the capabilities it performs; a token for the 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 2006fd24..745ac5d4 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.414.0",
-- "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.414.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.415.0",
++ "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.415.0): each operation lists the capabilities it performs; a token for the 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 6f610da4..746a9916 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.414.0",
-- "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.414.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.415.0",
++ "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.415.0): each operation lists the capabilities it performs; a token for the 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 42d47979..2cdced91 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.414.0",
-- "description": "Routes of OpenVibe.Design as the OpenVibe contracts describe them (openvibe-contracts 0.414.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.415.0",
++ "description": "Routes of OpenVibe.Design as the OpenVibe contracts describe them (openvibe-contracts 0.415.0): each operation lists the capabilities it performs; a token for the 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 7d4194c4..29731a68 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.414.0",
-- "description": "Routes of OpenVibe.Domains as the OpenVibe contracts describe them (openvibe-contracts 0.414.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.415.0",
++ "description": "Routes of OpenVibe.Domains as the OpenVibe contracts describe them (openvibe-contracts 0.415.0): each operation lists the capabilities it performs; a token for the 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 dd7c1d14..e3cf6907 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.414.0",
-- "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.414.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.415.0",
++ "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.415.0): each operation lists the capabilities it performs; a token for the 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/exchange.json b/generated/openapi/exchange.json
iindex a428b11f..1df55deb 100644
---- a/generated/openapi/exchange.json
++++ b/generated/openapi/exchange.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Exchange API",
-- "version": "0.414.0",
-- "description": "Routes of OpenVibe.Exchange as the OpenVibe contracts describe them (openvibe-contracts 0.414.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.415.0",
++ "description": "Routes of OpenVibe.Exchange as the OpenVibe contracts describe them (openvibe-contracts 0.415.0): each operation lists the capabilities it performs; a token for the 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 65e726c2..e437c5f5 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.414.0",
-- "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.414.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.415.0",
++ "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.415.0): each operation lists the capabilities it performs; a token for the 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 14281362..8f837f45 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.414.0",
-- "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.414.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.415.0",
++ "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.415.0): each operation lists the capabilities it performs; a token for the 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/git.json b/generated/openapi/git.json
iindex 854777f9..7b12c451 100644
---- a/generated/openapi/git.json
++++ b/generated/openapi/git.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Git API",
-- "version": "0.414.0",
-- "description": "Routes of OpenVibe.Git as the OpenVibe contracts describe them (openvibe-contracts 0.414.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.415.0",
++ "description": "Routes of OpenVibe.Git as the OpenVibe contracts describe them (openvibe-contracts 0.415.0): each operation lists the capabilities it performs; a token for the 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 90598156..59986531 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.414.0",
-- "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.414.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.415.0",
++ "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.415.0): each operation lists the capabilities it performs; a token for the 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/inventory.json b/generated/openapi/inventory.json
iindex f403cb48..e623e653 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.414.0",
-- "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.414.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.415.0",
++ "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.415.0): each operation lists the capabilities it performs; a token for the 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 ecfbe704..2ccbb36d 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.414.0",
-- "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.414.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.415.0",
++ "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.415.0): each operation lists the capabilities it performs; a token for the 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 5e0a1701..83567f10 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.414.0",
-- "description": "Routes of OpenVibe.Mail as the OpenVibe contracts describe them (openvibe-contracts 0.414.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.415.0",
++ "description": "Routes of OpenVibe.Mail as the OpenVibe contracts describe them (openvibe-contracts 0.415.0): each operation lists the capabilities it performs; a token for the 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 89831ed1..2b6b47f1 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.414.0",
-- "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.414.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.415.0",
++ "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.415.0): each operation lists the capabilities it performs; a token for the 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 da57e0b9..ef542e10 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.414.0",
-- "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.414.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.415.0",
++ "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.415.0): each operation lists the capabilities it performs; a token for the 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 faaf4897..0a5403ed 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.414.0",
-- "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.414.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.415.0",
++ "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.415.0): each operation lists the capabilities it performs; a token for the 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 beaf0a70..fedfacb2 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.414.0",
-- "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.414.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.415.0",
++ "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.415.0): each operation lists the capabilities it performs; a token for the 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 61ff1a32..46d006d1 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.414.0",
-- "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.414.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.415.0",
++ "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.415.0): each operation lists the capabilities it performs; a token for the 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 e6a98381..5a3a4307 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.414.0",
-- "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.414.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.415.0",
++ "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.415.0): each operation lists the capabilities it performs; a token for the 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 bc7121d4..c68abe26 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.414.0",
-- "description": "Routes of OpenVibe.Quest as the OpenVibe contracts describe them (openvibe-contracts 0.414.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.415.0",
++ "description": "Routes of OpenVibe.Quest as the OpenVibe contracts describe them (openvibe-contracts 0.415.0): each operation lists the capabilities it performs; a token for the 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 f4eb280b..fdef7f81 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.414.0",
-- "description": "Routes of OpenVibe.Report as the OpenVibe contracts describe them (openvibe-contracts 0.414.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.415.0",
++ "description": "Routes of OpenVibe.Report as the OpenVibe contracts describe them (openvibe-contracts 0.415.0): each operation lists the capabilities it performs; a token for the 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 0e577f7e..d4277780 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.414.0",
-- "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.414.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.415.0",
++ "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.415.0): each operation lists the capabilities it performs; a token for the 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 e4084446..0ca8b85d 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.414.0",
-- "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.414.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.415.0",
++ "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.415.0): each operation lists the capabilities it performs; a token for the 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 7ca4dcc8..6428ba95 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.414.0",
-- "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.414.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.415.0",
++ "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.415.0): each operation lists the capabilities it performs; a token for the 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 d48d90cd..32c9816e 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.414.0",
-- "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.414.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.415.0",
++ "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.415.0): each operation lists the capabilities it performs; a token for the 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 3967bf59..b7cd1acd 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.414.0",
-- "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.414.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.415.0",
++ "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.415.0): each operation lists the capabilities it performs; a token for the 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 e1381bd0..cfce6cec 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.414.0",
-- "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.414.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.415.0",
++ "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.415.0): each operation lists the capabilities it performs; a token for the 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 92a050cc..24cc78e1 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.414.0",
-- "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.414.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.415.0",
++ "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.415.0): each operation lists the capabilities it performs; a token for the 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 6812352f..0319f4db 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.414.0",
-- "description": "Routes of OpenVibe.Today as the OpenVibe contracts describe them (openvibe-contracts 0.414.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.415.0",
++ "description": "Routes of OpenVibe.Today as the OpenVibe contracts describe them (openvibe-contracts 0.415.0): each operation lists the capabilities it performs; a token for the 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 57cbc438..ef2053eb 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.414.0",
-- "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.414.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.415.0",
++ "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.415.0): each operation lists the capabilities it performs; a token for the 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 5bee18c7..f3218a4f 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.414.0",
-- "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.414.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.415.0",
++ "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.415.0): each operation lists the capabilities it performs; a token for the 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 2a562ff5..ea1a0de0 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.414.0",
-- "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.414.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.415.0",
++ "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.415.0): each operation lists the capabilities it performs; a token for the 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 11cbc858..b3543637 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.414.0",
-- "description": "Routes of OpenVibe.Vision as the OpenVibe contracts describe them (openvibe-contracts 0.414.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.415.0",
++ "description": "Routes of OpenVibe.Vision as the OpenVibe contracts describe them (openvibe-contracts 0.415.0): each operation lists the capabilities it performs; a token for the 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 c4be024c..4a1deb05 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.414.0",
-- "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.414.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.415.0",
++ "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.415.0): each operation lists the capabilities it performs; a token for the 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 674f599f..d5fd1443 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.414.0",
-- "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.414.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.415.0",
++ "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.415.0): each operation lists the capabilities it performs; a token for the 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 285a73a8..e9418415 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.414.0",
-- "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.414.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.415.0",
++ "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.415.0): each operation lists the capabilities it performs; a token for the 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 199a4963..0da114e4 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.414.0",
-- "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.414.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.415.0",
++ "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.415.0): each operation lists the capabilities it performs; a token for the 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 9403113d..a69c8eab 100644
---- a/generated/typescript/index.d.ts
++++ b/generated/typescript/index.d.ts
@@@ -354276,3 +354276,155 @@ export interface AgentsRunUpdatedPayload {
*/
ended_at?: string | null;
}
++
++/** [email protected] (owner: network) */
++/**
++ * feed.item@1: one card of OpenVibe's one feed, served by OpenVibe.Network (GET /api/v1/feed and GET /api/frame/feed; OpenVibe.Community's Pulse reads the same feed). Every card names the service it came from, a stable id, its own link, and only public or follower-visible activity. Kinds: post, pic, clip, video, live, stream, rundown, quest, member, chat, event, wiki, update, work, deal, news, report, poll, game, meme, paste, episode, space, avatar, banner, follow, site.
++ */
++export interface FeedItem {
++ /**
++ * Stable across feeds and restarts: f:<service>:<type>:<id> for a source item and t:<site>:<url> for a trending card.
++ */
++ id: string;
++ /**
++ * What happened. live is a channel on air now (a go-live that ended is stream); stream is a past broadcast, including a watched-together summary; work is one grouped row of new jobs per hour; report is a number with its trend.
++ */
++ kind:
++ | "post"
++ | "pic"
++ | "clip"
++ | "video"
++ | "live"
++ | "stream"
++ | "rundown"
++ | "quest"
++ | "member"
++ | "chat"
++ | "event"
++ | "wiki"
++ | "update"
++ | "work"
++ | "deal"
++ | "news"
++ | "report"
++ | "poll"
++ | "game"
++ | "meme"
++ | "paste"
++ | "episode"
++ | "space"
++ | "avatar"
++ | "banner"
++ | "follow"
++ | "site";
++ /**
++ * The thing itself: the post, stream, job board, report page or wiki page.
++ */
++ url: string;
++ title: string;
++ /**
++ * The source's first 280 characters, on one line; empty when it has none.
++ */
++ text: string;
++ /**
++ * When it happened; null only for a trending card.
++ */
++ at: string | null;
++ /**
++ * When a scheduled event begins; present only on event cards.
++ */
++ starts_at?: string;
++ /**
++ * The source service: live, community, media-hub, pics, games, quest, chat, today, work, deals, news, report, wiki, blog, tools, network…
++ */
++ site: string;
++ site_name: string;
++ /**
++ * Who did it; null for AI, system, aggregate and trending cards.
++ */
++ actor: {
++ name: string | null;
++ avatar: string | null;
++ } | null;
++ /**
++ * The acting person's subject, when one is known; null for AI, system and aggregate cards. The Following filter and For you ranking read it.
++ */
++ subject: string | null;
++ /**
++ * The card's first picture, as a Media thumbnail; null when it has none.
++ */
++ media: {
++ thumb: string;
++ preview?: string;
++ ratio: number;
++ /**
++ * Seconds, when the card is a video.
++ */
++ length?: number;
++ } | null;
++ /**
++ * The numbers the source knows; each present only when it knows it.
++ */
++ counts: {
++ views?: number;
++ likes?: number;
++ comments?: number;
++ /**
++ * People who watched a stream (peak for a past broadcast).
++ */
++ watchers?: number;
++ /**
++ * A count a report card is about (people online, jobs, stories).
++ */
++ people?: number;
++ };
++ /**
++ * Present on live and stream cards: true only while the channel is on air.
++ */
++ live_now?: boolean;
++ /**
++ * Present on report cards: which way the number moved and by how much.
++ */
++ trend?: {
++ direction: "up" | "down" | "flat";
++ pct?: number;
++ previous?: number;
++ };
++ /**
++ * A run of the same kind folded into one card (two or more items).
++ */
++ group?: {
++ count: number;
++ /**
++ * @minItems 2
++ */
++ items: [
++ {
++ id: string;
++ url: string;
++ title: string;
++ media: {} | null;
++ },
++ {
++ id: string;
++ url: string;
++ title: string;
++ media: {} | null;
++ },
++ ...{
++ id: string;
++ url: string;
++ title: string;
++ media: {} | null;
++ }[]
++ ];
++ };
++ /**
++ * Present only when the card needs one.
++ */
++ label?: "Trending" | "AI" | "System" | "Live";
++ /**
++ * Present only for an item returned to a follower or its author; never public.
++ */
++ visibility?: "followers";
++}
ddiff --git a/package.json b/package.json
iindex 0f752ee8..536bc693 100644
---- a/package.json
++++ b/package.json
@@@ -1,6 +1,6 @@
{
"name": "openvibe-contracts",
-- "version": "0.414.0",
++ "version": "0.415.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",