openvibers/openvibe.contracts Commits

0.235.0: OpenVibe.Vision and OpenVibe.Exchange manifests; vision.ui.check (#243)

OP OpenVibers committed 16 days ago · 68b4c8cc33 · 54 files, +1222 −77

Changes

ddiff --git a/CHANGELOG.md b/CHANGELOG.md
iindex 4879f59a..a41100a9 100644
---- a/CHANGELOG.md
++++ b/CHANGELOG.md
@@@ -4,6 +4,24 @@ All notable changes to `openvibe-contracts`. Releases are git tags (`vX.Y.Z`) th
from `https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/<tag>`. Before v0.30.0,
the notes were in the tag and commit messages (`git tag -n1`).
++## 0.235.0 — 2026-10-28
++
++- **OpenVibe.Vision** (`vision`, live at openvibe.vision, port 5130, database `ov_vision`; plan 2026-10-28 §5.8): ask
++ a picture, read its text with the local Tesseract engine first, compare the local reader with up to three AI hints,
++ and check HTML, a public URL or a screenshot for overflow, cut-off text, low contrast, overlap and layering faults.
++ OpenVibe.AI is the only model gateway (`ai.run.create`, workflow `ai.complete`); Vision holds no provider key, uses
++ no face recognition and stores no image bytes. The manifest names `vision.*`, the two account events it consumes, and
++ the site block (Vision, icon `vision`, position 43, legal profile `ugc`) in News & answers. It registers one
++ capability, `vision.ui.check` (first-party, the route Design's Arena calls), with `vision.ui-check-request@1` and
++ `vision.ui-check-result@1` (new); `vision.ask`, `vision.ocr` and `vision.compare` are served but wait for a caller.
++- **OpenVibe.Exchange** (`exchange`, live at openvibe.exchange, port 5150, database `ov_exchange`): free and swap
++ listings with a permission passport, conformance tests for each version, a manifest/passport sandbox dry run,
++ install with the exact passport snapshot, one-tap revoke, claims and swap offers, a prohibited-items/no-money filter
++ and staff hide. Every public listing is one `search.index-document@1` queued in `exchange_outbox`; v1 writes no
++ Network grant and executes no listing code, so it registers no capability of its own. The manifest names
++ `exchange.*`, the two account events it consumes, and the site block (Exchange, icon `exchange`, position 44, legal
++ profile `ugc`) in Shop & swap.
++
## 0.234.0 — 2026-10-28
- **OpenVibe.Meme** (`meme`, live at openvibe.meme, port 5120, database `ov_meme`): the open meme database, rebuilt
ddiff --git a/contracts/catalog.json b/contracts/catalog.json
iindex 767a51c0..b8d37e0c 100644
---- a/contracts/catalog.json
++++ b/contracts/catalog.json
@@@ -7703,6 +7703,24 @@
"visibility": "public",
"compatibility": "backward",
"status": "active"
++ },
++ {
++ "id": "vision.ui-check-request",
++ "version": "1.0.0",
++ "owner": "vision",
++ "schema": "vision/ui-check-request.v1.json",
++ "visibility": "first-party",
++ "compatibility": "backward",
++ "status": "active"
++ },
++ {
++ "id": "vision.ui-check-result",
++ "version": "1.0.0",
++ "owner": "vision",
++ "schema": "vision/ui-check-result.v1.json",
++ "visibility": "first-party",
++ "compatibility": "backward",
++ "status": "active"
}
]
}
ddiff --git a/contracts/vision/ui-check-request.v1.json b/contracts/vision/ui-check-request.v1.json
nnew file mode 100644
iindex 00000000..061ba3ea
---- /dev/null
++++ b/contracts/vision/ui-check-request.v1.json
@@@ -0,0 +1,47 @@
++{
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/vision/ui-check-request.v1.json",
++ "title": "VisionUiCheckRequest",
++ "description": "vision.ui-check-request@1: the JSON body of POST /api/v1/ui-check on OpenVibe.Vision (Design's Arena and signed-in people; HTML, URL and screenshot checks also work anonymously). Send exactly one source: `html` with the markup, `url` with a public http(s) page, `image` with a data URL, or `image_url` with a public image URL. The multipart form field `image` is the same screenshot source. `viewport` defaults to 1280x800 and is clamped to 160..10000; the check executes no JavaScript and fetches only a public URL through the SSRF guard.",
++ "type": "object",
++ "additionalProperties": false,
++ "properties": {
++ "html": {
++ "type": "string",
++ "maxLength": 5000000,
++ "description": "The HTML to check, including any inline CSS."
++ },
++ "url": {
++ "type": "string",
++ "format": "uri",
++ "pattern": "^https?://",
++ "description": "A public page to fetch and check."
++ },
++ "image": {
++ "type": "string",
++ "pattern": "^data:image/",
++ "description": "A screenshot as an image data URL."
++ },
++ "image_url": {
++ "type": "string",
++ "format": "uri",
++ "pattern": "^https?://",
++ "description": "A public screenshot URL."
++ },
++ "viewport": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": ["w", "h"],
++ "properties": {
++ "w": { "type": "integer", "minimum": 160, "maximum": 10000 },
++ "h": { "type": "integer", "minimum": 160, "maximum": 10000 }
++ }
++ }
++ },
++ "anyOf": [
++ { "required": ["html"] },
++ { "required": ["url"] },
++ { "required": ["image"] },
++ { "required": ["image_url"] }
++ ]
++}
ddiff --git a/contracts/vision/ui-check-result.v1.json b/contracts/vision/ui-check-result.v1.json
nnew file mode 100644
iindex 00000000..4b52e5c6
---- /dev/null
++++ b/contracts/vision/ui-check-result.v1.json
@@@ -0,0 +1,59 @@
++{
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/vision/ui-check-result.v1.json",
++ "title": "VisionUiCheckResult",
++ "description": "vision.ui-check-result@1: the answer of POST /api/v1/ui-check and GET /api/v1/ui-checks/:id on OpenVibe.Vision. `check` names the engine that ran (static HTML/CSS or a screenshot through OCR boxes and pixels), the viewport, every finding with its stable kind and severity, and the summary the saved row keeps. No image bytes are returned; a screenshot is identified only by its sha256.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": ["check"],
++ "properties": {
++ "check": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": ["id", "source", "viewport", "engine", "findings", "created_at"],
++ "properties": {
++ "id": { "type": "string", "pattern": "^vuc_[0-9A-HJKMNP-TV-Z]{26}$" },
++ "source": { "enum": ["html", "url", "screenshot"] },
++ "url": { "type": ["string", "null"], "format": "uri" },
++ "image_sha256": { "type": ["string", "null"], "pattern": "^[0-9a-f]{64}$" },
++ "viewport": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": ["w", "h"],
++ "properties": {
++ "w": { "type": "integer", "minimum": 160, "maximum": 10000 },
++ "h": { "type": "integer", "minimum": 160, "maximum": 10000 }
++ }
++ },
++ "engine": { "enum": ["static-html", "screenshot"] },
++ "findings": {
++ "type": "array",
++ "items": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": ["kind", "severity", "selector", "detail"],
++ "properties": {
++ "kind": { "enum": ["overflow", "cut_off", "contrast", "overlap", "layering"] },
++ "severity": { "enum": ["high", "medium", "low"] },
++ "selector": { "type": "string" },
++ "detail": { "type": "string" },
++ "evidence": { "type": "object" }
++ }
++ }
++ },
++ "summary": { "type": "object" },
++ "counts": {
++ "type": "object",
++ "additionalProperties": { "type": "integer", "minimum": 0 }
++ },
++ "severity": {
++ "type": "object",
++ "additionalProperties": { "type": "integer", "minimum": 0 }
++ },
++ "warnings": { "type": "array", "items": { "type": "string" } },
++ "summary_text": { "type": "string" },
++ "created_at": { "type": "string", "format": "date-time" }
++ }
++ }
++ }
++}
ddiff --git a/fixtures/vision.ui-check-request/invalid/no-source.json b/fixtures/vision.ui-check-request/invalid/no-source.json
nnew file mode 100644
iindex 00000000..081b689a
---- /dev/null
++++ b/fixtures/vision.ui-check-request/invalid/no-source.json
@@@ -0,0 +1,6 @@
++{
++ "viewport": {
++ "w": 390,
++ "h": 844
++ }
++}
ddiff --git a/fixtures/vision.ui-check-request/valid/html.json b/fixtures/vision.ui-check-request/valid/html.json
nnew file mode 100644
iindex 00000000..6ce3b44a
---- /dev/null
++++ b/fixtures/vision.ui-check-request/valid/html.json
@@@ -0,0 +1,7 @@
++{
++ "html": "<!doctype html><style>.card{width:1400px}</style><div class=\"card\">x</div>",
++ "viewport": {
++ "w": 390,
++ "h": 844
++ }
++}
ddiff --git a/fixtures/vision.ui-check-result/invalid/missing-fields.json b/fixtures/vision.ui-check-result/invalid/missing-fields.json
nnew file mode 100644
iindex 00000000..d922a66a
---- /dev/null
++++ b/fixtures/vision.ui-check-result/invalid/missing-fields.json
@@@ -0,0 +1,5 @@
++{
++ "check": {
++ "id": "not-a-check"
++ }
++}
ddiff --git a/fixtures/vision.ui-check-result/valid/overflow.json b/fixtures/vision.ui-check-result/valid/overflow.json
nnew file mode 100644
iindex 00000000..e8a7f7bf
---- /dev/null
++++ b/fixtures/vision.ui-check-result/valid/overflow.json
@@@ -0,0 +1,57 @@
++{
++ "check": {
++ "id": "vuc_01JAB2C3D4E5F6G7H8J9K0MNPQ",
++ "source": "html",
++ "url": null,
++ "image_sha256": null,
++ "viewport": {
++ "w": 390,
++ "h": 844
++ },
++ "engine": "static-html",
++ "findings": [
++ {
++ "kind": "overflow",
++ "severity": "medium",
++ "selector": "div.card",
++ "detail": "the box is 1400px wide and reaches 1400px in a 390px viewport",
++ "evidence": {
++ "width": 1400,
++ "right": 1400,
++ "viewport": 390
++ }
++ }
++ ],
++ "summary": {
++ "ok": false,
++ "engine": "static-html",
++ "source": "html",
++ "viewport": {
++ "w": 390,
++ "h": 844
++ },
++ "counts": {
++ "overflow": 1
++ },
++ "severity": {
++ "high": 0,
++ "medium": 1,
++ "low": 0
++ },
++ "findings": 1,
++ "summary": "1 UI fault found (1 overflow)",
++ "warnings": []
++ },
++ "counts": {
++ "overflow": 1
++ },
++ "severity": {
++ "high": 0,
++ "medium": 1,
++ "low": 0
++ },
++ "warnings": [],
++ "summary_text": "1 UI fault found (1 overflow)",
++ "created_at": "2026-10-28T12:00:00.000Z"
++ }
++}
ddiff --git a/generated/json-schema/bundle.json b/generated/json-schema/bundle.json
iindex e7379ca2..d85088e0 100644
---- a/generated/json-schema/bundle.json
++++ b/generated/json-schema/bundle.json
@@@ -86730,6 +86730,238 @@
}
}
}
++ },
++ "vision.ui-check-request": {
++ "version": "1.0.0",
++ "owner": "vision",
++ "status": "active",
++ "schema": {
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/vision/ui-check-request.v1.json",
++ "title": "VisionUiCheckRequest",
++ "description": "vision.ui-check-request@1: the JSON body of POST /api/v1/ui-check on OpenVibe.Vision (Design's Arena and signed-in people; HTML, URL and screenshot checks also work anonymously). Send exactly one source: `html` with the markup, `url` with a public http(s) page, `image` with a data URL, or `image_url` with a public image URL. The multipart form field `image` is the same screenshot source. `viewport` defaults to 1280x800 and is clamped to 160..10000; the check executes no JavaScript and fetches only a public URL through the SSRF guard.",
++ "type": "object",
++ "additionalProperties": false,
++ "properties": {
++ "html": {
++ "type": "string",
++ "maxLength": 5000000,
++ "description": "The HTML to check, including any inline CSS."
++ },
++ "url": {
++ "type": "string",
++ "format": "uri",
++ "pattern": "^https?://",
++ "description": "A public page to fetch and check."
++ },
++ "image": {
++ "type": "string",
++ "pattern": "^data:image/",
++ "description": "A screenshot as an image data URL."
++ },
++ "image_url": {
++ "type": "string",
++ "format": "uri",
++ "pattern": "^https?://",
++ "description": "A public screenshot URL."
++ },
++ "viewport": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "w",
++ "h"
++ ],
++ "properties": {
++ "w": {
++ "type": "integer",
++ "minimum": 160,
++ "maximum": 10000
++ },
++ "h": {
++ "type": "integer",
++ "minimum": 160,
++ "maximum": 10000
++ }
++ }
++ }
++ },
++ "anyOf": [
++ {
++ "required": [
++ "html"
++ ]
++ },
++ {
++ "required": [
++ "url"
++ ]
++ },
++ {
++ "required": [
++ "image"
++ ]
++ },
++ {
++ "required": [
++ "image_url"
++ ]
++ }
++ ]
++ }
++ },
++ "vision.ui-check-result": {
++ "version": "1.0.0",
++ "owner": "vision",
++ "status": "active",
++ "schema": {
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/vision/ui-check-result.v1.json",
++ "title": "VisionUiCheckResult",
++ "description": "vision.ui-check-result@1: the answer of POST /api/v1/ui-check and GET /api/v1/ui-checks/:id on OpenVibe.Vision. `check` names the engine that ran (static HTML/CSS or a screenshot through OCR boxes and pixels), the viewport, every finding with its stable kind and severity, and the summary the saved row keeps. No image bytes are returned; a screenshot is identified only by its sha256.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "check"
++ ],
++ "properties": {
++ "check": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "id",
++ "source",
++ "viewport",
++ "engine",
++ "findings",
++ "created_at"
++ ],
++ "properties": {
++ "id": {
++ "type": "string",
++ "pattern": "^vuc_[0-9A-HJKMNP-TV-Z]{26}$"
++ },
++ "source": {
++ "enum": [
++ "html",
++ "url",
++ "screenshot"
++ ]
++ },
++ "url": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "format": "uri"
++ },
++ "image_sha256": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "pattern": "^[0-9a-f]{64}$"
++ },
++ "viewport": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "w",
++ "h"
++ ],
++ "properties": {
++ "w": {
++ "type": "integer",
++ "minimum": 160,
++ "maximum": 10000
++ },
++ "h": {
++ "type": "integer",
++ "minimum": 160,
++ "maximum": 10000
++ }
++ }
++ },
++ "engine": {
++ "enum": [
++ "static-html",
++ "screenshot"
++ ]
++ },
++ "findings": {
++ "type": "array",
++ "items": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "kind",
++ "severity",
++ "selector",
++ "detail"
++ ],
++ "properties": {
++ "kind": {
++ "enum": [
++ "overflow",
++ "cut_off",
++ "contrast",
++ "overlap",
++ "layering"
++ ]
++ },
++ "severity": {
++ "enum": [
++ "high",
++ "medium",
++ "low"
++ ]
++ },
++ "selector": {
++ "type": "string"
++ },
++ "detail": {
++ "type": "string"
++ },
++ "evidence": {
++ "type": "object"
++ }
++ }
++ }
++ },
++ "summary": {
++ "type": "object"
++ },
++ "counts": {
++ "type": "object",
++ "additionalProperties": {
++ "type": "integer",
++ "minimum": 0
++ }
++ },
++ "severity": {
++ "type": "object",
++ "additionalProperties": {
++ "type": "integer",
++ "minimum": 0
++ }
++ },
++ "warnings": {
++ "type": "array",
++ "items": {
++ "type": "string"
++ }
++ },
++ "summary_text": {
++ "type": "string"
++ },
++ "created_at": {
++ "type": "string",
++ "format": "date-time"
++ }
++ }
++ }
++ }
++ }
}
}
}
ddiff --git a/generated/openapi/actor.json b/generated/openapi/actor.json
iindex db2dc02d..97e12cd9 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.234.0",
-- "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.234.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.235.0",
++ "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.235.0): each operation lists the capabilities it performs; a token for the 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 5c4cee5e..ee0b1550 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.234.0",
-- "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.234.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.235.0",
++ "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.235.0): each operation lists the capabilities it performs; a token for the 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 2c4f7282..3d92ee10 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.234.0",
-- "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.234.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.235.0",
++ "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.235.0): each operation lists the capabilities it performs; a token for the 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 62264e9e..e593406c 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.234.0",
-- "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.234.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.235.0",
++ "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.235.0): each operation lists the capabilities it performs; a token for the 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 6a9607f1..c9402238 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.234.0",
-- "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.234.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.235.0",
++ "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.235.0): each operation lists the capabilities it performs; a token for the 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 debac236..ea73aada 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.234.0",
-- "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.234.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.235.0",
++ "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.235.0): each operation lists the capabilities it performs; a token for the 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 f54bd07d..fa038c0e 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.234.0",
-- "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.234.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.235.0",
++ "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.235.0): each operation lists the capabilities it performs; a token for the 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 3a54acef..e81be941 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.234.0",
-- "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.234.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.235.0",
++ "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.235.0): each operation lists the capabilities it performs; a token for the 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 4bf4ca80..0ff51826 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.234.0",
-- "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.234.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.235.0",
++ "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.235.0): each operation lists the capabilities it performs; a token for the 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 89349d5a..a83396dd 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.234.0",
-- "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.234.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.235.0",
++ "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.235.0): each operation lists the capabilities it performs; a token for the 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 a8c3bae9..bba9f566 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.234.0",
-- "description": "Routes of OpenVibe.Domains as the OpenVibe contracts describe them (openvibe-contracts 0.234.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.235.0",
++ "description": "Routes of OpenVibe.Domains as the OpenVibe contracts describe them (openvibe-contracts 0.235.0): each operation lists the capabilities it performs; a token for the 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 9b24fcd3..dc684211 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.234.0",
-- "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.234.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.235.0",
++ "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.235.0): each operation lists the capabilities it performs; a token for the 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 9b5b2d26..d27d7639 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.234.0",
-- "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.234.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.235.0",
++ "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.235.0): each operation lists the capabilities it performs; a token for the 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 0f07006f..cb39e06f 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.234.0",
-- "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.234.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.235.0",
++ "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.235.0): each operation lists the capabilities it performs; a token for the 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 47df22fc..ad3ad8d5 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.234.0",
-- "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.234.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.235.0",
++ "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.235.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/index.json b/generated/openapi/index.json
iindex c4d67967..ebde0540 100644
---- a/generated/openapi/index.json
++++ b/generated/openapi/index.json
@@@ -239,6 +239,13 @@
"operations": 21,
"capabilities": 14
},
++ {
++ "service": "vision",
++ "name": "OpenVibe.Vision",
++ "origin": "https://openvibe.vision",
++ "operations": 2,
++ "capabilities": 1
++ },
{
"service": "watch",
"name": "OpenVibe.Watch",
ddiff --git a/generated/openapi/inventory.json b/generated/openapi/inventory.json
iindex 8c37e462..932e5519 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.234.0",
-- "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.234.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.235.0",
++ "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.235.0): each operation lists the capabilities it performs; a token for the 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 d081d89e..39a2f86a 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.234.0",
-- "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.234.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.235.0",
++ "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.235.0): each operation lists the capabilities it performs; a token for the 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 959ce00a..33a4aa06 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.234.0",
-- "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.234.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.235.0",
++ "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.235.0): each operation lists the capabilities it performs; a token for the 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 ad1d2be5..92aad169 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.234.0",
-- "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.234.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.235.0",
++ "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.235.0): each operation lists the capabilities it performs; a token for the 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 4464914e..73d1b90c 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.234.0",
-- "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.234.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.235.0",
++ "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.235.0): each operation lists the capabilities it performs; a token for the 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 20f4b950..e4a0f853 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.234.0",
-- "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.234.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.235.0",
++ "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.235.0): each operation lists the capabilities it performs; a token for the 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 1322392d..ea290cdf 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.234.0",
-- "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.234.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.235.0",
++ "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.235.0): each operation lists the capabilities it performs; a token for the 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 00d5ecfa..4cd1b9d7 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.234.0",
-- "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.234.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.235.0",
++ "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.235.0): each operation lists the capabilities it performs; a token for the 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 21b0f496..7bf45b2a 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.234.0",
-- "description": "Routes of OpenVibe.Quest as the OpenVibe contracts describe them (openvibe-contracts 0.234.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.235.0",
++ "description": "Routes of OpenVibe.Quest as the OpenVibe contracts describe them (openvibe-contracts 0.235.0): each operation lists the capabilities it performs; a token for the 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 b961304c..fe43f520 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.234.0",
-- "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.234.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.235.0",
++ "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.235.0): each operation lists the capabilities it performs; a token for the 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 70f88af1..84c36fbd 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.234.0",
-- "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.234.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.235.0",
++ "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.235.0): each operation lists the capabilities it performs; a token for the 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 ca5d0056..511882e0 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.234.0",
-- "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.234.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.235.0",
++ "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.235.0): each operation lists the capabilities it performs; a token for the 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 38086f02..b6a59137 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.234.0",
-- "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.234.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.235.0",
++ "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.235.0): each operation lists the capabilities it performs; a token for the 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 80049f82..f8d0bf65 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.234.0",
-- "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.234.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.235.0",
++ "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.235.0): each operation lists the capabilities it performs; a token for the 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 58d17500..9d42d6f1 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.234.0",
-- "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.234.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.235.0",
++ "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.235.0): each operation lists the capabilities it performs; a token for the 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 16d8892a..f1679f09 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.234.0",
-- "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.234.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.235.0",
++ "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.235.0): each operation lists the capabilities it performs; a token for the 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 41eddf63..68f85295 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.234.0",
-- "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.234.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.235.0",
++ "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.235.0): each operation lists the capabilities it performs; a token for the 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 0f6c2600..dc107a13 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.234.0",
-- "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.234.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.235.0",
++ "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.235.0): each operation lists the capabilities it performs; a token for the 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 7cf39c20..742c296b 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.234.0",
-- "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.234.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.235.0",
++ "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.235.0): each operation lists the capabilities it performs; a token for the 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
nnew file mode 100644
iindex 00000000..44ecd920
---- /dev/null
++++ b/generated/openapi/vision.json
@@@ -0,0 +1,431 @@
++{
++ "openapi": "3.1.0",
++ "jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
++ "info": {
++ "title": "OpenVibe.Vision API",
++ "version": "0.235.0",
++ "description": "Routes of OpenVibe.Vision as the OpenVibe contracts describe them (openvibe-contracts 0.235.0): each operation lists the capabilities it performs; a token for the 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"
++ }
++ },
++ "servers": [
++ {
++ "url": "https://openvibe.vision"
++ }
++ ],
++ "paths": {
++ "/api/v1/ui-check": {
++ "post": {
++ "operationId": "post_api_v1_ui_check",
++ "summary": "Run OpenVibe.Vision's UI check: POST /api/v1/ui-check takes HTML, a public URL or a screenshot plus an optional viewport and returns overflow, cut-off text, low contrast, overlap and layering findings",
++ "description": "**vision.ui.check** (first-party): Run OpenVibe.Vision's UI check: POST /api/v1/ui-check takes HTML, a public URL or a screenshot plus an optional viewport and returns overflow, cut-off text, low contrast, overlap and layering findings with counts and severity; GET /api/v1/ui-checks/:id reads a saved check. OpenVibe.Design's Arena is the caller today; a signed-in person may also use it. The check runs entirely on Vision's host (static HTML/CSS parsing, or OCR boxes and pixel sampling for a screenshot): it executes no JavaScript and fetches only a public URL through the SSRF guard.",
++ "tags": [
++ "vision.ui"
++ ],
++ "x-openvibe-capabilities": [
++ "vision.ui.check"
++ ],
++ "x-openvibe-visibility": [
++ "first-party"
++ ],
++ "x-openvibe-quota-class": "vision-ui-check",
++ "security": [
++ {
++ "openvibeToken": [
++ "vision.ui.check"
++ ]
++ }
++ ],
++ "requestBody": {
++ "required": false,
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/vision.ui-check-request.v1"
++ }
++ }
++ }
++ },
++ "responses": {
++ "2XX": {
++ "description": "Success",
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/vision.ui-check-result.v1"
++ }
++ }
++ }
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ }
++ },
++ "/api/v1/ui-checks/{id}": {
++ "get": {
++ "operationId": "get_api_v1_ui_checks_id",
++ "summary": "Run OpenVibe.Vision's UI check: POST /api/v1/ui-check takes HTML, a public URL or a screenshot plus an optional viewport and returns overflow, cut-off text, low contrast, overlap and layering findings",
++ "description": "**vision.ui.check** (first-party): Run OpenVibe.Vision's UI check: POST /api/v1/ui-check takes HTML, a public URL or a screenshot plus an optional viewport and returns overflow, cut-off text, low contrast, overlap and layering findings with counts and severity; GET /api/v1/ui-checks/:id reads a saved check. OpenVibe.Design's Arena is the caller today; a signed-in person may also use it. The check runs entirely on Vision's host (static HTML/CSS parsing, or OCR boxes and pixel sampling for a screenshot): it executes no JavaScript and fetches only a public URL through the SSRF guard.",
++ "tags": [
++ "vision.ui"
++ ],
++ "x-openvibe-capabilities": [
++ "vision.ui.check"
++ ],
++ "x-openvibe-visibility": [
++ "first-party"
++ ],
++ "x-openvibe-quota-class": "vision-ui-check",
++ "security": [
++ {
++ "openvibeToken": [
++ "vision.ui.check"
++ ]
++ }
++ ],
++ "x-openvibe-input": {
++ "$ref": "#/components/schemas/vision.ui-check-request.v1"
++ },
++ "parameters": [
++ {
++ "name": "id",
++ "in": "path",
++ "required": true,
++ "schema": {
++ "type": "string"
++ }
++ }
++ ],
++ "responses": {
++ "2XX": {
++ "description": "Success",
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/vision.ui-check-result.v1"
++ }
++ }
++ }
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ }
++ }
++ },
++ "components": {
++ "schemas": {
++ "errors.problem.v1": {
++ "title": "Problem",
++ "description": "RFC 9457 problem details (application/problem+json) with a stable OpenVibe error code and trace identifiers. The legacy 'error' string is allowed during migration so existing clients keep working.",
++ "type": "object",
++ "required": [
++ "type",
++ "title",
++ "status",
++ "code"
++ ],
++ "additionalProperties": true,
++ "properties": {
++ "type": {
++ "type": "string",
++ "format": "uri-reference"
++ },
++ "title": {
++ "type": "string",
++ "minLength": 1
++ },
++ "status": {
++ "type": "integer",
++ "minimum": 400,
++ "maximum": 599
++ },
++ "detail": {
++ "type": "string"
++ },
++ "instance": {
++ "type": "string",
++ "format": "uri-reference"
++ },
++ "code": {
++ "type": "string",
++ "pattern": "^[a-z][a-z0-9_]*(\\.[a-z0-9_]+)*$"
++ },
++ "request_id": {
++ "type": "string"
++ },
++ "trace_id": {
++ "type": "string",
++ "pattern": "^[0-9a-f]{32}$"
++ },
++ "errors": {
++ "type": "array",
++ "items": {
++ "type": "object",
++ "required": [
++ "message"
++ ],
++ "properties": {
++ "path": {
++ "type": "string"
++ },
++ "message": {
++ "type": "string"
++ }
++ }
++ }
++ },
++ "error": {
++ "type": "string",
++ "description": "Deprecated compatibility field: same text as title/detail for clients that read {error}."
++ }
++ }
++ },
++ "vision.ui-check-request.v1": {
++ "title": "VisionUiCheckRequest",
++ "description": "vision.ui-check-request@1: the JSON body of POST /api/v1/ui-check on OpenVibe.Vision (Design's Arena and signed-in people; HTML, URL and screenshot checks also work anonymously). Send exactly one source: `html` with the markup, `url` with a public http(s) page, `image` with a data URL, or `image_url` with a public image URL. The multipart form field `image` is the same screenshot source. `viewport` defaults to 1280x800 and is clamped to 160..10000; the check executes no JavaScript and fetches only a public URL through the SSRF guard.",
++ "type": "object",
++ "additionalProperties": false,
++ "properties": {
++ "html": {
++ "type": "string",
++ "maxLength": 5000000,
++ "description": "The HTML to check, including any inline CSS."
++ },
++ "url": {
++ "type": "string",
++ "format": "uri",
++ "pattern": "^https?://",
++ "description": "A public page to fetch and check."
++ },
++ "image": {
++ "type": "string",
++ "pattern": "^data:image/",
++ "description": "A screenshot as an image data URL."
++ },
++ "image_url": {
++ "type": "string",
++ "format": "uri",
++ "pattern": "^https?://",
++ "description": "A public screenshot URL."
++ },
++ "viewport": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "w",
++ "h"
++ ],
++ "properties": {
++ "w": {
++ "type": "integer",
++ "minimum": 160,
++ "maximum": 10000
++ },
++ "h": {
++ "type": "integer",
++ "minimum": 160,
++ "maximum": 10000
++ }
++ }
++ }
++ },
++ "anyOf": [
++ {
++ "required": [
++ "html"
++ ]
++ },
++ {
++ "required": [
++ "url"
++ ]
++ },
++ {
++ "required": [
++ "image"
++ ]
++ },
++ {
++ "required": [
++ "image_url"
++ ]
++ }
++ ]
++ },
++ "vision.ui-check-result.v1": {
++ "title": "VisionUiCheckResult",
++ "description": "vision.ui-check-result@1: the answer of POST /api/v1/ui-check and GET /api/v1/ui-checks/:id on OpenVibe.Vision. `check` names the engine that ran (static HTML/CSS or a screenshot through OCR boxes and pixels), the viewport, every finding with its stable kind and severity, and the summary the saved row keeps. No image bytes are returned; a screenshot is identified only by its sha256.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "check"
++ ],
++ "properties": {
++ "check": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "id",
++ "source",
++ "viewport",
++ "engine",
++ "findings",
++ "created_at"
++ ],
++ "properties": {
++ "id": {
++ "type": "string",
++ "pattern": "^vuc_[0-9A-HJKMNP-TV-Z]{26}$"
++ },
++ "source": {
++ "enum": [
++ "html",
++ "url",
++ "screenshot"
++ ]
++ },
++ "url": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "format": "uri"
++ },
++ "image_sha256": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "pattern": "^[0-9a-f]{64}$"
++ },
++ "viewport": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "w",
++ "h"
++ ],
++ "properties": {
++ "w": {
++ "type": "integer",
++ "minimum": 160,
++ "maximum": 10000
++ },
++ "h": {
++ "type": "integer",
++ "minimum": 160,
++ "maximum": 10000
++ }
++ }
++ },
++ "engine": {
++ "enum": [
++ "static-html",
++ "screenshot"
++ ]
++ },
++ "findings": {
++ "type": "array",
++ "items": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "kind",
++ "severity",
++ "selector",
++ "detail"
++ ],
++ "properties": {
++ "kind": {
++ "enum": [
++ "overflow",
++ "cut_off",
++ "contrast",
++ "overlap",
++ "layering"
++ ]
++ },
++ "severity": {
++ "enum": [
++ "high",
++ "medium",
++ "low"
++ ]
++ },
++ "selector": {
++ "type": "string"
++ },
++ "detail": {
++ "type": "string"
++ },
++ "evidence": {
++ "type": "object"
++ }
++ }
++ }
++ },
++ "summary": {
++ "type": "object"
++ },
++ "counts": {
++ "type": "object",
++ "additionalProperties": {
++ "type": "integer",
++ "minimum": 0
++ }
++ },
++ "severity": {
++ "type": "object",
++ "additionalProperties": {
++ "type": "integer",
++ "minimum": 0
++ }
++ },
++ "warnings": {
++ "type": "array",
++ "items": {
++ "type": "string"
++ }
++ },
++ "summary_text": {
++ "type": "string"
++ },
++ "created_at": {
++ "type": "string",
++ "format": "date-time"
++ }
++ }
++ }
++ }
++ }
++ },
++ "securitySchemes": {
++ "openvibeToken": {
++ "type": "http",
++ "scheme": "bearer",
++ "bearerFormat": "JWT",
++ "description": "An OpenVibe Network token for this service: a person's token, an app token (client credentials, audience of the service) or a first-party service token. Its `cap` claim must include the capability the operation names."
++ }
++ }
++ }
++}
ddiff --git a/generated/openapi/watch.json b/generated/openapi/watch.json
iindex a60c01ec..0fa2d5d7 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.234.0",
-- "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.234.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.235.0",
++ "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.235.0): each operation lists the capabilities it performs; a token for the 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 62ff9b4b..941ac0e4 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.234.0",
-- "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.234.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.235.0",
++ "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.235.0): each operation lists the capabilities it performs; a token for the 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 6a0a28aa..b503f11a 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.234.0",
-- "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.234.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.235.0",
++ "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.235.0): each operation lists the capabilities it performs; a token for the 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 3f766622..780c8f31 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.234.0",
-- "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.234.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.235.0",
++ "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.235.0): each operation lists the capabilities it performs; a token for the 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 a33b9c7f..775953b9 100644
---- a/generated/typescript/index.d.ts
++++ b/generated/typescript/index.d.ts
@@@ -213347,3 +213347,67 @@ export interface DomainsProposal {
error?: string | null;
href: string;
}
++
++/** [email protected] (owner: vision) */
++/**
++ * vision.ui-check-request@1: the JSON body of POST /api/v1/ui-check on OpenVibe.Vision (Design's Arena and signed-in people; HTML, URL and screenshot checks also work anonymously). Send exactly one source: `html` with the markup, `url` with a public http(s) page, `image` with a data URL, or `image_url` with a public image URL. The multipart form field `image` is the same screenshot source. `viewport` defaults to 1280x800 and is clamped to 160..10000; the check executes no JavaScript and fetches only a public URL through the SSRF guard.
++ */
++export type VisionUiCheckRequest = {
++ [k: string]: unknown | undefined;
++} & {
++ /**
++ * The HTML to check, including any inline CSS.
++ */
++ html?: string;
++ /**
++ * A public page to fetch and check.
++ */
++ url?: string;
++ /**
++ * A screenshot as an image data URL.
++ */
++ image?: string;
++ /**
++ * A public screenshot URL.
++ */
++ image_url?: string;
++ viewport?: {
++ w: number;
++ h: number;
++ };
++};
++
++/** [email protected] (owner: vision) */
++/**
++ * vision.ui-check-result@1: the answer of POST /api/v1/ui-check and GET /api/v1/ui-checks/:id on OpenVibe.Vision. `check` names the engine that ran (static HTML/CSS or a screenshot through OCR boxes and pixels), the viewport, every finding with its stable kind and severity, and the summary the saved row keeps. No image bytes are returned; a screenshot is identified only by its sha256.
++ */
++export interface VisionUiCheckResult {
++ check: {
++ id: string;
++ source: "html" | "url" | "screenshot";
++ url?: string | null;
++ image_sha256?: string | null;
++ viewport: {
++ w: number;
++ h: number;
++ };
++ engine: "static-html" | "screenshot";
++ findings: {
++ kind: "overflow" | "cut_off" | "contrast" | "overlap" | "layering";
++ severity: "high" | "medium" | "low";
++ selector: string;
++ detail: string;
++ evidence?: {};
++ }[];
++ summary?: {};
++ counts?: {
++ [k: string]: number | undefined;
++ };
++ severity?: {
++ [k: string]: number | undefined;
++ };
++ warnings?: string[];
++ summary_text?: string;
++ created_at: string;
++ };
++}
ddiff --git a/manifests/capabilities/vision.ui.check.json b/manifests/capabilities/vision.ui.check.json
nnew file mode 100644
iindex 00000000..6583d92b
---- /dev/null
++++ b/manifests/capabilities/vision.ui.check.json
@@@ -0,0 +1,22 @@
++{
++ "id": "vision.ui.check",
++ "version": "1.0",
++ "owner": "vision",
++ "status": "active",
++ "visibility": "first-party",
++ "description": "Run OpenVibe.Vision's UI check: POST /api/v1/ui-check takes HTML, a public URL or a screenshot plus an optional viewport and returns overflow, cut-off text, low contrast, overlap and layering findings with counts and severity; GET /api/v1/ui-checks/:id reads a saved check. OpenVibe.Design's Arena is the caller today; a signed-in person may also use it. The check runs entirely on Vision's host (static HTML/CSS parsing, or OCR boxes and pixel sampling for a screenshot): it executes no JavaScript and fetches only a public URL through the SSRF guard.",
++ "permissions": [
++ "vision:ui-check"
++ ],
++ "resourceConstraints": [
++ "none"
++ ],
++ "quotaClass": "vision-ui-check",
++ "events": [],
++ "implementedBy": [
++ "POST /api/v1/ui-check",
++ "GET /api/v1/ui-checks/:id"
++ ],
++ "inputSchema": "vision.ui-check-request@1",
++ "outputSchema": "vision.ui-check-result@1"
++}
ddiff --git a/manifests/services/exchange.json b/manifests/services/exchange.json
nnew file mode 100644
iindex 00000000..4c9e31b7
---- /dev/null
++++ b/manifests/services/exchange.json
@@@ -0,0 +1,87 @@
++{
++ "version": "0.1.0",
++ "contractRanges": {
++ "openvibe-contracts": ">=0.229.0 <1.0.0"
++ },
++ "id": "exchange",
++ "name": "OpenVibe.Exchange",
++ "status": "alpha",
++ "repository": "OpenVibers/OpenVibe.Exchange",
++ "domains": [
++ "openvibe.exchange"
++ ],
++ "publicOrigin": "https://openvibe.exchange",
++ "exposure": {
++ "state": "live",
++ "publicSite": "service"
++ },
++ "capabilities": [],
++ "eventsProduced": [],
++ "eventsConsumed": [
++ "network.account.export_requested",
++ "network.account.deleted"
++ ],
++ "namespacesOwned": [
++ "exchange.*"
++ ],
++ "lifecycle": {
++ "liveness": {
++ "endpoint": "/api/health",
++ "means": "the process is up and answers HTTP; it checks nothing else (the PostgreSQL database, Valkey, Network's JWKS and the Events subscriptions are what /api/ready checks)"
++ },
++ "shutdown": {
++ "signal": "SIGTERM",
++ "deadlineSeconds": 10,
++ "drains": [
++ "HTTP server closed and in-flight requests drained",
++ "JWKS refresher stopped",
++ "telemetry interval and retention stopped, then the telemetry buffer flushed",
++ "PostgreSQL pool closed, then the Events subscriptions stopped"
++ ]
++ },
++ "startupRecovery": {
++ "resumes": [
++ {
++ "kind": "outbox",
++ "what": "exchange_outbox rows committed with a listing change survive a stop under their fixed evt_ ids; v1 has no relay yet, so unpublished documents wait for Search's document writer rather than being sent at boot"
++ },
++ {
++ "kind": "state",
++ "what": "listings, tests, trials, installs and offers live in PostgreSQL; a restart reopens the pool, and an install keeps the passport snapshot it was made with"
++ },
++ {
++ "kind": "consumer",
++ "what": "OpenVibe.Events redelivers network.account.export_requested and network.account.deleted that were pending during the stop; account_data_events applies each once, so a redelivery changes nothing"
++ }
++ ]
++ },
++ "rollback": {
++ "conditions": [
++ "automatic: ovhost deploy puts the previous sha back and restarts again when the ready URL does not answer 2xx within ready.timeoutSeconds after the restart (exit 3)",
++ "manual: ovhost rollback <service> --to <sha>"
++ ],
++ "window": "automatic only while ovhost waits for readiness after the restart; manual afterwards, as long as no blocker applies",
++ "blockers": {
++ "none": "migration 0001 only creates Exchange's own tables (listings, tests, status events, sandbox trials, installs, offers, outbox, account-data receipts, telemetry); an earlier release reads none of them"
++ }
++ },
++ "contracts": {
++ "range": ">=0.229.0 <1.0.0"
++ },
++ "leases": {
++ "none": "no claims: one process serves the site and the API"
++ }
++ },
++ "notes": "Port 5150, unit openvibe-exchange.service, database ov_exchange. The Exchange room: trade what people make. v1 is free and swap only, with a permission passport, four conformance tests per version, a manifest/passport sandbox dry run, install with the exact passport snapshot, one-tap idempotent revoke, free claims and swap offers, a fixed prohibited-items/no-money filter and staff hide. Every public listing is one search.index-document@1 queued in exchange_outbox, with a tombstone when it closes or is hidden; the relay waits for Network's search.document.write grant. v1 writes no Network grant and runs no listing code, so network.grants.write, network.grants.revoke and run.sandbox.execute are not registered. OAuth client `exchange`; answers account export and deletion (ADR-033) and subscribes to the two account Events topics. No money, no AI and no capability of its own.",
++ "health": "/api/health",
++ "ready": "/api/ready",
++ "internalOrigin": "http://127.0.0.1:5150",
++ "site": {
++ "name": "Exchange",
++ "icon": "exchange",
++ "tagline": "Trade what people make",
++ "what": "Free and swap listings for agents, MCP tools, templates, themes, game assets and creator services, each with a permission passport, conformance tests, a sandbox dry run, install with the passport snapshot and one-tap revoke.",
++ "legalProfile": "ugc",
++ "position": 44
++ }
++}
ddiff --git a/manifests/services/vision.json b/manifests/services/vision.json
nnew file mode 100644
iindex 00000000..ba28e4e3
---- /dev/null
++++ b/manifests/services/vision.json
@@@ -0,0 +1,85 @@
++{
++ "version": "0.1.0",
++ "contractRanges": {
++ "openvibe-contracts": ">=0.229.0 <1.0.0"
++ },
++ "id": "vision",
++ "name": "OpenVibe.Vision",
++ "status": "alpha",
++ "repository": "OpenVibers/OpenVibe.Vision",
++ "domains": [
++ "openvibe.vision"
++ ],
++ "publicOrigin": "https://openvibe.vision",
++ "exposure": {
++ "state": "live",
++ "publicSite": "service"
++ },
++ "capabilities": [
++ "vision.ui.check"
++ ],
++ "eventsProduced": [],
++ "eventsConsumed": [
++ "network.account.export_requested",
++ "network.account.deleted"
++ ],
++ "namespacesOwned": [
++ "vision.*"
++ ],
++ "lifecycle": {
++ "liveness": {
++ "endpoint": "/api/health",
++ "means": "the process is up and answers HTTP; it checks nothing else (the PostgreSQL database, Valkey, Network's JWKS, the Events subscriptions and OpenVibe.AI are what /api/ready checks)"
++ },
++ "shutdown": {
++ "signal": "SIGTERM",
++ "deadlineSeconds": 10,
++ "drains": [
++ "HTTP server closed and in-flight requests drained",
++ "JWKS refresher stopped",
++ "telemetry interval and retention stopped, then the telemetry buffer flushed",
++ "PostgreSQL pool closed, then the Events subscriptions stopped"
++ ]
++ },
++ "startupRecovery": {
++ "resumes": [
++ {
++ "kind": "state",
++ "what": "answers, compare samples and UI checks live in PostgreSQL; a restart reopens the pool and clears only the in-process rate limits and telemetry buffer, so saved rows stay readable by id"
++ },
++ {
++ "kind": "consumer",
++ "what": "OpenVibe.Events redelivers network.account.export_requested and network.account.deleted that were pending during the stop; account_data_events applies each once, so a redelivery changes nothing"
++ }
++ ]
++ },
++ "rollback": {
++ "conditions": [
++ "automatic: ovhost deploy puts the previous sha back and restarts again when the ready URL does not answer 2xx within ready.timeoutSeconds after the restart (exit 3)",
++ "manual: ovhost rollback <service> --to <sha>"
++ ],
++ "window": "automatic only while ovhost waits for readiness after the restart; manual afterwards, as long as no blocker applies",
++ "blockers": {
++ "none": "migration 0001 only creates Vision's own tables (answers, compare samples, UI checks, account-data receipts, telemetry); an earlier release reads none of them"
++ }
++ },
++ "contracts": {
++ "range": ">=0.229.0 <1.0.0"
++ },
++ "leases": {
++ "none": "no claims: one process serves the site and the API"
++ }
++ },
++ "notes": "Port 5130, unit openvibe-vision.service, database ov_vision. The Vision room (plan 2026-10-28 §5.8): ask a picture, read text with the local Tesseract 5 engine first, compare the local reader with up to three AI hints, and check HTML, a public URL or a screenshot for overflow, cut-off, low contrast, overlap and layering faults. OpenVibe.AI is the only model gateway (ai.run.create; the OpenAI-compatible POST /v1/chat/completions is workflow ai.complete); no provider key is held, no face recognition is used and no image bytes are stored. OAuth client `vision`; answers account export and deletion (ADR-033) and subscribes to the two account Events topics. v1 has no public records, so it has no Search outbox. Of Vision's four machine capabilities (vision.ask, vision.ocr, vision.compare, vision.ui_check), 0.235.0 registers only vision.ui.check, the route Design's Arena calls today; the other three are served but wait for a caller.",
++ "health": "/api/health",
++ "ready": "/api/ready",
++ "internalOrigin": "http://127.0.0.1:5130",
++ "site": {
++ "name": "Vision",
++ "icon": "vision",
++ "tagline": "See with the best model for the job",
++ "what": "Ask a picture a question, read its text with a local engine, compare models side by side with cost and latency, or point the UI check at a page to find overflow, cut-off text, low contrast, overlap and layering faults.",
++ "legalProfile": "ugc",
++ "position": 43
++ }
++}
ddiff --git a/package.json b/package.json
iindex 28e68918..311bf201 100644
---- a/package.json
++++ b/package.json
@@@ -1,6 +1,6 @@
{
"name": "openvibe-contracts",
-- "version": "0.234.0",
++ "version": "0.235.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",