openvibers/openvibe.contracts Commits

Report me-stats: the person's own numbers, public by choice (0.356.0) (#378)

OP OpenVibers committed 4 days ago · a1775b48e7 · 60 files, +3747 −95

* Report me-stats: the person's own numbers, public by choice (0.356.0)

* 0.362.0: on top of main (Your stats: report.me-stats@1 and report.me-stats-publish@1)

* Run CI on the release head

Changes

ddiff --git a/CHANGELOG.md b/CHANGELOG.md
iindex a6651413..3c5b7c2b 100644
---- a/CHANGELOG.md
++++ b/CHANGELOG.md
@@@ -1,5 +1,9 @@
# Changelog
++## 0.362.0 — 2026-11-09
++
++- Your stats: report.me-stats@1 and report.me-stats-publish@1
++
## 0.361.0 — 2026-11-09
- Reviewed glyph draft service
ddiff --git a/contracts/catalog.json b/contracts/catalog.json
iindex ac4a8d12..87d9d4b5 100644
---- a/contracts/catalog.json
++++ b/contracts/catalog.json
@@@ -10067,6 +10067,24 @@
"compatibility": "backward",
"status": "active"
},
++ {
++ "id": "report.me-stats",
++ "version": "1.0.0",
++ "owner": "report",
++ "schema": "report/me-stats.v1.json",
++ "visibility": "public",
++ "compatibility": "backward",
++ "status": "active"
++ },
++ {
++ "id": "report.me-stats-publish",
++ "version": "1.0.0",
++ "owner": "report",
++ "schema": "report/me-stats-publish.v1.json",
++ "visibility": "public",
++ "compatibility": "backward",
++ "status": "active"
++ },
{
"id": "chat.tts-speak-request",
"version": "1.0.0",
ddiff --git a/contracts/report/me-stats-publish.v1.json b/contracts/report/me-stats-publish.v1.json
nnew file mode 100644
iindex 00000000..c158c9f7
---- /dev/null
++++ b/contracts/report/me-stats-publish.v1.json
@@@ -0,0 +1,23 @@
++{
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/report/me-stats-publish.v1.json",
++ "title": "ReportMeStatsPublish",
++ "description": "report.me-stats-publish@1: the body of PUT /api/v1/me/stats/published, the person's per-section switch (the owner, 2026-11-09: 'you can make them public if you want, but private by default'). Every switch is named, so a request can never leave one to chance; the route answers the same report.me-stats@1 document, recomputed at that moment.",
++ "type": "object",
++ "required": ["published"],
++ "additionalProperties": false,
++ "properties": {
++ "published": {
++ "type": "object",
++ "required": ["sites", "activity", "made", "ai", "money"],
++ "additionalProperties": false,
++ "properties": {
++ "sites": { "type": "boolean" },
++ "activity": { "type": "boolean" },
++ "made": { "type": "boolean" },
++ "ai": { "type": "boolean" },
++ "money": { "type": "boolean" }
++ }
++ }
++ }
++}
ddiff --git a/contracts/report/me-stats.v1.json b/contracts/report/me-stats.v1.json
nnew file mode 100644
iindex 00000000..de1927d2
---- /dev/null
++++ b/contracts/report/me-stats.v1.json
@@@ -0,0 +1,181 @@
++{
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/report/me-stats.v1.json",
++ "title": "ReportMeStats",
++ "description": "report.me-stats@1: one person's numbers across OpenVibe, on OpenVibe.Report (the owner, 2026-11-09: 'a section for most used, your most used platforms across all of them, with OpenVibe.Report analysis for you… show your stats… you can make them public if you want, but private by default'). GET /api/v1/me/stats answers the person their session names, with every section; GET /api/v1/u/:name/stats answers only the sections they published, and never a section they did not. A section a source did not answer for is absent, never an invented zero. The document is the same on both routes so the menu, the page and the public page read one shape.",
++ "type": "object",
++ "required": ["generated_at", "person", "window", "published", "sections"],
++ "additionalProperties": false,
++ "properties": {
++ "generated_at": {
++ "type": "string",
++ "format": "date-time",
++ "description": "When the snapshot was counted. A public answer may be older than the request: it is the owner's last computed snapshot, so the page says when."
++ },
++ "person": { "$ref": "#/$defs/person" },
++ "window": {
++ "type": "object",
++ "description": "The window the counts were taken over. days is 7, 30 or 90; from and to are UTC calendar days.",
++ "required": ["days", "from", "to"],
++ "additionalProperties": false,
++ "properties": {
++ "days": { "type": "integer", "enum": [7, 30, 90] },
++ "from": { "type": "string", "format": "date" },
++ "to": { "type": "string", "format": "date" }
++ }
++ },
++ "published": {
++ "type": "object",
++ "description": "Which sections the person made public. All false is the default: their /u/<name> page then shows none of their numbers.",
++ "required": ["sites", "activity", "made", "ai", "money"],
++ "additionalProperties": false,
++ "properties": {
++ "sites": { "type": "boolean" },
++ "activity": { "type": "boolean" },
++ "made": { "type": "boolean" },
++ "ai": { "type": "boolean" },
++ "money": { "type": "boolean" }
++ }
++ },
++ "sections": {
++ "type": "object",
++ "description": "The counts, one key per publishable section. On GET /api/v1/me/stats every section a source answered for is here; on GET /api/v1/u/:name/stats only the published ones are.",
++ "additionalProperties": false,
++ "properties": {
++ "sites": { "$ref": "#/$defs/sites" },
++ "activity": { "$ref": "#/$defs/activity" },
++ "made": { "$ref": "#/$defs/made" },
++ "ai": { "$ref": "#/$defs/ai" },
++ "money": { "$ref": "#/$defs/money" }
++ }
++ },
++ "note": {
++ "type": "string",
++ "maxLength": 500,
++ "description": "One plain line about what is not in the counts, when a source could not answer. Never a count and never a claim that a number is zero."
++ }
++ },
++ "$defs": {
++ "person": {
++ "type": "object",
++ "required": ["username", "display_name"],
++ "additionalProperties": false,
++ "properties": {
++ "username": { "type": "string", "maxLength": 32, "pattern": "^[A-Za-z0-9_]{1,32}$" },
++ "display_name": { "type": "string", "maxLength": 80 },
++ "avatar_url": { "type": "string", "format": "uri", "maxLength": 2048 }
++ }
++ },
++ "site": {
++ "type": "object",
++ "description": "One OpenVibe site the person used. visits is Network's own cross-site history count: a page is one visit, and the same page within ten minutes is the same visit. It is not a duration, and the contract has no minutes field until a source counts them.",
++ "required": ["service", "label", "url", "visits"],
++ "additionalProperties": false,
++ "properties": {
++ "service": { "type": "string", "maxLength": 32, "description": "The site id from Network's history, e.g. live, community, chat." },
++ "label": { "type": "string", "maxLength": 60 },
++ "url": { "type": "string", "format": "uri", "maxLength": 2048, "description": "A page on the site, so the menu can draw the site's app icon." },
++ "icon": { "type": "string", "maxLength": 40, "description": "The site's icon id when Network's history names one." },
++ "visits": { "type": "integer", "minimum": 1 }
++ }
++ },
++ "sites": {
++ "type": "object",
++ "required": ["week", "month", "top"],
++ "additionalProperties": false,
++ "properties": {
++ "week": { "type": "array", "maxItems": 32, "items": { "$ref": "#/$defs/site" }, "description": "This week's sites, most visited first." },
++ "month": { "type": "array", "maxItems": 32, "items": { "$ref": "#/$defs/site" }, "description": "This month's sites, most visited first." },
++ "top": { "type": "array", "maxItems": 8, "items": { "$ref": "#/$defs/site" }, "description": "The eight most visited this month: what the menu's Most used row draws." }
++ }
++ },
++ "activity": {
++ "type": "object",
++ "description": "What the person touched, as days. A day with no history row is 0 because Network answered with its history: an unavailable history is an absent section.",
++ "required": ["weeks", "active_days", "streak_days"],
++ "additionalProperties": false,
++ "properties": {
++ "weeks": {
++ "type": "array",
++ "maxItems": 12,
++ "description": "Twelve weeks, oldest first; each week starts on its Monday (UTC).",
++ "items": {
++ "type": "object",
++ "required": ["week_start", "days"],
++ "additionalProperties": false,
++ "properties": {
++ "week_start": { "type": "string", "format": "date" },
++ "days": {
++ "type": "array",
++ "minItems": 7,
++ "maxItems": 7,
++ "items": { "type": "integer", "minimum": 0 }
++ }
++ }
++ }
++ },
++ "active_days": { "type": "integer", "minimum": 0, "description": "Days in the window with at least one visit." },
++ "streak_days": { "type": "integer", "minimum": 0, "description": "Consecutive days with a visit, ending today (UTC), counted from the history." }
++ }
++ },
++ "made": {
++ "type": "object",
++ "description": "Things the person made, one row per thing a source answered for. A thing with no source is absent, never 0.",
++ "required": ["items"],
++ "additionalProperties": false,
++ "properties": {
++ "items": {
++ "type": "array",
++ "maxItems": 20,
++ "items": {
++ "type": "object",
++ "required": ["key", "label", "count", "unit"],
++ "additionalProperties": false,
++ "properties": {
++ "key": { "type": "string", "maxLength": 40 },
++ "label": { "type": "string", "maxLength": 60 },
++ "count": { "type": "number", "minimum": 0 },
++ "unit": { "type": "string", "maxLength": 30 },
++ "href": { "type": "string", "format": "uri", "maxLength": 2048 }
++ }
++ }
++ }
++ }
++ },
++ "ai": {
++ "type": "object",
++ "description": "The person's own AI calls, from Report's AI meter (report.ai-usage-me-result@2's totals). Report quotes the meter; it never derives a price.",
++ "required": ["calls", "tokens", "cost_usd"],
++ "additionalProperties": false,
++ "properties": {
++ "calls": { "type": "integer", "minimum": 0 },
++ "tokens": { "type": "integer", "minimum": 0, "description": "Input and output tokens added, as the meter counts them." },
++ "cost_usd": { "type": "number", "minimum": 0 },
++ "daily": {
++ "type": "array",
++ "maxItems": 90,
++ "items": {
++ "type": "object",
++ "required": ["day", "calls"],
++ "additionalProperties": false,
++ "properties": {
++ "day": { "type": "string", "format": "date" },
++ "calls": { "type": "integer", "minimum": 0 }
++ }
++ }
++ }
++ }
++ },
++ "money": {
++ "type": "object",
++ "description": "Vibes that reached the person, as OpenVibe.Billing answered them. Report stores no money and derives no amount.",
++ "required": ["currency", "settled_bits", "transactions"],
++ "additionalProperties": false,
++ "properties": {
++ "currency": { "type": "string", "const": "vibes-bits" },
++ "settled_bits": { "type": "integer", "minimum": 0 },
++ "transactions": { "type": "integer", "minimum": 0 }
++ }
++ }
++ }
++}
ddiff --git a/fixtures/report.me-stats-publish/invalid/missing-ai.json b/fixtures/report.me-stats-publish/invalid/missing-ai.json
nnew file mode 100644
iindex 00000000..a64bd589
---- /dev/null
++++ b/fixtures/report.me-stats-publish/invalid/missing-ai.json
@@@ -0,0 +1,3 @@
++{
++ "published": { "sites": true, "activity": true, "made": true, "money": false }
++}
ddiff --git a/fixtures/report.me-stats-publish/valid/all.json b/fixtures/report.me-stats-publish/valid/all.json
nnew file mode 100644
iindex 00000000..4c7eb8d2
---- /dev/null
++++ b/fixtures/report.me-stats-publish/valid/all.json
@@@ -0,0 +1,3 @@
++{
++ "published": { "sites": true, "activity": false, "made": true, "ai": false, "money": false }
++}
ddiff --git a/fixtures/report.me-stats/invalid/no-money-switch.json b/fixtures/report.me-stats/invalid/no-money-switch.json
nnew file mode 100644
iindex 00000000..70c47d58
---- /dev/null
++++ b/fixtures/report.me-stats/invalid/no-money-switch.json
@@@ -0,0 +1,7 @@
++{
++ "generated_at": "2026-11-09T12:00:00.000Z",
++ "person": { "username": "goosely", "display_name": "Goosely" },
++ "window": { "days": 30, "from": "2026-10-11", "to": "2026-11-09" },
++ "published": { "sites": true, "activity": true, "made": true, "ai": false },
++ "sections": {}
++}
ddiff --git a/fixtures/report.me-stats/invalid/zero-visits.json b/fixtures/report.me-stats/invalid/zero-visits.json
nnew file mode 100644
iindex 00000000..8136fa4e
---- /dev/null
++++ b/fixtures/report.me-stats/invalid/zero-visits.json
@@@ -0,0 +1,13 @@
++{
++ "generated_at": "2026-11-09T12:00:00.000Z",
++ "person": { "username": "goosely", "display_name": "Goosely" },
++ "window": { "days": 30, "from": "2026-10-11", "to": "2026-11-09" },
++ "published": { "sites": true, "activity": true, "made": true, "ai": true, "money": true },
++ "sections": {
++ "sites": {
++ "week": [],
++ "month": [],
++ "top": [{ "service": "live", "label": "Live", "url": "https://openvibe.live/", "visits": 0 }]
++ }
++ }
++}
ddiff --git a/fixtures/report.me-stats/valid/full.json b/fixtures/report.me-stats/valid/full.json
nnew file mode 100644
iindex 00000000..f789af33
---- /dev/null
++++ b/fixtures/report.me-stats/valid/full.json
@@@ -0,0 +1,53 @@
++{
++ "generated_at": "2026-11-09T12:00:00.000Z",
++ "person": {
++ "username": "goosely",
++ "display_name": "Goosely",
++ "avatar_url": "https://openvibe.network/avatar/goosely?s=160"
++ },
++ "window": { "days": 30, "from": "2026-10-11", "to": "2026-11-09" },
++ "published": { "sites": true, "activity": true, "made": true, "ai": false, "money": false },
++ "sections": {
++ "sites": {
++ "week": [
++ { "service": "live", "label": "Live", "url": "https://openvibe.live/", "icon": "live", "visits": 9 },
++ { "service": "community", "label": "Community", "url": "https://openvibe.community/", "icon": "community", "visits": 4 }
++ ],
++ "month": [
++ { "service": "live", "label": "Live", "url": "https://openvibe.live/", "icon": "live", "visits": 31 },
++ { "service": "community", "label": "Community", "url": "https://openvibe.community/", "icon": "community", "visits": 17 },
++ { "service": "chat", "label": "Chat", "url": "https://openvibe.chat/", "icon": "chat", "visits": 12 }
++ ],
++ "top": [
++ { "service": "live", "label": "Live", "url": "https://openvibe.live/", "icon": "live", "visits": 31 },
++ { "service": "community", "label": "Community", "url": "https://openvibe.community/", "icon": "community", "visits": 17 },
++ { "service": "chat", "label": "Chat", "url": "https://openvibe.chat/", "icon": "chat", "visits": 12 }
++ ]
++ },
++ "activity": {
++ "weeks": [
++ { "week_start": "2026-10-26", "days": [3, 0, 1, 4, 2, 0, 0] },
++ { "week_start": "2026-11-02", "days": [1, 2, 0, 5, 0, 3, 1] }
++ ],
++ "active_days": 9,
++ "streak_days": 2
++ },
++ "made": {
++ "items": [
++ { "key": "streams", "label": "Streams", "count": 3, "unit": "streams", "href": "https://openvibe.live/@goosely" },
++ { "key": "stream_hours", "label": "Hours streamed", "count": 4.5, "unit": "hours" },
++ { "key": "agent_reports", "label": "Agent reports", "count": 2, "unit": "reports", "href": "https://openvibe.report/you" }
++ ]
++ },
++ "ai": {
++ "calls": 21,
++ "tokens": 48000,
++ "cost_usd": 0.42,
++ "daily": [
++ { "day": "2026-11-08", "calls": 12 },
++ { "day": "2026-11-09", "calls": 9 }
++ ]
++ },
++ "money": { "currency": "vibes-bits", "settled_bits": 1200, "transactions": 2 }
++ }
++}
ddiff --git a/fixtures/report.me-stats/valid/private.json b/fixtures/report.me-stats/valid/private.json
nnew file mode 100644
iindex 00000000..1562fee2
---- /dev/null
++++ b/fixtures/report.me-stats/valid/private.json
@@@ -0,0 +1,7 @@
++{
++ "generated_at": "2026-11-09T12:00:00.000Z",
++ "person": { "username": "quiet", "display_name": "Quiet" },
++ "window": { "days": 7, "from": "2026-11-03", "to": "2026-11-09" },
++ "published": { "sites": false, "activity": false, "made": false, "ai": false, "money": false },
++ "sections": {}
++}
ddiff --git a/generated/json-schema/bundle.json b/generated/json-schema/bundle.json
iindex 8ee46bb5..369dc2c0 100644
---- a/generated/json-schema/bundle.json
++++ b/generated/json-schema/bundle.json
@@@ -110114,6 +110114,432 @@
}
}
},
++ "report.me-stats": {
++ "version": "1.0.0",
++ "owner": "report",
++ "status": "active",
++ "schema": {
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/report/me-stats.v1.json",
++ "title": "ReportMeStats",
++ "description": "report.me-stats@1: one person's numbers across OpenVibe, on OpenVibe.Report (the owner, 2026-11-09: 'a section for most used, your most used platforms across all of them, with OpenVibe.Report analysis for you… show your stats… you can make them public if you want, but private by default'). GET /api/v1/me/stats answers the person their session names, with every section; GET /api/v1/u/:name/stats answers only the sections they published, and never a section they did not. A section a source did not answer for is absent, never an invented zero. The document is the same on both routes so the menu, the page and the public page read one shape.",
++ "type": "object",
++ "required": [
++ "generated_at",
++ "person",
++ "window",
++ "published",
++ "sections"
++ ],
++ "additionalProperties": false,
++ "properties": {
++ "generated_at": {
++ "type": "string",
++ "format": "date-time",
++ "description": "When the snapshot was counted. A public answer may be older than the request: it is the owner's last computed snapshot, so the page says when."
++ },
++ "person": {
++ "$ref": "#/$defs/person"
++ },
++ "window": {
++ "type": "object",
++ "description": "The window the counts were taken over. days is 7, 30 or 90; from and to are UTC calendar days.",
++ "required": [
++ "days",
++ "from",
++ "to"
++ ],
++ "additionalProperties": false,
++ "properties": {
++ "days": {
++ "type": "integer",
++ "enum": [
++ 7,
++ 30,
++ 90
++ ]
++ },
++ "from": {
++ "type": "string",
++ "format": "date"
++ },
++ "to": {
++ "type": "string",
++ "format": "date"
++ }
++ }
++ },
++ "published": {
++ "type": "object",
++ "description": "Which sections the person made public. All false is the default: their /u/<name> page then shows none of their numbers.",
++ "required": [
++ "sites",
++ "activity",
++ "made",
++ "ai",
++ "money"
++ ],
++ "additionalProperties": false,
++ "properties": {
++ "sites": {
++ "type": "boolean"
++ },
++ "activity": {
++ "type": "boolean"
++ },
++ "made": {
++ "type": "boolean"
++ },
++ "ai": {
++ "type": "boolean"
++ },
++ "money": {
++ "type": "boolean"
++ }
++ }
++ },
++ "sections": {
++ "type": "object",
++ "description": "The counts, one key per publishable section. On GET /api/v1/me/stats every section a source answered for is here; on GET /api/v1/u/:name/stats only the published ones are.",
++ "additionalProperties": false,
++ "properties": {
++ "sites": {
++ "$ref": "#/$defs/sites"
++ },
++ "activity": {
++ "$ref": "#/$defs/activity"
++ },
++ "made": {
++ "$ref": "#/$defs/made"
++ },
++ "ai": {
++ "$ref": "#/$defs/ai"
++ },
++ "money": {
++ "$ref": "#/$defs/money"
++ }
++ }
++ },
++ "note": {
++ "type": "string",
++ "maxLength": 500,
++ "description": "One plain line about what is not in the counts, when a source could not answer. Never a count and never a claim that a number is zero."
++ }
++ },
++ "$defs": {
++ "person": {
++ "type": "object",
++ "required": [
++ "username",
++ "display_name"
++ ],
++ "additionalProperties": false,
++ "properties": {
++ "username": {
++ "type": "string",
++ "maxLength": 32,
++ "pattern": "^[A-Za-z0-9_]{1,32}$"
++ },
++ "display_name": {
++ "type": "string",
++ "maxLength": 80
++ },
++ "avatar_url": {
++ "type": "string",
++ "format": "uri",
++ "maxLength": 2048
++ }
++ }
++ },
++ "site": {
++ "type": "object",
++ "description": "One OpenVibe site the person used. visits is Network's own cross-site history count: a page is one visit, and the same page within ten minutes is the same visit. It is not a duration, and the contract has no minutes field until a source counts them.",
++ "required": [
++ "service",
++ "label",
++ "url",
++ "visits"
++ ],
++ "additionalProperties": false,
++ "properties": {
++ "service": {
++ "type": "string",
++ "maxLength": 32,
++ "description": "The site id from Network's history, e.g. live, community, chat."
++ },
++ "label": {
++ "type": "string",
++ "maxLength": 60
++ },
++ "url": {
++ "type": "string",
++ "format": "uri",
++ "maxLength": 2048,
++ "description": "A page on the site, so the menu can draw the site's app icon."
++ },
++ "icon": {
++ "type": "string",
++ "maxLength": 40,
++ "description": "The site's icon id when Network's history names one."
++ },
++ "visits": {
++ "type": "integer",
++ "minimum": 1
++ }
++ }
++ },
++ "sites": {
++ "type": "object",
++ "required": [
++ "week",
++ "month",
++ "top"
++ ],
++ "additionalProperties": false,
++ "properties": {
++ "week": {
++ "type": "array",
++ "maxItems": 32,
++ "items": {
++ "$ref": "#/$defs/site"
++ },
++ "description": "This week's sites, most visited first."
++ },
++ "month": {
++ "type": "array",
++ "maxItems": 32,
++ "items": {
++ "$ref": "#/$defs/site"
++ },
++ "description": "This month's sites, most visited first."
++ },
++ "top": {
++ "type": "array",
++ "maxItems": 8,
++ "items": {
++ "$ref": "#/$defs/site"
++ },
++ "description": "The eight most visited this month: what the menu's Most used row draws."
++ }
++ }
++ },
++ "activity": {
++ "type": "object",
++ "description": "What the person touched, as days. A day with no history row is 0 because Network answered with its history: an unavailable history is an absent section.",
++ "required": [
++ "weeks",
++ "active_days",
++ "streak_days"
++ ],
++ "additionalProperties": false,
++ "properties": {
++ "weeks": {
++ "type": "array",
++ "maxItems": 12,
++ "description": "Twelve weeks, oldest first; each week starts on its Monday (UTC).",
++ "items": {
++ "type": "object",
++ "required": [
++ "week_start",
++ "days"
++ ],
++ "additionalProperties": false,
++ "properties": {
++ "week_start": {
++ "type": "string",
++ "format": "date"
++ },
++ "days": {
++ "type": "array",
++ "minItems": 7,
++ "maxItems": 7,
++ "items": {
++ "type": "integer",
++ "minimum": 0
++ }
++ }
++ }
++ }
++ },
++ "active_days": {
++ "type": "integer",
++ "minimum": 0,
++ "description": "Days in the window with at least one visit."
++ },
++ "streak_days": {
++ "type": "integer",
++ "minimum": 0,
++ "description": "Consecutive days with a visit, ending today (UTC), counted from the history."
++ }
++ }
++ },
++ "made": {
++ "type": "object",
++ "description": "Things the person made, one row per thing a source answered for. A thing with no source is absent, never 0.",
++ "required": [
++ "items"
++ ],
++ "additionalProperties": false,
++ "properties": {
++ "items": {
++ "type": "array",
++ "maxItems": 20,
++ "items": {
++ "type": "object",
++ "required": [
++ "key",
++ "label",
++ "count",
++ "unit"
++ ],
++ "additionalProperties": false,
++ "properties": {
++ "key": {
++ "type": "string",
++ "maxLength": 40
++ },
++ "label": {
++ "type": "string",
++ "maxLength": 60
++ },
++ "count": {
++ "type": "number",
++ "minimum": 0
++ },
++ "unit": {
++ "type": "string",
++ "maxLength": 30
++ },
++ "href": {
++ "type": "string",
++ "format": "uri",
++ "maxLength": 2048
++ }
++ }
++ }
++ }
++ }
++ },
++ "ai": {
++ "type": "object",
++ "description": "The person's own AI calls, from Report's AI meter (report.ai-usage-me-result@2's totals). Report quotes the meter; it never derives a price.",
++ "required": [
++ "calls",
++ "tokens",
++ "cost_usd"
++ ],
++ "additionalProperties": false,
++ "properties": {
++ "calls": {
++ "type": "integer",
++ "minimum": 0
++ },
++ "tokens": {
++ "type": "integer",
++ "minimum": 0,
++ "description": "Input and output tokens added, as the meter counts them."
++ },
++ "cost_usd": {
++ "type": "number",
++ "minimum": 0
++ },
++ "daily": {
++ "type": "array",
++ "maxItems": 90,
++ "items": {
++ "type": "object",
++ "required": [
++ "day",
++ "calls"
++ ],
++ "additionalProperties": false,
++ "properties": {
++ "day": {
++ "type": "string",
++ "format": "date"
++ },
++ "calls": {
++ "type": "integer",
++ "minimum": 0
++ }
++ }
++ }
++ }
++ }
++ },
++ "money": {
++ "type": "object",
++ "description": "Vibes that reached the person, as OpenVibe.Billing answered them. Report stores no money and derives no amount.",
++ "required": [
++ "currency",
++ "settled_bits",
++ "transactions"
++ ],
++ "additionalProperties": false,
++ "properties": {
++ "currency": {
++ "type": "string",
++ "const": "vibes-bits"
++ },
++ "settled_bits": {
++ "type": "integer",
++ "minimum": 0
++ },
++ "transactions": {
++ "type": "integer",
++ "minimum": 0
++ }
++ }
++ }
++ }
++ }
++ },
++ "report.me-stats-publish": {
++ "version": "1.0.0",
++ "owner": "report",
++ "status": "active",
++ "schema": {
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/report/me-stats-publish.v1.json",
++ "title": "ReportMeStatsPublish",
++ "description": "report.me-stats-publish@1: the body of PUT /api/v1/me/stats/published, the person's per-section switch (the owner, 2026-11-09: 'you can make them public if you want, but private by default'). Every switch is named, so a request can never leave one to chance; the route answers the same report.me-stats@1 document, recomputed at that moment.",
++ "type": "object",
++ "required": [
++ "published"
++ ],
++ "additionalProperties": false,
++ "properties": {
++ "published": {
++ "type": "object",
++ "required": [
++ "sites",
++ "activity",
++ "made",
++ "ai",
++ "money"
++ ],
++ "additionalProperties": false,
++ "properties": {
++ "sites": {
++ "type": "boolean"
++ },
++ "activity": {
++ "type": "boolean"
++ },
++ "made": {
++ "type": "boolean"
++ },
++ "ai": {
++ "type": "boolean"
++ },
++ "money": {
++ "type": "boolean"
++ }
++ }
++ }
++ }
++ }
++ },
"chat.tts-speak-request": {
"version": "1.0.0",
"owner": "chat",
ddiff --git a/generated/openapi/actor.json b/generated/openapi/actor.json
iindex c61d3043..def8ed68 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.361.0",
-- "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.361.0): each operation lists the capabilities it performs; a token for 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.362.0",
++ "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.362.0): each operation lists the capabilities it performs; a token for 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 b26f06f6..b88f09f4 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.361.0",
-- "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.361.0): each operation lists the capabilities it performs; a token for 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.362.0",
++ "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.362.0): each operation lists the capabilities it performs; a token for 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 ad8dbac5..6e7d03cc 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.361.0",
-- "description": "Routes of OpenVibe.Bench as the OpenVibe contracts describe them (openvibe-contracts 0.361.0): each operation lists the capabilities it performs; a token for 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.362.0",
++ "description": "Routes of OpenVibe.Bench as the OpenVibe contracts describe them (openvibe-contracts 0.362.0): each operation lists the capabilities it performs; a token for 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 fcb4e0c6..05d9a61f 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.361.0",
-- "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.361.0): each operation lists the capabilities it performs; a token for 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.362.0",
++ "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.362.0): each operation lists the capabilities it performs; a token for 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 a86c1683..01c64863 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.361.0",
-- "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.361.0): each operation lists the capabilities it performs; a token for 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.362.0",
++ "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.362.0): each operation lists the capabilities it performs; a token for 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 63337dee..7d471789 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.361.0",
-- "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.361.0): each operation lists the capabilities it performs; a token for 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.362.0",
++ "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.362.0): each operation lists the capabilities it performs; a token for 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 2773e660..97ea597e 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.361.0",
-- "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.361.0): each operation lists the capabilities it performs; a token for 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.362.0",
++ "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.362.0): each operation lists the capabilities it performs; a token for 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 52e82a24..52fe912b 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.361.0",
-- "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.361.0): each operation lists the capabilities it performs; a token for 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.362.0",
++ "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.362.0): each operation lists the capabilities it performs; a token for 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 2f0d2cb9..bc1db2b9 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.361.0",
-- "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.361.0): each operation lists the capabilities it performs; a token for 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.362.0",
++ "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.362.0): each operation lists the capabilities it performs; a token for 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 2de864c3..5cbfed3a 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.361.0",
-- "description": "Routes of OpenVibe Connect as the OpenVibe contracts describe them (openvibe-contracts 0.361.0): each operation lists the capabilities it performs; a token for 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.362.0",
++ "description": "Routes of OpenVibe Connect as the OpenVibe contracts describe them (openvibe-contracts 0.362.0): each operation lists the capabilities it performs; a token for 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 58d1d12c..04ee791e 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.361.0",
-- "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.361.0): each operation lists the capabilities it performs; a token for 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.362.0",
++ "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.362.0): each operation lists the capabilities it performs; a token for 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 6af919cd..c7443db6 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.361.0",
-- "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.361.0): each operation lists the capabilities it performs; a token for 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.362.0",
++ "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.362.0): each operation lists the capabilities it performs; a token for 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 631a6ccf..62687da2 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.361.0",
-- "description": "Routes of OpenVibe.Design as the OpenVibe contracts describe them (openvibe-contracts 0.361.0): each operation lists the capabilities it performs; a token for 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.362.0",
++ "description": "Routes of OpenVibe.Design as the OpenVibe contracts describe them (openvibe-contracts 0.362.0): each operation lists the capabilities it performs; a token for 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 08067899..4fb8e3ca 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.361.0",
-- "description": "Routes of OpenVibe.Domains as the OpenVibe contracts describe them (openvibe-contracts 0.361.0): each operation lists the capabilities it performs; a token for 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.362.0",
++ "description": "Routes of OpenVibe.Domains as the OpenVibe contracts describe them (openvibe-contracts 0.362.0): each operation lists the capabilities it performs; a token for 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 07e6b082..6a41a99e 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.361.0",
-- "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.361.0): each operation lists the capabilities it performs; a token for 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.362.0",
++ "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.362.0): each operation lists the capabilities it performs; a token for 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 500af4eb..7c8f02ac 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.361.0",
-- "description": "Routes of OpenVibe.Exchange as the OpenVibe contracts describe them (openvibe-contracts 0.361.0): each operation lists the capabilities it performs; a token for 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.362.0",
++ "description": "Routes of OpenVibe.Exchange as the OpenVibe contracts describe them (openvibe-contracts 0.362.0): each operation lists the capabilities it performs; a token for 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 4fe72e1c..538a8593 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.361.0",
-- "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.361.0): each operation lists the capabilities it performs; a token for 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.362.0",
++ "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.362.0): each operation lists the capabilities it performs; a token for 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 17682e5d..686980bb 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.361.0",
-- "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.361.0): each operation lists the capabilities it performs; a token for 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.362.0",
++ "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.362.0): each operation lists the capabilities it performs; a token for 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 0a4e3d95..808521e3 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.361.0",
-- "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.361.0): each operation lists the capabilities it performs; a token for 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.362.0",
++ "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.362.0): each operation lists the capabilities it performs; a token for 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 3b305da5..032dbe65 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.361.0",
-- "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.361.0): each operation lists the capabilities it performs; a token for 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.362.0",
++ "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.362.0): each operation lists the capabilities it performs; a token for 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 62a89e8f..e3f19f3f 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.361.0",
-- "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.361.0): each operation lists the capabilities it performs; a token for 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.362.0",
++ "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.362.0): each operation lists the capabilities it performs; a token for 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 679967b0..f37555cd 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.361.0",
-- "description": "Routes of OpenVibe.Mail as the OpenVibe contracts describe them (openvibe-contracts 0.361.0): each operation lists the capabilities it performs; a token for 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.362.0",
++ "description": "Routes of OpenVibe.Mail as the OpenVibe contracts describe them (openvibe-contracts 0.362.0): each operation lists the capabilities it performs; a token for 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 8ffed7e4..6d35ee78 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.361.0",
-- "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.361.0): each operation lists the capabilities it performs; a token for 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.362.0",
++ "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.362.0): each operation lists the capabilities it performs; a token for 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 68f0b4bd..329717c4 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.361.0",
-- "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.361.0): each operation lists the capabilities it performs; a token for 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.362.0",
++ "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.362.0): each operation lists the capabilities it performs; a token for 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 2d678655..a19106e0 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.361.0",
-- "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.361.0): each operation lists the capabilities it performs; a token for 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.362.0",
++ "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.362.0): each operation lists the capabilities it performs; a token for 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 7dd90011..cb5f014f 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.361.0",
-- "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.361.0): each operation lists the capabilities it performs; a token for 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.362.0",
++ "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.362.0): each operation lists the capabilities it performs; a token for 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 6ecc4875..abdc0e2a 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.361.0",
-- "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.361.0): each operation lists the capabilities it performs; a token for 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.362.0",
++ "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.362.0): each operation lists the capabilities it performs; a token for 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 4ba4fd4d..88d94921 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.361.0",
-- "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.361.0): each operation lists the capabilities it performs; a token for 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.362.0",
++ "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.362.0): each operation lists the capabilities it performs; a token for 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 64bae571..3b1f9c5b 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.361.0",
-- "description": "Routes of OpenVibe.Quest as the OpenVibe contracts describe them (openvibe-contracts 0.361.0): each operation lists the capabilities it performs; a token for 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.362.0",
++ "description": "Routes of OpenVibe.Quest as the OpenVibe contracts describe them (openvibe-contracts 0.362.0): each operation lists the capabilities it performs; a token for 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 ccc02e51..e436c4cb 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.361.0",
-- "description": "Routes of OpenVibe.Report as the OpenVibe contracts describe them (openvibe-contracts 0.361.0): each operation lists the capabilities it performs; a token for 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.362.0",
++ "description": "Routes of OpenVibe.Report as the OpenVibe contracts describe them (openvibe-contracts 0.362.0): each operation lists the capabilities it performs; a token for 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 9b64404c..427f430a 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.361.0",
-- "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.361.0): each operation lists the capabilities it performs; a token for 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.362.0",
++ "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.362.0): each operation lists the capabilities it performs; a token for 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 7bf12353..0f2e5e77 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.361.0",
-- "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.361.0): each operation lists the capabilities it performs; a token for 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.362.0",
++ "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.362.0): each operation lists the capabilities it performs; a token for 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 84be09a9..e40ac1c4 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.361.0",
-- "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.361.0): each operation lists the capabilities it performs; a token for 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.362.0",
++ "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.362.0): each operation lists the capabilities it performs; a token for 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 a05811fc..3eaae3bb 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.361.0",
-- "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.361.0): each operation lists the capabilities it performs; a token for 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.362.0",
++ "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.362.0): each operation lists the capabilities it performs; a token for 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 15b145e4..fd8db9bf 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.361.0",
-- "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.361.0): each operation lists the capabilities it performs; a token for 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.362.0",
++ "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.362.0): each operation lists the capabilities it performs; a token for 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 359797b6..2dcdcc96 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.361.0",
-- "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.361.0): each operation lists the capabilities it performs; a token for 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.362.0",
++ "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.362.0): each operation lists the capabilities it performs; a token for 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 4f151923..a2bcbdc8 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.361.0",
-- "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.361.0): each operation lists the capabilities it performs; a token for 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.362.0",
++ "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.362.0): each operation lists the capabilities it performs; a token for 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 d0cf8feb..d3a361b3 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.361.0",
-- "description": "Routes of OpenVibe.Today as the OpenVibe contracts describe them (openvibe-contracts 0.361.0): each operation lists the capabilities it performs; a token for 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.362.0",
++ "description": "Routes of OpenVibe.Today as the OpenVibe contracts describe them (openvibe-contracts 0.362.0): each operation lists the capabilities it performs; a token for 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 fee754ce..14a945c4 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.361.0",
-- "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.361.0): each operation lists the capabilities it performs; a token for 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.362.0",
++ "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.362.0): each operation lists the capabilities it performs; a token for 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 bfa0ddd3..2c183d2d 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.361.0",
-- "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.361.0): each operation lists the capabilities it performs; a token for 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.362.0",
++ "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.362.0): each operation lists the capabilities it performs; a token for 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 d9aa7250..0519e668 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.361.0",
-- "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.361.0): each operation lists the capabilities it performs; a token for 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.362.0",
++ "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.362.0): each operation lists the capabilities it performs; a token for 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 08bd93c2..2c5b8bdf 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.361.0",
-- "description": "Routes of OpenVibe.Vision as the OpenVibe contracts describe them (openvibe-contracts 0.361.0): each operation lists the capabilities it performs; a token for 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.362.0",
++ "description": "Routes of OpenVibe.Vision as the OpenVibe contracts describe them (openvibe-contracts 0.362.0): each operation lists the capabilities it performs; a token for 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 79f46c00..89f72319 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.361.0",
-- "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.361.0): each operation lists the capabilities it performs; a token for 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.362.0",
++ "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.362.0): each operation lists the capabilities it performs; a token for 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 1fe9c5af..012c056e 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.361.0",
-- "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.361.0): each operation lists the capabilities it performs; a token for 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.362.0",
++ "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.362.0): each operation lists the capabilities it performs; a token for 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 fbde7695..ba4b23d0 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.361.0",
-- "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.361.0): each operation lists the capabilities it performs; a token for 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.362.0",
++ "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.362.0): each operation lists the capabilities it performs; a token for 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 75603a31..c3c078c9 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.361.0",
-- "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.361.0): each operation lists the capabilities it performs; a token for 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.362.0",
++ "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.362.0): each operation lists the capabilities it performs; a token for 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 7c702bc8..98148b5c 100644
---- a/generated/typescript/index.d.ts
++++ b/generated/typescript/index.d.ts
@@@ -299956,6 +299956,2920 @@ export interface ReportSessionWriteResult {
created: boolean;
}
++/** [email protected] (owner: report) */
++/**
++ * report.me-stats@1: one person's numbers across OpenVibe, on OpenVibe.Report (the owner, 2026-11-09: 'a section for most used, your most used platforms across all of them, with OpenVibe.Report analysis for you… show your stats… you can make them public if you want, but private by default'). GET /api/v1/me/stats answers the person their session names, with every section; GET /api/v1/u/:name/stats answers only the sections they published, and never a section they did not. A section a source did not answer for is absent, never an invented zero. The document is the same on both routes so the menu, the page and the public page read one shape.
++ */
++export interface ReportMeStats {
++ /**
++ * When the snapshot was counted. A public answer may be older than the request: it is the owner's last computed snapshot, so the page says when.
++ */
++ generated_at: string;
++ person: {
++ username: string;
++ display_name: string;
++ avatar_url?: string;
++ };
++ /**
++ * The window the counts were taken over. days is 7, 30 or 90; from and to are UTC calendar days.
++ */
++ window: {
++ days: 7 | 30 | 90;
++ from: string;
++ to: string;
++ };
++ /**
++ * Which sections the person made public. All false is the default: their /u/<name> page then shows none of their numbers.
++ */
++ published: {
++ sites: boolean;
++ activity: boolean;
++ made: boolean;
++ ai: boolean;
++ money: boolean;
++ };
++ /**
++ * The counts, one key per publishable section. On GET /api/v1/me/stats every section a source answered for is here; on GET /api/v1/u/:name/stats only the published ones are.
++ */
++ sections: {
++ sites?: {
++ /**
++ * This week's sites, most visited first.
++ *
++ * @maxItems 32
++ */
++ week: {
++ /**
++ * The site id from Network's history, e.g. live, community, chat.
++ */
++ service: string;
++ label: string;
++ /**
++ * A page on the site, so the menu can draw the site's app icon.
++ */
++ url: string;
++ /**
++ * The site's icon id when Network's history names one.
++ */
++ icon?: string;
++ visits: number;
++ }[];
++ /**
++ * This month's sites, most visited first.
++ *
++ * @maxItems 32
++ */
++ month: {
++ /**
++ * The site id from Network's history, e.g. live, community, chat.
++ */
++ service: string;
++ label: string;
++ /**
++ * A page on the site, so the menu can draw the site's app icon.
++ */
++ url: string;
++ /**
++ * The site's icon id when Network's history names one.
++ */
++ icon?: string;
++ visits: number;
++ }[];
++ /**
++ * The eight most visited this month: what the menu's Most used row draws.
++ *
++ * @maxItems 8
++ */
++ top:
++ | []
++ | [
++ {
++ /**
++ * The site id from Network's history, e.g. live, community, chat.
++ */
++ service: string;
++ label: string;
++ /**
++ * A page on the site, so the menu can draw the site's app icon.
++ */
++ url: string;
++ /**
++ * The site's icon id when Network's history names one.
++ */
++ icon?: string;
++ visits: number;
++ }
++ ]
++ | [
++ {
++ /**
++ * The site id from Network's history, e.g. live, community, chat.
++ */
++ service: string;
++ label: string;
++ /**
++ * A page on the site, so the menu can draw the site's app icon.
++ */
++ url: string;
++ /**
++ * The site's icon id when Network's history names one.
++ */
++ icon?: string;
++ visits: number;
++ },
++ {
++ /**
++ * The site id from Network's history, e.g. live, community, chat.
++ */
++ service: string;
++ label: string;
++ /**
++ * A page on the site, so the menu can draw the site's app icon.
++ */
++ url: string;
++ /**
++ * The site's icon id when Network's history names one.
++ */
++ icon?: string;
++ visits: number;
++ }
++ ]
++ | [
++ {
++ /**
++ * The site id from Network's history, e.g. live, community, chat.
++ */
++ service: string;
++ label: string;
++ /**
++ * A page on the site, so the menu can draw the site's app icon.
++ */
++ url: string;
++ /**
++ * The site's icon id when Network's history names one.
++ */
++ icon?: string;
++ visits: number;
++ },
++ {
++ /**
++ * The site id from Network's history, e.g. live, community, chat.
++ */
++ service: string;
++ label: string;
++ /**
++ * A page on the site, so the menu can draw the site's app icon.
++ */
++ url: string;
++ /**
++ * The site's icon id when Network's history names one.
++ */
++ icon?: string;
++ visits: number;
++ },
++ {
++ /**
++ * The site id from Network's history, e.g. live, community, chat.
++ */
++ service: string;
++ label: string;
++ /**
++ * A page on the site, so the menu can draw the site's app icon.
++ */
++ url: string;
++ /**
++ * The site's icon id when Network's history names one.
++ */
++ icon?: string;
++ visits: number;
++ }
++ ]
++ | [
++ {
++ /**
++ * The site id from Network's history, e.g. live, community, chat.
++ */
++ service: string;
++ label: string;
++ /**
++ * A page on the site, so the menu can draw the site's app icon.
++ */
++ url: string;
++ /**
++ * The site's icon id when Network's history names one.
++ */
++ icon?: string;
++ visits: number;
++ },
++ {
++ /**
++ * The site id from Network's history, e.g. live, community, chat.
++ */
++ service: string;
++ label: string;
++ /**
++ * A page on the site, so the menu can draw the site's app icon.
++ */
++ url: string;
++ /**
++ * The site's icon id when Network's history names one.
++ */
++ icon?: string;
++ visits: number;
++ },
++ {
++ /**
++ * The site id from Network's history, e.g. live, community, chat.
++ */
++ service: string;
++ label: string;
++ /**
++ * A page on the site, so the menu can draw the site's app icon.
++ */
++ url: string;
++ /**
++ * The site's icon id when Network's history names one.
++ */
++ icon?: string;
++ visits: number;
++ },
++ {
++ /**
++ * The site id from Network's history, e.g. live, community, chat.
++ */
++ service: string;
++ label: string;
++ /**
++ * A page on the site, so the menu can draw the site's app icon.
++ */
++ url: string;
++ /**
++ * The site's icon id when Network's history names one.
++ */
++ icon?: string;
++ visits: number;
++ }
++ ]
++ | [
++ {
++ /**
++ * The site id from Network's history, e.g. live, community, chat.
++ */
++ service: string;
++ label: string;
++ /**
++ * A page on the site, so the menu can draw the site's app icon.
++ */
++ url: string;
++ /**
++ * The site's icon id when Network's history names one.
++ */
++ icon?: string;
++ visits: number;
++ },
++ {
++ /**
++ * The site id from Network's history, e.g. live, community, chat.
++ */
++ service: string;
++ label: string;
++ /**
++ * A page on the site, so the menu can draw the site's app icon.
++ */
++ url: string;
++ /**
++ * The site's icon id when Network's history names one.
++ */
++ icon?: string;
++ visits: number;
++ },
++ {
++ /**
++ * The site id from Network's history, e.g. live, community, chat.
++ */
++ service: string;
++ label: string;
++ /**
++ * A page on the site, so the menu can draw the site's app icon.
++ */
++ url: string;
++ /**
++ * The site's icon id when Network's history names one.
++ */
++ icon?: string;
++ visits: number;
++ },
++ {
++ /**
++ * The site id from Network's history, e.g. live, community, chat.
++ */
++ service: string;
++ label: string;
++ /**
++ * A page on the site, so the menu can draw the site's app icon.
++ */
++ url: string;
++ /**
++ * The site's icon id when Network's history names one.
++ */
++ icon?: string;
++ visits: number;
++ },
++ {
++ /**
++ * The site id from Network's history, e.g. live, community, chat.
++ */
++ service: string;
++ label: string;
++ /**
++ * A page on the site, so the menu can draw the site's app icon.
++ */
++ url: string;
++ /**
++ * The site's icon id when Network's history names one.
++ */
++ icon?: string;
++ visits: number;
++ }
++ ]
++ | [
++ {
++ /**
++ * The site id from Network's history, e.g. live, community, chat.
++ */
++ service: string;
++ label: string;
++ /**
++ * A page on the site, so the menu can draw the site's app icon.
++ */
++ url: string;
++ /**
++ * The site's icon id when Network's history names one.
++ */
++ icon?: string;
++ visits: number;
++ },
++ {
++ /**
++ * The site id from Network's history, e.g. live, community, chat.
++ */
++ service: string;
++ label: string;
++ /**
++ * A page on the site, so the menu can draw the site's app icon.
++ */
++ url: string;
++ /**
++ * The site's icon id when Network's history names one.
++ */
++ icon?: string;
++ visits: number;
++ },
++ {
++ /**
++ * The site id from Network's history, e.g. live, community, chat.
++ */
++ service: string;
++ label: string;
++ /**
++ * A page on the site, so the menu can draw the site's app icon.
++ */
++ url: string;
++ /**
++ * The site's icon id when Network's history names one.
++ */
++ icon?: string;
++ visits: number;
++ },
++ {
++ /**
++ * The site id from Network's history, e.g. live, community, chat.
++ */
++ service: string;
++ label: string;
++ /**
++ * A page on the site, so the menu can draw the site's app icon.
++ */
++ url: string;
++ /**
++ * The site's icon id when Network's history names one.
++ */
++ icon?: string;
++ visits: number;
++ },
++ {
++ /**
++ * The site id from Network's history, e.g. live, community, chat.
++ */
++ service: string;
++ label: string;
++ /**
++ * A page on the site, so the menu can draw the site's app icon.
++ */
++ url: string;
++ /**
++ * The site's icon id when Network's history names one.
++ */
++ icon?: string;
++ visits: number;
++ },
++ {
++ /**
++ * The site id from Network's history, e.g. live, community, chat.
++ */
++ service: string;
++ label: string;
++ /**
++ * A page on the site, so the menu can draw the site's app icon.
++ */
++ url: string;
++ /**
++ * The site's icon id when Network's history names one.
++ */
++ icon?: string;
++ visits: number;
++ }
++ ]
++ | [
++ {
++ /**
++ * The site id from Network's history, e.g. live, community, chat.
++ */
++ service: string;
++ label: string;
++ /**
++ * A page on the site, so the menu can draw the site's app icon.
++ */
++ url: string;
++ /**
++ * The site's icon id when Network's history names one.
++ */
++ icon?: string;
++ visits: number;
++ },
++ {
++ /**
++ * The site id from Network's history, e.g. live, community, chat.
++ */
++ service: string;
++ label: string;
++ /**
++ * A page on the site, so the menu can draw the site's app icon.
++ */
++ url: string;
++ /**
++ * The site's icon id when Network's history names one.
++ */
++ icon?: string;
++ visits: number;
++ },
++ {
++ /**
++ * The site id from Network's history, e.g. live, community, chat.
++ */
++ service: string;
++ label: string;
++ /**
++ * A page on the site, so the menu can draw the site's app icon.
++ */
++ url: string;
++ /**
++ * The site's icon id when Network's history names one.
++ */
++ icon?: string;
++ visits: number;
++ },
++ {
++ /**
++ * The site id from Network's history, e.g. live, community, chat.
++ */
++ service: string;
++ label: string;
++ /**
++ * A page on the site, so the menu can draw the site's app icon.
++ */
++ url: string;
++ /**
++ * The site's icon id when Network's history names one.
++ */
++ icon?: string;
++ visits: number;
++ },
++ {
++ /**
++ * The site id from Network's history, e.g. live, community, chat.
++ */
++ service: string;
++ label: string;
++ /**
++ * A page on the site, so the menu can draw the site's app icon.
++ */
++ url: string;
++ /**
++ * The site's icon id when Network's history names one.
++ */
++ icon?: string;
++ visits: number;
++ },
++ {
++ /**
++ * The site id from Network's history, e.g. live, community, chat.
++ */
++ service: string;
++ label: string;
++ /**
++ * A page on the site, so the menu can draw the site's app icon.
++ */
++ url: string;
++ /**
++ * The site's icon id when Network's history names one.
++ */
++ icon?: string;
++ visits: number;
++ },
++ {
++ /**
++ * The site id from Network's history, e.g. live, community, chat.
++ */
++ service: string;
++ label: string;
++ /**
++ * A page on the site, so the menu can draw the site's app icon.
++ */
++ url: string;
++ /**
++ * The site's icon id when Network's history names one.
++ */
++ icon?: string;
++ visits: number;
++ }
++ ]
++ | [
++ {
++ /**
++ * The site id from Network's history, e.g. live, community, chat.
++ */
++ service: string;
++ label: string;
++ /**
++ * A page on the site, so the menu can draw the site's app icon.
++ */
++ url: string;
++ /**
++ * The site's icon id when Network's history names one.
++ */
++ icon?: string;
++ visits: number;
++ },
++ {
++ /**
++ * The site id from Network's history, e.g. live, community, chat.
++ */
++ service: string;
++ label: string;
++ /**
++ * A page on the site, so the menu can draw the site's app icon.
++ */
++ url: string;
++ /**
++ * The site's icon id when Network's history names one.
++ */
++ icon?: string;
++ visits: number;
++ },
++ {
++ /**
++ * The site id from Network's history, e.g. live, community, chat.
++ */
++ service: string;
++ label: string;
++ /**
++ * A page on the site, so the menu can draw the site's app icon.
++ */
++ url: string;
++ /**
++ * The site's icon id when Network's history names one.
++ */
++ icon?: string;
++ visits: number;
++ },
++ {
++ /**
++ * The site id from Network's history, e.g. live, community, chat.
++ */
++ service: string;
++ label: string;
++ /**
++ * A page on the site, so the menu can draw the site's app icon.
++ */
++ url: string;
++ /**
++ * The site's icon id when Network's history names one.
++ */
++ icon?: string;
++ visits: number;
++ },
++ {
++ /**
++ * The site id from Network's history, e.g. live, community, chat.
++ */
++ service: string;
++ label: string;
++ /**
++ * A page on the site, so the menu can draw the site's app icon.
++ */
++ url: string;
++ /**
++ * The site's icon id when Network's history names one.
++ */
++ icon?: string;
++ visits: number;
++ },
++ {
++ /**
++ * The site id from Network's history, e.g. live, community, chat.
++ */
++ service: string;
++ label: string;
++ /**
++ * A page on the site, so the menu can draw the site's app icon.
++ */
++ url: string;
++ /**
++ * The site's icon id when Network's history names one.
++ */
++ icon?: string;
++ visits: number;
++ },
++ {
++ /**
++ * The site id from Network's history, e.g. live, community, chat.
++ */
++ service: string;
++ label: string;
++ /**
++ * A page on the site, so the menu can draw the site's app icon.
++ */
++ url: string;
++ /**
++ * The site's icon id when Network's history names one.
++ */
++ icon?: string;
++ visits: number;
++ },
++ {
++ /**
++ * The site id from Network's history, e.g. live, community, chat.
++ */
++ service: string;
++ label: string;
++ /**
++ * A page on the site, so the menu can draw the site's app icon.
++ */
++ url: string;
++ /**
++ * The site's icon id when Network's history names one.
++ */
++ icon?: string;
++ visits: number;
++ }
++ ];
++ };
++ /**
++ * What the person touched, as days. A day with no history row is 0 because Network answered with its history: an unavailable history is an absent section.
++ */
++ activity?: {
++ /**
++ * Twelve weeks, oldest first; each week starts on its Monday (UTC).
++ *
++ * @maxItems 12
++ */
++ weeks:
++ | []
++ | [
++ {
++ week_start: string;
++ /**
++ * @minItems 7
++ * @maxItems 7
++ */
++ days: [number, number, number, number, number, number, number];
++ }
++ ]
++ | [
++ {
++ week_start: string;
++ /**
++ * @minItems 7
++ * @maxItems 7
++ */
++ days: [number, number, number, number, number, number, number];
++ },
++ {
++ week_start: string;
++ /**
++ * @minItems 7
++ * @maxItems 7
++ */
++ days: [number, number, number, number, number, number, number];
++ }
++ ]
++ | [
++ {
++ week_start: string;
++ /**
++ * @minItems 7
++ * @maxItems 7
++ */
++ days: [number, number, number, number, number, number, number];
++ },
++ {
++ week_start: string;
++ /**
++ * @minItems 7
++ * @maxItems 7
++ */
++ days: [number, number, number, number, number, number, number];
++ },
++ {
++ week_start: string;
++ /**
++ * @minItems 7
++ * @maxItems 7
++ */
++ days: [number, number, number, number, number, number, number];
++ }
++ ]
++ | [
++ {
++ week_start: string;
++ /**
++ * @minItems 7
++ * @maxItems 7
++ */
++ days: [number, number, number, number, number, number, number];
++ },
++ {
++ week_start: string;
++ /**
++ * @minItems 7
++ * @maxItems 7
++ */
++ days: [number, number, number, number, number, number, number];
++ },
++ {
++ week_start: string;
++ /**
++ * @minItems 7
++ * @maxItems 7
++ */
++ days: [number, number, number, number, number, number, number];
++ },
++ {
++ week_start: string;
++ /**
++ * @minItems 7
++ * @maxItems 7
++ */
++ days: [number, number, number, number, number, number, number];
++ }
++ ]
++ | [
++ {
++ week_start: string;
++ /**
++ * @minItems 7
++ * @maxItems 7
++ */
++ days: [number, number, number, number, number, number, number];
++ },
++ {
++ week_start: string;
++ /**
++ * @minItems 7
++ * @maxItems 7
++ */
++ days: [number, number, number, number, number, number, number];
++ },
++ {
++ week_start: string;
++ /**
++ * @minItems 7
++ * @maxItems 7
++ */
++ days: [number, number, number, number, number, number, number];
++ },
++ {
++ week_start: string;
++ /**
++ * @minItems 7
++ * @maxItems 7
++ */
++ days: [number, number, number, number, number, number, number];
++ },
++ {
++ week_start: string;
++ /**
++ * @minItems 7
++ * @maxItems 7
++ */
++ days: [number, number, number, number, number, number, number];
++ }
++ ]
++ | [
++ {
++ week_start: string;
++ /**
++ * @minItems 7
++ * @maxItems 7
++ */
++ days: [number, number, number, number, number, number, number];
++ },
++ {
++ week_start: string;
++ /**
++ * @minItems 7
++ * @maxItems 7
++ */
++ days: [number, number, number, number, number, number, number];
++ },
++ {
++ week_start: string;
++ /**
++ * @minItems 7
++ * @maxItems 7
++ */
++ days: [number, number, number, number, number, number, number];
++ },
++ {
++ week_start: string;
++ /**
++ * @minItems 7
++ * @maxItems 7
++ */
++ days: [number, number, number, number, number, number, number];
++ },
++ {
++ week_start: string;
++ /**
++ * @minItems 7
++ * @maxItems 7
++ */
++ days: [number, number, number, number, number, number, number];
++ },
++ {
++ week_start: string;
++ /**
++ * @minItems 7
++ * @maxItems 7
++ */
++ days: [number, number, number, number, number, number, number];
++ }
++ ]
++ | [
++ {
++ week_start: string;
++ /**
++ * @minItems 7
++ * @maxItems 7
++ */
++ days: [number, number, number, number, number, number, number];
++ },
++ {
++ week_start: string;
++ /**
++ * @minItems 7
++ * @maxItems 7
++ */
++ days: [number, number, number, number, number, number, number];
++ },
++ {
++ week_start: string;
++ /**
++ * @minItems 7
++ * @maxItems 7
++ */
++ days: [number, number, number, number, number, number, number];
++ },
++ {
++ week_start: string;
++ /**
++ * @minItems 7
++ * @maxItems 7
++ */
++ days: [number, number, number, number, number, number, number];
++ },
++ {
++ week_start: string;
++ /**
++ * @minItems 7
++ * @maxItems 7
++ */
++ days: [number, number, number, number, number, number, number];
++ },
++ {
++ week_start: string;
++ /**
++ * @minItems 7
++ * @maxItems 7
++ */
++ days: [number, number, number, number, number, number, number];
++ },
++ {
++ week_start: string;
++ /**
++ * @minItems 7
++ * @maxItems 7
++ */
++ days: [number, number, number, number, number, number, number];
++ }
++ ]
++ | [
++ {
++ week_start: string;
++ /**
++ * @minItems 7
++ * @maxItems 7
++ */
++ days: [number, number, number, number, number, number, number];
++ },
++ {
++ week_start: string;
++ /**
++ * @minItems 7
++ * @maxItems 7
++ */
++ days: [number, number, number, number, number, number, number];
++ },
++ {
++ week_start: string;
++ /**
++ * @minItems 7
++ * @maxItems 7
++ */
++ days: [number, number, number, number, number, number, number];
++ },
++ {
++ week_start: string;
++ /**
++ * @minItems 7
++ * @maxItems 7
++ */
++ days: [number, number, number, number, number, number, number];
++ },
++ {
++ week_start: string;
++ /**
++ * @minItems 7
++ * @maxItems 7
++ */
++ days: [number, number, number, number, number, number, number];
++ },
++ {
++ week_start: string;
++ /**
++ * @minItems 7
++ * @maxItems 7
++ */
++ days: [number, number, number, number, number, number, number];
++ },
++ {
++ week_start: string;
++ /**
++ * @minItems 7
++ * @maxItems 7
++ */
++ days: [number, number, number, number, number, number, number];
++ },
++ {
++ week_start: string;
++ /**
++ * @minItems 7
++ * @maxItems 7
++ */
++ days: [number, number, number, number, number, number, number];
++ }
++ ]
++ | [
++ {
++ week_start: string;
++ /**
++ * @minItems 7
++ * @maxItems 7
++ */
++ days: [number, number, number, number, number, number, number];
++ },
++ {
++ week_start: string;
++ /**
++ * @minItems 7
++ * @maxItems 7
++ */
++ days: [number, number, number, number, number, number, number];
++ },
++ {
++ week_start: string;
++ /**
++ * @minItems 7
++ * @maxItems 7
++ */
++ days: [number, number, number, number, number, number, number];
++ },
++ {
++ week_start: string;
++ /**
++ * @minItems 7
++ * @maxItems 7
++ */
++ days: [number, number, number, number, number, number, number];
++ },
++ {
++ week_start: string;
++ /**
++ * @minItems 7
++ * @maxItems 7
++ */
++ days: [number, number, number, number, number, number, number];
++ },
++ {
++ week_start: string;
++ /**
++ * @minItems 7
++ * @maxItems 7
++ */
++ days: [number, number, number, number, number, number, number];
++ },
++ {
++ week_start: string;
++ /**
++ * @minItems 7
++ * @maxItems 7
++ */
++ days: [number, number, number, number, number, number, number];
++ },
++ {
++ week_start: string;
++ /**
++ * @minItems 7
++ * @maxItems 7
++ */
++ days: [number, number, number, number, number, number, number];
++ },
++ {
++ week_start: string;
++ /**
++ * @minItems 7
++ * @maxItems 7
++ */
++ days: [number, number, number, number, number, number, number];
++ }
++ ]
++ | [
++ {
++ week_start: string;
++ /**
++ * @minItems 7
++ * @maxItems 7
++ */
++ days: [number, number, number, number, number, number, number];
++ },
++ {
++ week_start: string;
++ /**
++ * @minItems 7
++ * @maxItems 7
++ */
++ days: [number, number, number, number, number, number, number];
++ },
++ {
++ week_start: string;
++ /**
++ * @minItems 7
++ * @maxItems 7
++ */
++ days: [number, number, number, number, number, number, number];
++ },
++ {
++ week_start: string;
++ /**
++ * @minItems 7
++ * @maxItems 7
++ */
++ days: [number, number, number, number, number, number, number];
++ },
++ {
++ week_start: string;
++ /**
++ * @minItems 7
++ * @maxItems 7
++ */
++ days: [number, number, number, number, number, number, number];
++ },
++ {
++ week_start: string;
++ /**
++ * @minItems 7
++ * @maxItems 7
++ */
++ days: [number, number, number, number, number, number, number];
++ },
++ {
++ week_start: string;
++ /**
++ * @minItems 7
++ * @maxItems 7
++ */
++ days: [number, number, number, number, number, number, number];
++ },
++ {
++ week_start: string;
++ /**
++ * @minItems 7
++ * @maxItems 7
++ */
++ days: [number, number, number, number, number, number, number];
++ },
++ {
++ week_start: string;
++ /**
++ * @minItems 7
++ * @maxItems 7
++ */
++ days: [number, number, number, number, number, number, number];
++ },
++ {
++ week_start: string;
++ /**
++ * @minItems 7
++ * @maxItems 7
++ */
++ days: [number, number, number, number, number, number, number];
++ }
++ ]
++ | [
++ {
++ week_start: string;
++ /**
++ * @minItems 7
++ * @maxItems 7
++ */
++ days: [number, number, number, number, number, number, number];
++ },
++ {
++ week_start: string;
++ /**
++ * @minItems 7
++ * @maxItems 7
++ */
++ days: [number, number, number, number, number, number, number];
++ },
++ {
++ week_start: string;
++ /**
++ * @minItems 7
++ * @maxItems 7
++ */
++ days: [number, number, number, number, number, number, number];
++ },
++ {
++ week_start: string;
++ /**
++ * @minItems 7
++ * @maxItems 7
++ */
++ days: [number, number, number, number, number, number, number];
++ },
++ {
++ week_start: string;
++ /**
++ * @minItems 7
++ * @maxItems 7
++ */
++ days: [number, number, number, number, number, number, number];
++ },
++ {
++ week_start: string;
++ /**
++ * @minItems 7
++ * @maxItems 7
++ */
++ days: [number, number, number, number, number, number, number];
++ },
++ {
++ week_start: string;
++ /**
++ * @minItems 7
++ * @maxItems 7
++ */
++ days: [number, number, number, number, number, number, number];
++ },
++ {
++ week_start: string;
++ /**
++ * @minItems 7
++ * @maxItems 7
++ */
++ days: [number, number, number, number, number, number, number];
++ },
++ {
++ week_start: string;
++ /**
++ * @minItems 7
++ * @maxItems 7
++ */
++ days: [number, number, number, number, number, number, number];
++ },
++ {
++ week_start: string;
++ /**
++ * @minItems 7
++ * @maxItems 7
++ */
++ days: [number, number, number, number, number, number, number];
++ },
++ {
++ week_start: string;
++ /**
++ * @minItems 7
++ * @maxItems 7
++ */
++ days: [number, number, number, number, number, number, number];
++ }
++ ]
++ | [
++ {
++ week_start: string;
++ /**
++ * @minItems 7
++ * @maxItems 7
++ */
++ days: [number, number, number, number, number, number, number];
++ },
++ {
++ week_start: string;
++ /**
++ * @minItems 7
++ * @maxItems 7
++ */
++ days: [number, number, number, number, number, number, number];
++ },
++ {
++ week_start: string;
++ /**
++ * @minItems 7
++ * @maxItems 7
++ */
++ days: [number, number, number, number, number, number, number];
++ },
++ {
++ week_start: string;
++ /**
++ * @minItems 7
++ * @maxItems 7
++ */
++ days: [number, number, number, number, number, number, number];
++ },
++ {
++ week_start: string;
++ /**
++ * @minItems 7
++ * @maxItems 7
++ */
++ days: [number, number, number, number, number, number, number];
++ },
++ {
++ week_start: string;
++ /**
++ * @minItems 7
++ * @maxItems 7
++ */
++ days: [number, number, number, number, number, number, number];
++ },
++ {
++ week_start: string;
++ /**
++ * @minItems 7
++ * @maxItems 7
++ */
++ days: [number, number, number, number, number, number, number];
++ },
++ {
++ week_start: string;
++ /**
++ * @minItems 7
++ * @maxItems 7
++ */
++ days: [number, number, number, number, number, number, number];
++ },
++ {
++ week_start: string;
++ /**
++ * @minItems 7
++ * @maxItems 7
++ */
++ days: [number, number, number, number, number, number, number];
++ },
++ {
++ week_start: string;
++ /**
++ * @minItems 7
++ * @maxItems 7
++ */
++ days: [number, number, number, number, number, number, number];
++ },
++ {
++ week_start: string;
++ /**
++ * @minItems 7
++ * @maxItems 7
++ */
++ days: [number, number, number, number, number, number, number];
++ },
++ {
++ week_start: string;
++ /**
++ * @minItems 7
++ * @maxItems 7
++ */
++ days: [number, number, number, number, number, number, number];
++ }
++ ];
++ /**
++ * Days in the window with at least one visit.
++ */
++ active_days: number;
++ /**
++ * Consecutive days with a visit, ending today (UTC), counted from the history.
++ */
++ streak_days: number;
++ };
++ /**
++ * Things the person made, one row per thing a source answered for. A thing with no source is absent, never 0.
++ */
++ made?: {
++ /**
++ * @maxItems 20
++ */
++ items:
++ | []
++ | [
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ }
++ ]
++ | [
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ }
++ ]
++ | [
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ }
++ ]
++ | [
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ }
++ ]
++ | [
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ }
++ ]
++ | [
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ }
++ ]
++ | [
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ }
++ ]
++ | [
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ }
++ ]
++ | [
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ }
++ ]
++ | [
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ }
++ ]
++ | [
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ }
++ ]
++ | [
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ }
++ ]
++ | [
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ }
++ ]
++ | [
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ }
++ ]
++ | [
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ }
++ ]
++ | [
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ }
++ ]
++ | [
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ }
++ ]
++ | [
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ }
++ ]
++ | [
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ }
++ ]
++ | [
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ },
++ {
++ key: string;
++ label: string;
++ count: number;
++ unit: string;
++ href?: string;
++ }
++ ];
++ };
++ /**
++ * The person's own AI calls, from Report's AI meter (report.ai-usage-me-result@2's totals). Report quotes the meter; it never derives a price.
++ */
++ ai?: {
++ calls: number;
++ /**
++ * Input and output tokens added, as the meter counts them.
++ */
++ tokens: number;
++ cost_usd: number;
++ /**
++ * @maxItems 90
++ */
++ daily?: {
++ day: string;
++ calls: number;
++ }[];
++ };
++ /**
++ * Vibes that reached the person, as OpenVibe.Billing answered them. Report stores no money and derives no amount.
++ */
++ money?: {
++ currency: "vibes-bits";
++ settled_bits: number;
++ transactions: number;
++ };
++ };
++ /**
++ * One plain line about what is not in the counts, when a source could not answer. Never a count and never a claim that a number is zero.
++ */
++ note?: string;
++}
++
++/** [email protected] (owner: report) */
++/**
++ * report.me-stats-publish@1: the body of PUT /api/v1/me/stats/published, the person's per-section switch (the owner, 2026-11-09: 'you can make them public if you want, but private by default'). Every switch is named, so a request can never leave one to chance; the route answers the same report.me-stats@1 document, recomputed at that moment.
++ */
++export interface ReportMeStatsPublish {
++ published: {
++ sites: boolean;
++ activity: boolean;
++ made: boolean;
++ ai: boolean;
++ money: boolean;
++ };
++}
++
/** [email protected] (owner: chat) */
/**
* chat.tts-speak-request@1: the body of POST /api/agent-voice/speak (Agent Streams S4). The desk asks Chat for the sound of one line the agent said. TEXT is the line (at most 220 characters). VOICE is a Chat voice id, or absent for the site default. OWN asks for the person own voice, and only the person themself may ask for it.
ddiff --git a/package-lock.json b/package-lock.json
iindex ab1092ba..d1f222cc 100644
---- a/package-lock.json
++++ b/package-lock.json
@@@ -1,12 +1,12 @@
{
"name": "openvibe-contracts",
-- "version": "0.361.0",
++ "version": "0.362.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "openvibe-contracts",
-- "version": "0.361.0",
++ "version": "0.362.0",
"license": "AGPL-3.0-only",
"dependencies": {
"ajv": "^8.17.1",
ddiff --git a/package.json b/package.json
iindex 63fd42e0..e2860c75 100644
---- a/package.json
++++ b/package.json
@@@ -1,6 +1,6 @@
{
"name": "openvibe-contracts",
-- "version": "0.361.0",
++ "version": "0.362.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",