openvibers/openvibe.contracts Commits

Contracts 0.330.0: OpenVibe.Email, its two capabilities and a place after Chat (#338)

OP OpenVibers committed 6 days ago · 4e3c3a5a7c · 97 files, +931 −135

Changes

ddiff --git a/CHANGELOG.md b/CHANGELOG.md
iindex bd29938f..60e6a3b5 100644
---- a/CHANGELOG.md
++++ b/CHANGELOG.md
@@@ -1,5 +1,12 @@
# Changelog
++## 0.330.0 — 2026-11-07
++
++- Add the `mail` service manifest: `openvibe.email` as the site **Email** (icon `mail`, the shared glyph font's E054), tagline "An address for every sign-up", the receive-only wording, legal profile `service`, and position 7, directly after Chat. It declares exposure `live`/`service`, port 5250, database `ov_mail`, the Stalwart mail server, `/api/health` and `/api/ready`, its shutdown and due-based recovery, an expand-only rollback, and the purge lease.
++- Add the two capabilities OpenVibe.Mail's API already checks: `mail.addresses.write` (make and retire a mask; make an agent inbox) and `mail.messages.read` (the person's addresses, message metadata and the newest burner code, never a body). Both are first-party, `owner`-constrained, and name their routes. Their request and result schemas are recorded in `compatibility/capability-schema-gaps.json` for now, like the config.manage capabilities added in 0.315.0.
++- The manifest lists no `eventsProduced` yet: the service publishes `mail.mask.created` and `mail.received`, but their payload contracts are not in this release.
++- Sites from the old position 7 up move one place (Services becomes 8, … Connect becomes 52) so Email sits beside Chat without breaking the unique-position rule. No contract changes shape; the only data change is the site order.
++
## 0.329.0 — 2026-11-07
- Add `mail.mask@1`: a per-site address on OpenVibe.Mail that delivers into its owner's OpenVibe mailbox and nowhere else. It carries the `msk_…` id, the owner's Network subject, the `<words>.<four characters>@<mask domain>` address, the person's label and purpose, whether it is enabled (a disabled mask leaves the SQL directory Stalwart reads, so it bounces) and when it was made. M1 is receive-only, so this is metadata: no body, no forwarding target.
ddiff --git a/compatibility/capability-schema-gaps.json b/compatibility/capability-schema-gaps.json
iindex 076d011f..46524559 100644
---- a/compatibility/capability-schema-gaps.json
++++ b/compatibility/capability-schema-gaps.json
@@@ -49,6 +49,20 @@
"inputSchema",
"outputSchema"
]
++ },
++ {
++ "id": "mail.addresses.write",
++ "missing": [
++ "inputSchema",
++ "outputSchema"
++ ]
++ },
++ {
++ "id": "mail.messages.read",
++ "missing": [
++ "inputSchema",
++ "outputSchema"
++ ]
}
]
}
ddiff --git a/generated/openapi/actor.json b/generated/openapi/actor.json
iindex b8dddeda..76afc43f 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.329.0",
-- "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.330.0",
++ "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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 2a99da97..89d618c5 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.329.0",
-- "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.330.0",
++ "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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 17f2c47c..b3eecd18 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.329.0",
-- "description": "Routes of OpenVibe.Bench as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.330.0",
++ "description": "Routes of OpenVibe.Bench as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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 23c2558c..832d2840 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.329.0",
-- "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.330.0",
++ "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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 0da3a256..c15d995d 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.329.0",
-- "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.330.0",
++ "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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 7ee917d8..7eb2505e 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.329.0",
-- "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.330.0",
++ "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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 0b5ba234..446bc536 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.329.0",
-- "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.330.0",
++ "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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 c035e780..693d1391 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.329.0",
-- "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.330.0",
++ "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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 f8e58e6b..c5368fa6 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.329.0",
-- "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.330.0",
++ "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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 54cda962..239c978c 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.329.0",
-- "description": "Routes of OpenVibe Connect as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.330.0",
++ "description": "Routes of OpenVibe Connect as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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 49fc5c46..9579ca5f 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.329.0",
-- "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.330.0",
++ "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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 c0a67424..369bdc00 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.329.0",
-- "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.330.0",
++ "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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 f9d77950..2d7b66cc 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.329.0",
-- "description": "Routes of OpenVibe.Design as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.330.0",
++ "description": "Routes of OpenVibe.Design as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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 22335010..d570bbbb 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.329.0",
-- "description": "Routes of OpenVibe.Domains as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.330.0",
++ "description": "Routes of OpenVibe.Domains as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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 7a8ab422..19c4c912 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.329.0",
-- "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.330.0",
++ "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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 19eae659..fc185834 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.329.0",
-- "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.330.0",
++ "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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 2186a788..867fe6fb 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.329.0",
-- "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.330.0",
++ "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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 83338af8..1a325d46 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.329.0",
-- "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.330.0",
++ "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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 b8f94bc8..a66792c2 100644
---- a/generated/openapi/index.json
++++ b/generated/openapi/index.json
@@@ -141,6 +141,13 @@
"operations": 47,
"capabilities": 12
},
++ {
++ "service": "mail",
++ "name": "OpenVibe.Mail",
++ "origin": "https://openvibe.email",
++ "operations": 12,
++ "capabilities": 2
++ },
{
"service": "media",
"name": "OpenVibe.Media",
ddiff --git a/generated/openapi/inventory.json b/generated/openapi/inventory.json
iindex 520790c5..1d6c53ac 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.329.0",
-- "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.330.0",
++ "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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 1aaa6216..f1055393 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.329.0",
-- "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.330.0",
++ "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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
nnew file mode 100644
iindex 00000000..abbcf66d
---- /dev/null
++++ b/generated/openapi/mail.json
@@@ -0,0 +1,620 @@
++{
++ "openapi": "3.1.0",
++ "jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
++ "info": {
++ "title": "OpenVibe.Mail API",
++ "version": "0.330.0",
++ "description": "Routes of OpenVibe.Mail as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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.email"
++ }
++ ],
++ "paths": {
++ "/api/v1/agent-inboxes": {
++ "get": {
++ "operationId": "get_api_v1_agent_inboxes",
++ "summary": "Read what arrived for a person's addresses: the addresses they own with their state and counts, and the metadata of a mask's, burner's or agent inbox's messages (sender, subject, time) plus the newest",
++ "description": "**mail.messages.read** (first-party): Read what arrived for a person's addresses: the addresses they own with their state and counts, and the metadata of a mask's, burner's or agent inbox's messages (sender, subject, time) plus the newest verification code in a burner. Never a message body, and never another person's mail. The caller must act for the person (on_behalf_of), except a burner read with the one-time token its create call returned.",
++ "tags": [
++ "mail.messages"
++ ],
++ "x-openvibe-capabilities": [
++ "mail.messages.read"
++ ],
++ "x-openvibe-visibility": [
++ "first-party"
++ ],
++ "x-openvibe-quota-class": "mail-messages-read",
++ "security": [
++ {
++ "openvibeToken": [
++ "mail.messages.read"
++ ]
++ }
++ ],
++ "responses": {
++ "2XX": {
++ "description": "Success"
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ },
++ "post": {
++ "operationId": "post_api_v1_agent_inboxes",
++ "summary": "Make and retire the addresses OpenVibe.Mail hands out for a person: a mask (a per-site address that delivers into their OpenVibe mailbox and nowhere else) and an agent inbox (<agent>.<user>@openvibe.e",
++ "description": "**mail.addresses.write** (first-party): Make and retire the addresses OpenVibe.Mail hands out for a person: a mask (a per-site address that delivers into their OpenVibe mailbox and nowhere else) and an agent inbox (<agent>.<user>@openvibe.email). Turning a mask off makes its address bounce. The caller must act for the person (on_behalf_of); it never sends mail.",
++ "tags": [
++ "mail.addresses"
++ ],
++ "x-openvibe-capabilities": [
++ "mail.addresses.write"
++ ],
++ "x-openvibe-visibility": [
++ "first-party"
++ ],
++ "x-openvibe-quota-class": "mail-addresses-write",
++ "security": [
++ {
++ "openvibeToken": [
++ "mail.addresses.write"
++ ]
++ }
++ ],
++ "responses": {
++ "2XX": {
++ "description": "Success"
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ }
++ },
++ "/api/v1/agent-inboxes/{id}/messages": {
++ "get": {
++ "operationId": "get_api_v1_agent_inboxes_id_messages",
++ "summary": "Read what arrived for a person's addresses: the addresses they own with their state and counts, and the metadata of a mask's, burner's or agent inbox's messages (sender, subject, time) plus the newest",
++ "description": "**mail.messages.read** (first-party): Read what arrived for a person's addresses: the addresses they own with their state and counts, and the metadata of a mask's, burner's or agent inbox's messages (sender, subject, time) plus the newest verification code in a burner. Never a message body, and never another person's mail. The caller must act for the person (on_behalf_of), except a burner read with the one-time token its create call returned.",
++ "tags": [
++ "mail.messages"
++ ],
++ "x-openvibe-capabilities": [
++ "mail.messages.read"
++ ],
++ "x-openvibe-visibility": [
++ "first-party"
++ ],
++ "x-openvibe-quota-class": "mail-messages-read",
++ "security": [
++ {
++ "openvibeToken": [
++ "mail.messages.read"
++ ]
++ }
++ ],
++ "parameters": [
++ {
++ "name": "id",
++ "in": "path",
++ "required": true,
++ "schema": {
++ "type": "string"
++ }
++ }
++ ],
++ "responses": {
++ "2XX": {
++ "description": "Success"
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ }
++ },
++ "/api/v1/burners": {
++ "get": {
++ "operationId": "get_api_v1_burners",
++ "summary": "Read what arrived for a person's addresses: the addresses they own with their state and counts, and the metadata of a mask's, burner's or agent inbox's messages (sender, subject, time) plus the newest",
++ "description": "**mail.messages.read** (first-party): Read what arrived for a person's addresses: the addresses they own with their state and counts, and the metadata of a mask's, burner's or agent inbox's messages (sender, subject, time) plus the newest verification code in a burner. Never a message body, and never another person's mail. The caller must act for the person (on_behalf_of), except a burner read with the one-time token its create call returned.",
++ "tags": [
++ "mail.messages"
++ ],
++ "x-openvibe-capabilities": [
++ "mail.messages.read"
++ ],
++ "x-openvibe-visibility": [
++ "first-party"
++ ],
++ "x-openvibe-quota-class": "mail-messages-read",
++ "security": [
++ {
++ "openvibeToken": [
++ "mail.messages.read"
++ ]
++ }
++ ],
++ "responses": {
++ "2XX": {
++ "description": "Success"
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ }
++ },
++ "/api/v1/burners/{id}/code": {
++ "get": {
++ "operationId": "get_api_v1_burners_id_code",
++ "summary": "Read what arrived for a person's addresses: the addresses they own with their state and counts, and the metadata of a mask's, burner's or agent inbox's messages (sender, subject, time) plus the newest",
++ "description": "**mail.messages.read** (first-party): Read what arrived for a person's addresses: the addresses they own with their state and counts, and the metadata of a mask's, burner's or agent inbox's messages (sender, subject, time) plus the newest verification code in a burner. Never a message body, and never another person's mail. The caller must act for the person (on_behalf_of), except a burner read with the one-time token its create call returned.",
++ "tags": [
++ "mail.messages"
++ ],
++ "x-openvibe-capabilities": [
++ "mail.messages.read"
++ ],
++ "x-openvibe-visibility": [
++ "first-party"
++ ],
++ "x-openvibe-quota-class": "mail-messages-read",
++ "security": [
++ {
++ "openvibeToken": [
++ "mail.messages.read"
++ ]
++ }
++ ],
++ "parameters": [
++ {
++ "name": "id",
++ "in": "path",
++ "required": true,
++ "schema": {
++ "type": "string"
++ }
++ }
++ ],
++ "responses": {
++ "2XX": {
++ "description": "Success"
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ }
++ },
++ "/api/v1/burners/{id}/messages": {
++ "get": {
++ "operationId": "get_api_v1_burners_id_messages",
++ "summary": "Read what arrived for a person's addresses: the addresses they own with their state and counts, and the metadata of a mask's, burner's or agent inbox's messages (sender, subject, time) plus the newest",
++ "description": "**mail.messages.read** (first-party): Read what arrived for a person's addresses: the addresses they own with their state and counts, and the metadata of a mask's, burner's or agent inbox's messages (sender, subject, time) plus the newest verification code in a burner. Never a message body, and never another person's mail. The caller must act for the person (on_behalf_of), except a burner read with the one-time token its create call returned.",
++ "tags": [
++ "mail.messages"
++ ],
++ "x-openvibe-capabilities": [
++ "mail.messages.read"
++ ],
++ "x-openvibe-visibility": [
++ "first-party"
++ ],
++ "x-openvibe-quota-class": "mail-messages-read",
++ "security": [
++ {
++ "openvibeToken": [
++ "mail.messages.read"
++ ]
++ }
++ ],
++ "parameters": [
++ {
++ "name": "id",
++ "in": "path",
++ "required": true,
++ "schema": {
++ "type": "string"
++ }
++ }
++ ],
++ "responses": {
++ "2XX": {
++ "description": "Success"
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ }
++ },
++ "/api/v1/masks": {
++ "get": {
++ "operationId": "get_api_v1_masks",
++ "summary": "Read what arrived for a person's addresses: the addresses they own with their state and counts, and the metadata of a mask's, burner's or agent inbox's messages (sender, subject, time) plus the newest",
++ "description": "**mail.messages.read** (first-party): Read what arrived for a person's addresses: the addresses they own with their state and counts, and the metadata of a mask's, burner's or agent inbox's messages (sender, subject, time) plus the newest verification code in a burner. Never a message body, and never another person's mail. The caller must act for the person (on_behalf_of), except a burner read with the one-time token its create call returned.",
++ "tags": [
++ "mail.messages"
++ ],
++ "x-openvibe-capabilities": [
++ "mail.messages.read"
++ ],
++ "x-openvibe-visibility": [
++ "first-party"
++ ],
++ "x-openvibe-quota-class": "mail-messages-read",
++ "security": [
++ {
++ "openvibeToken": [
++ "mail.messages.read"
++ ]
++ }
++ ],
++ "responses": {
++ "2XX": {
++ "description": "Success"
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ },
++ "post": {
++ "operationId": "post_api_v1_masks",
++ "summary": "Make and retire the addresses OpenVibe.Mail hands out for a person: a mask (a per-site address that delivers into their OpenVibe mailbox and nowhere else) and an agent inbox (<agent>.<user>@openvibe.e",
++ "description": "**mail.addresses.write** (first-party): Make and retire the addresses OpenVibe.Mail hands out for a person: a mask (a per-site address that delivers into their OpenVibe mailbox and nowhere else) and an agent inbox (<agent>.<user>@openvibe.email). Turning a mask off makes its address bounce. The caller must act for the person (on_behalf_of); it never sends mail.",
++ "tags": [
++ "mail.addresses"
++ ],
++ "x-openvibe-capabilities": [
++ "mail.addresses.write"
++ ],
++ "x-openvibe-visibility": [
++ "first-party"
++ ],
++ "x-openvibe-quota-class": "mail-addresses-write",
++ "security": [
++ {
++ "openvibeToken": [
++ "mail.addresses.write"
++ ]
++ }
++ ],
++ "responses": {
++ "2XX": {
++ "description": "Success"
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ }
++ },
++ "/api/v1/masks/{id}": {
++ "delete": {
++ "operationId": "delete_api_v1_masks_id",
++ "summary": "Make and retire the addresses OpenVibe.Mail hands out for a person: a mask (a per-site address that delivers into their OpenVibe mailbox and nowhere else) and an agent inbox (<agent>.<user>@openvibe.e",
++ "description": "**mail.addresses.write** (first-party): Make and retire the addresses OpenVibe.Mail hands out for a person: a mask (a per-site address that delivers into their OpenVibe mailbox and nowhere else) and an agent inbox (<agent>.<user>@openvibe.email). Turning a mask off makes its address bounce. The caller must act for the person (on_behalf_of); it never sends mail.",
++ "tags": [
++ "mail.addresses"
++ ],
++ "x-openvibe-capabilities": [
++ "mail.addresses.write"
++ ],
++ "x-openvibe-visibility": [
++ "first-party"
++ ],
++ "x-openvibe-quota-class": "mail-addresses-write",
++ "security": [
++ {
++ "openvibeToken": [
++ "mail.addresses.write"
++ ]
++ }
++ ],
++ "parameters": [
++ {
++ "name": "id",
++ "in": "path",
++ "required": true,
++ "schema": {
++ "type": "string"
++ }
++ }
++ ],
++ "responses": {
++ "2XX": {
++ "description": "Success"
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ },
++ "get": {
++ "operationId": "get_api_v1_masks_id",
++ "summary": "Read what arrived for a person's addresses: the addresses they own with their state and counts, and the metadata of a mask's, burner's or agent inbox's messages (sender, subject, time) plus the newest",
++ "description": "**mail.messages.read** (first-party): Read what arrived for a person's addresses: the addresses they own with their state and counts, and the metadata of a mask's, burner's or agent inbox's messages (sender, subject, time) plus the newest verification code in a burner. Never a message body, and never another person's mail. The caller must act for the person (on_behalf_of), except a burner read with the one-time token its create call returned.",
++ "tags": [
++ "mail.messages"
++ ],
++ "x-openvibe-capabilities": [
++ "mail.messages.read"
++ ],
++ "x-openvibe-visibility": [
++ "first-party"
++ ],
++ "x-openvibe-quota-class": "mail-messages-read",
++ "security": [
++ {
++ "openvibeToken": [
++ "mail.messages.read"
++ ]
++ }
++ ],
++ "parameters": [
++ {
++ "name": "id",
++ "in": "path",
++ "required": true,
++ "schema": {
++ "type": "string"
++ }
++ }
++ ],
++ "responses": {
++ "2XX": {
++ "description": "Success"
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ }
++ },
++ "/api/v1/masks/{id}/disable": {
++ "post": {
++ "operationId": "post_api_v1_masks_id_disable",
++ "summary": "Make and retire the addresses OpenVibe.Mail hands out for a person: a mask (a per-site address that delivers into their OpenVibe mailbox and nowhere else) and an agent inbox (<agent>.<user>@openvibe.e",
++ "description": "**mail.addresses.write** (first-party): Make and retire the addresses OpenVibe.Mail hands out for a person: a mask (a per-site address that delivers into their OpenVibe mailbox and nowhere else) and an agent inbox (<agent>.<user>@openvibe.email). Turning a mask off makes its address bounce. The caller must act for the person (on_behalf_of); it never sends mail.",
++ "tags": [
++ "mail.addresses"
++ ],
++ "x-openvibe-capabilities": [
++ "mail.addresses.write"
++ ],
++ "x-openvibe-visibility": [
++ "first-party"
++ ],
++ "x-openvibe-quota-class": "mail-addresses-write",
++ "security": [
++ {
++ "openvibeToken": [
++ "mail.addresses.write"
++ ]
++ }
++ ],
++ "parameters": [
++ {
++ "name": "id",
++ "in": "path",
++ "required": true,
++ "schema": {
++ "type": "string"
++ }
++ }
++ ],
++ "responses": {
++ "2XX": {
++ "description": "Success"
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ }
++ },
++ "/api/v1/me/mail": {
++ "get": {
++ "operationId": "get_api_v1_me_mail",
++ "summary": "Read what arrived for a person's addresses: the addresses they own with their state and counts, and the metadata of a mask's, burner's or agent inbox's messages (sender, subject, time) plus the newest",
++ "description": "**mail.messages.read** (first-party): Read what arrived for a person's addresses: the addresses they own with their state and counts, and the metadata of a mask's, burner's or agent inbox's messages (sender, subject, time) plus the newest verification code in a burner. Never a message body, and never another person's mail. The caller must act for the person (on_behalf_of), except a burner read with the one-time token its create call returned.",
++ "tags": [
++ "mail.messages"
++ ],
++ "x-openvibe-capabilities": [
++ "mail.messages.read"
++ ],
++ "x-openvibe-visibility": [
++ "first-party"
++ ],
++ "x-openvibe-quota-class": "mail-messages-read",
++ "security": [
++ {
++ "openvibeToken": [
++ "mail.messages.read"
++ ]
++ }
++ ],
++ "responses": {
++ "2XX": {
++ "description": "Success"
++ },
++ "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}."
++ }
++ }
++ }
++ },
++ "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/media-hub.json b/generated/openapi/media-hub.json
iindex 8e544021..539ac05c 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.329.0",
-- "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.330.0",
++ "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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 2fcb80b4..181b7bd6 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.329.0",
-- "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.330.0",
++ "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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 2f839cfa..a1cc0079 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.329.0",
-- "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.330.0",
++ "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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 c54a613e..5ec59c45 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.329.0",
-- "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.330.0",
++ "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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 902c37ee..04eb9c20 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.329.0",
-- "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.330.0",
++ "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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 daa79166..3f16e630 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.329.0",
-- "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.330.0",
++ "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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 5a6173c1..17f1dc1c 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.329.0",
-- "description": "Routes of OpenVibe.Quest as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.330.0",
++ "description": "Routes of OpenVibe.Quest as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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 3129e19a..61ef0579 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.329.0",
-- "description": "Routes of OpenVibe.Report as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.330.0",
++ "description": "Routes of OpenVibe.Report as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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 061f3654..671e8024 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.329.0",
-- "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.330.0",
++ "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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 82b7f9e9..f47f8f0c 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.329.0",
-- "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.330.0",
++ "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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 832d1ebc..399000e1 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.329.0",
-- "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.330.0",
++ "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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 933c0058..4c1973a0 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.329.0",
-- "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.330.0",
++ "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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 38c2d8f1..a76ddda6 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.329.0",
-- "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.330.0",
++ "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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 b7d31ee2..a1105e43 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.329.0",
-- "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.330.0",
++ "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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 f14d854b..9b60e70d 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.329.0",
-- "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.330.0",
++ "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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 39297854..e4d21025 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.329.0",
-- "description": "Routes of OpenVibe.Today as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.330.0",
++ "description": "Routes of OpenVibe.Today as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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 873c05e7..40c99632 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.329.0",
-- "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.330.0",
++ "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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 b7e0d42f..b08c447c 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.329.0",
-- "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.330.0",
++ "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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 547e6730..58dabf82 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.329.0",
-- "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.330.0",
++ "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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 e93e6674..45d99191 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.329.0",
-- "description": "Routes of OpenVibe.Vision as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.330.0",
++ "description": "Routes of OpenVibe.Vision as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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 8d0d5b3c..5fca9bf5 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.329.0",
-- "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.330.0",
++ "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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 9b371219..422b7944 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.329.0",
-- "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.330.0",
++ "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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 a1d68955..549e6d2d 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.329.0",
-- "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.330.0",
++ "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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 93c9ad8e..ef300965 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.329.0",
-- "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.330.0",
++ "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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/manifests/capabilities/mail.addresses.write.json b/manifests/capabilities/mail.addresses.write.json
nnew file mode 100644
iindex 00000000..4768c8fe
---- /dev/null
++++ b/manifests/capabilities/mail.addresses.write.json
@@@ -0,0 +1,25 @@
++{
++ "id": "mail.addresses.write",
++ "version": "1.0",
++ "owner": "mail",
++ "status": "active",
++ "visibility": "first-party",
++ "sensitive": true,
++ "description": "Make and retire the addresses OpenVibe.Mail hands out for a person: a mask (a per-site address that delivers into their OpenVibe mailbox and nowhere else) and an agent inbox (<agent>.<user>@openvibe.email). Turning a mask off makes its address bounce. The caller must act for the person (on_behalf_of); it never sends mail.",
++ "permissions": [
++ "mail:addresses:write"
++ ],
++ "resourceConstraints": [
++ "owner"
++ ],
++ "quotaClass": "mail-addresses-write",
++ "events": [
++ "mail.mask.created"
++ ],
++ "implementedBy": [
++ "POST /api/v1/masks",
++ "POST /api/v1/masks/:id/disable",
++ "DELETE /api/v1/masks/:id",
++ "POST /api/v1/agent-inboxes"
++ ]
++}
ddiff --git a/manifests/capabilities/mail.messages.read.json b/manifests/capabilities/mail.messages.read.json
nnew file mode 100644
iindex 00000000..5bd7cf0a
---- /dev/null
++++ b/manifests/capabilities/mail.messages.read.json
@@@ -0,0 +1,29 @@
++{
++ "id": "mail.messages.read",
++ "version": "1.0",
++ "owner": "mail",
++ "status": "active",
++ "visibility": "first-party",
++ "sensitive": true,
++ "description": "Read what arrived for a person's addresses: the addresses they own with their state and counts, and the metadata of a mask's, burner's or agent inbox's messages (sender, subject, time) plus the newest verification code in a burner. Never a message body, and never another person's mail. The caller must act for the person (on_behalf_of), except a burner read with the one-time token its create call returned.",
++ "permissions": [
++ "mail:messages:read"
++ ],
++ "resourceConstraints": [
++ "owner"
++ ],
++ "quotaClass": "mail-messages-read",
++ "events": [
++ "mail.received"
++ ],
++ "implementedBy": [
++ "GET /api/v1/me/mail",
++ "GET /api/v1/masks",
++ "GET /api/v1/masks/:id",
++ "GET /api/v1/burners",
++ "GET /api/v1/burners/:id/messages",
++ "GET /api/v1/burners/:id/code",
++ "GET /api/v1/agent-inboxes",
++ "GET /api/v1/agent-inboxes/:id/messages"
++ ]
++}
ddiff --git a/manifests/services/actor.json b/manifests/services/actor.json
iindex 58e0c22d..a43b1257 100644
---- a/manifests/services/actor.json
++++ b/manifests/services/actor.json
@@@ -103,7 +103,7 @@
"tagline": "Agents that work while you are away",
"what": "Agents that run tasks for you, now or on a schedule, on OpenVibe's own agent or another platform's, on your computers and robots when you allow it, with every result checked and its cost shown.",
"legalProfile": "ugc",
-- "position": 23,
++ "position": 24,
"neighbourhood": "make"
}
}
ddiff --git a/manifests/services/bench.json b/manifests/services/bench.json
iindex 7b253dfa..f97f1fcb 100644
---- a/manifests/services/bench.json
++++ b/manifests/services/bench.json
@@@ -104,7 +104,7 @@
"tagline": "One AI benchmark and comparison engine for every room",
"what": "The shared AI benchmark and comparison engine: kinds, pinned rounds, blind judgements, elo/pareto/cost boards, an open dataset per kind and private evals.",
"legalProfile": "service",
-- "position": 47,
++ "position": 48,
"neighbourhood": "build"
}
}
ddiff --git a/manifests/services/blog.json b/manifests/services/blog.json
iindex cf50cd22..91551acd 100644
---- a/manifests/services/blog.json
++++ b/manifests/services/blog.json
@@@ -24,7 +24,7 @@
"tagline": "Long-form, yours to keep",
"what": "The official OpenVibe blog and a blog for every member: drafts, scheduling, media, comments and feeds, plus AI desks: cited digests of public data and a satire column, labelled as AI.",
"legalProfile": "info",
-- "position": 8,
++ "position": 9,
"faq": [
{
"question": "Can anyone have a blog here?",
ddiff --git a/manifests/services/bot.json b/manifests/services/bot.json
iindex 7f91b718..375ac562 100644
---- a/manifests/services/bot.json
++++ b/manifests/services/bot.json
@@@ -24,7 +24,7 @@
"tagline": "Drive any robot from your browser",
"what": "Pair a robot with one pasted command and drive it from any browser, by keyboard, gamepad or on-screen joystick, from its own page or under a live stream, with roles, limits and an emergency stop on every command.",
"legalProfile": "games",
-- "position": 21,
++ "position": 22,
"neighbourhood": "make"
},
"capabilities": [
ddiff --git a/manifests/services/cam.json b/manifests/services/cam.json
iindex f379be57..ddf719ef 100644
---- a/manifests/services/cam.json
++++ b/manifests/services/cam.json
@@@ -78,7 +78,7 @@
"tagline": "Your camera, your cameras, and Live's cam button",
"what": "The camera app with a timer, burst, grid and on-device filter; a private wall for the cameras you own, shared through revocable viewer grants; and the stills Live's cam button takes, every photo saved to Pics.",
"legalProfile": "ugc",
-- "position": 46,
++ "position": 47,
"neighbourhood": "streams"
}
}
ddiff --git a/manifests/services/casino.json b/manifests/services/casino.json
iindex ab2d8f47..759408dc 100644
---- a/manifests/services/casino.json
++++ b/manifests/services/casino.json
@@@ -71,7 +71,7 @@
"tagline": "Learn it, play it, never pay it",
"what": "Every casino game with its insides showing: the rules, the exact odds and what each bet costs. Play with chips worth nothing, and watch a million rounds in your browser. Never real money.",
"legalProfile": "games",
-- "position": 48,
++ "position": 49,
"neighbourhood": "games"
}
}
ddiff --git a/manifests/services/codes.json b/manifests/services/codes.json
iindex 8f81e3c1..b490e138 100644
---- a/manifests/services/codes.json
++++ b/manifests/services/codes.json
@@@ -24,7 +24,7 @@
"tagline": "Build and fix apps with AI",
"what": "The open coding-agent harness: Claude Code, Codex, OpenCode, Command Code, the DeepSeek API and self-hosted models behind one router with hand-offs, sessions and budgets, OpenVibe Git (a code forge with OpenVibe sign-in at git.openvibe.codes) and the way to improve OpenVibe itself.",
"legalProfile": "ugc",
-- "position": 22,
++ "position": 23,
"faq": [
{
"question": "What is OpenVibe.Codes?",
ddiff --git a/manifests/services/connect.json b/manifests/services/connect.json
iindex 02f3409b..e63f5223 100644
---- a/manifests/services/connect.json
++++ b/manifests/services/connect.json
@@@ -78,7 +78,7 @@
"tagline": "Your computer, on the web, privately",
"what": "Share one port on your computer at its own HTTPS address on openvibe.website. Only the people you pick can open it, signed in with OpenVibe. One file and Node: no router settings, no open ports.",
"legalProfile": "ugc",
-- "position": 51,
++ "position": 52,
"neighbourhood": "make"
}
}
ddiff --git a/manifests/services/coupons.json b/manifests/services/coupons.json
iindex 7e9d26be..0664465d 100644
---- a/manifests/services/coupons.json
++++ b/manifests/services/coupons.json
@@@ -24,7 +24,7 @@
"tagline": "Codes that work",
"what": "Coupon codes with merchant matching, restrictions, expiry and real-people validity reports.",
"legalProfile": "info",
-- "position": 17,
++ "position": 18,
"tld": "coupons",
"accent": "#fbbf24",
"description": "OpenVibe.Coupons is community-checked coupon discovery: codes matched to stores, validity reported by real people, expirations tracked, and a browser helper on the way.",
ddiff --git a/manifests/services/deals.json b/manifests/services/deals.json
iindex 5e75165b..7e05984b 100644
---- a/manifests/services/deals.json
++++ b/manifests/services/deals.json
@@@ -24,7 +24,7 @@
"tagline": "Deals worth sharing",
"what": "Deals submitted and voted on by the community, with source, price and freshness always shown, and crowdfunding: one search across Kickstarter, Indiegogo, GoFundMe and more.",
"legalProfile": "info",
-- "position": 16,
++ "position": 17,
"tld": "deals",
"accent": "#f97316",
"description": "OpenVibe.Deals is community deal discovery for the OpenVibe network: deals people vote on, hotness that reflects real interest, keyword alerts, price comparisons, honest discussion, and crowdfunding discovery across every platform at once.",
ddiff --git a/manifests/services/design.json b/manifests/services/design.json
iindex eb13ed2e..bf620878 100644
---- a/manifests/services/design.json
++++ b/manifests/services/design.json
@@@ -73,7 +73,7 @@
"tagline": "Make it yours",
"what": "Try any OpenVibe theme on a Live channel, a Chat room and a shop at once, change its colours with contrast checks that must pass, use it on every site, and step back to any earlier look.",
"legalProfile": "service",
-- "position": 39,
++ "position": 40,
"neighbourhood": "make"
}
}
ddiff --git a/manifests/services/domains.json b/manifests/services/domains.json
iindex d2d5b3a7..87afefd7 100644
---- a/manifests/services/domains.json
++++ b/manifests/services/domains.json
@@@ -76,7 +76,7 @@
"tagline": "Name it, price it, run it",
"what": "Every ending and every registrar for a name, with what you will really pay over 1, 3 and 5 years, the renewal traps flagged, and each domain's public history.",
"legalProfile": "public",
-- "position": 37,
++ "position": 38,
"neighbourhood": "make"
}
}
ddiff --git a/manifests/services/events.json b/manifests/services/events.json
iindex 32770831..357770b8 100644
---- a/manifests/services/events.json
++++ b/manifests/services/events.json
@@@ -87,7 +87,7 @@
"tagline": "Events your services can count on",
"what": "Publish an event once and every subscriber gets it, signed, retried and replayable: webhooks, a pull API with a cursor, dead letters and realtime streams for the browser.",
"legalProfile": "service",
-- "position": 31,
++ "position": 32,
"neighbourhood": "build"
}
}
ddiff --git a/manifests/services/exchange.json b/manifests/services/exchange.json
iindex 9a727c7f..20111a8e 100644
---- a/manifests/services/exchange.json
++++ b/manifests/services/exchange.json
@@@ -82,7 +82,7 @@
"tagline": "Every AI model, one account",
"what": "Every AI model, one account: live prices, speed and uptime of every offer, chat with up to three models side by side, Arena rankings, companions, a private GPU endpoint and one OpenAI- and Anthropic-compatible endpoint. The public pages of OpenVibe.AI live here now.",
"legalProfile": "ugc",
-- "position": 44,
++ "position": 45,
"neighbourhood": "shop"
}
}
ddiff --git a/manifests/services/food.json b/manifests/services/food.json
iindex 04dc4fe2..f124a2d8 100644
---- a/manifests/services/food.json
++++ b/manifests/services/food.json
@@@ -88,7 +88,7 @@
"tagline": "What should we eat?",
"what": "Find food banks and budget grocers near you, plan a week of meals for your household and budget, get recipe ideas from what is in your cupboard, and search every delivery app at once.",
"legalProfile": "tools",
-- "position": 24,
++ "position": 25,
"neighbourhood": "shop"
}
}
ddiff --git a/manifests/services/fun.json b/manifests/services/fun.json
iindex ee322aa4..a8c27b83 100644
---- a/manifests/services/fun.json
++++ b/manifests/services/fun.json
@@@ -83,7 +83,7 @@
"tagline": "Something to do, alone, together, or live",
"what": "IRL quest boards on Live, a local guide from OpenStreetMap and group plans the group votes on; add the winner to your own Today.",
"legalProfile": "ugc",
-- "position": 45,
++ "position": 46,
"neighbourhood": "games"
}
}
ddiff --git a/manifests/services/help.json b/manifests/services/help.json
iindex 42c10f90..46f5c1f9 100644
---- a/manifests/services/help.json
++++ b/manifests/services/help.json
@@@ -80,7 +80,7 @@
"tagline": "Answers for every OpenVibe site",
"what": "Every OpenVibe site in one help centre: what each one does, its common questions, and a ticket to a person when the answer is not there.",
"legalProfile": "account",
-- "position": 25,
++ "position": 26,
"neighbourhood": "people"
}
}
ddiff --git a/manifests/services/host.json b/manifests/services/host.json
iindex da1a3a62..fab152d3 100644
---- a/manifests/services/host.json
++++ b/manifests/services/host.json
@@@ -24,7 +24,7 @@
"tagline": "Hosting, compared honestly",
"what": "Cloud, VPS and dedicated plans, hosting offers, domain prices and benchmarks people run side by side, each with the day it was checked and its source; never ranked by who pays.",
"legalProfile": "hosting",
-- "position": 15,
++ "position": 16,
"tld": "host",
"accent": "#94a3b8",
"description": "OpenVibe.Host compares hosting: plans from providers' official APIs and staff entries that name their source, priced per month, per vCPU and per GB, each dated and linked to its source; offers posted on LowEndSpirit's Offers board; domain prices per ending with a name check at the registry; and benchmarks people run with YABS on their own servers. Its console lists your own servers on Linode, DigitalOcean, Vultr and Hetzner Cloud in one place. The order comes only from the visitor's sort; affiliate links are marked. Static hosting is OpenVibe.Space.",
ddiff --git a/manifests/services/inventory.json b/manifests/services/inventory.json
iindex 578fca36..6bd6446c 100644
---- a/manifests/services/inventory.json
++++ b/manifests/services/inventory.json
@@@ -104,7 +104,7 @@
"tagline": "Your items, on every OpenVibe site",
"what": "Keep the items you earn across OpenVibe in one place, and choose what you wear in chat, on stream overlays and on your profile.",
"legalProfile": "ugc",
-- "position": 30,
++ "position": 31,
"faq": [
{
"question": "How do I get items?",
ddiff --git a/manifests/services/mail.json b/manifests/services/mail.json
nnew file mode 100644
iindex 00000000..8173e49f
---- /dev/null
++++ b/manifests/services/mail.json
@@@ -0,0 +1,94 @@
++{
++ "version": "0.1.0",
++ "contractRanges": {
++ "openvibe-contracts": ">=0.330.0 <1.0.0"
++ },
++ "id": "mail",
++ "name": "OpenVibe.Mail",
++ "status": "alpha",
++ "repository": "OpenVibers/OpenVibe.Mail",
++ "domains": [
++ "openvibe.email"
++ ],
++ "publicOrigin": "https://openvibe.email",
++ "exposure": {
++ "state": "live",
++ "publicSite": "service",
++ "note": "openvibe.email serves the page at / and the API at /api/v1 once the Mail vhost replaces the parked 302 to Chat (the same deploy); mask.openvibe.email, burn1-3.openvibe.email and mail.openvibe.email receive SMTP only"
++ },
++ "capabilities": [
++ "mail.addresses.write",
++ "mail.messages.read"
++ ],
++ "eventsProduced": [],
++ "eventsConsumed": [],
++ "namespacesOwned": [],
++ "lifecycle": {
++ "liveness": {
++ "endpoint": "/api/health",
++ "means": "the process is up and answers HTTP; /api/ready is what requires the PostgreSQL database and the Stalwart mail server, and says which one failed"
++ },
++ "shutdown": {
++ "signal": "SIGTERM",
++ "deadlineSeconds": 10,
++ "drains": [
++ "the purge timer is stopped and a run in flight finishes its transactions",
++ "the Events outbox relay is stopped after its current batch",
++ "HTTP server closed and in-flight requests drained",
++ "PostgreSQL pool closed, then the process exits"
++ ]
++ },
++ "startupRecovery": {
++ "resumes": [
++ {
++ "kind": "state",
++ "what": "masks, burners, agent inboxes, mailboxes and the observed-message receipts in ov_mail survive a stop unchanged; Stalwart's message blobs stay on its own disk"
++ },
++ {
++ "kind": "outbox",
++ "what": "the Events outbox keeps unsent mail.mask.created and mail.received rows and relays them when OpenVibe.Events answers again"
++ },
++ {
++ "kind": "schedule",
++ "what": "the purge job is due-based: its first run after a stop deletes what expired while the service was down and disables the masks whose date has passed"
++ }
++ ]
++ },
++ "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": "migrations 0001-0006 are expand only (CREATE TABLE/VIEW/INDEX and ADD COLUMN); an earlier release reads none of what a later one added"
++ }
++ },
++ "contracts": {
++ "range": ">=0.330.0 <1.0.0"
++ },
++ "leases": {
++ "claims": [
++ {
++ "what": "the due purge run: expired burners, their Stalwart accounts, due masks and observed-message counters",
++ "holder": "the Mail process whose transaction last wrote mail_settings.purge_lease",
++ "expires": "30 seconds after the last take; the next run takes it then",
++ "fencing": "the lease row is claimed by one transaction with updated_at gating the next claim, so a second run skips while the lease is fresh"
++ }
++ ]
++ }
++ },
++ "notes": "Port 5250, unit openvibe-mail.service, database ov_mail, plus the Stalwart receive-only mail server in openvibe-stalwart.service. M1: masks (<words>.<four characters>@mask.openvibe.email) that deliver into the person's OpenVibe mailbox and nowhere else, burners on rotating subdomains that expire after ten minutes, an hour, a day or a week (or after the first message), and agent inboxes <agent>.<user>@openvibe.email. Nothing here sends or relays mail; a message body is read only by the code endpoint, in memory, and is never stored, logged, served as HTML or put in an event. The page at / is openvibe-shared/shell and the API is /api/v1; OAuth client `mail`, redirect https://openvibe.email/auth/callback. The service registers mail.addresses.write and mail.messages.read for an app or agent acting for a person (on_behalf_of); it holds no service grant of its own. It publishes mail.mask.created and mail.received through Events, but their payload contracts are not in this release, so eventsProduced stays empty until they are. The mask domain, the burner domains and mail.openvibe.email receive SMTP only and are not HTTP origins.",
++ "health": "/api/health",
++ "ready": "/api/ready",
++ "internalOrigin": "http://127.0.0.1:5250",
++ "site": {
++ "name": "Email",
++ "icon": "mail",
++ "tagline": "An address for every sign-up",
++ "what": "Ten-minute addresses that show you the code, and inboxes for your agents. Receive only.",
++ "legalProfile": "service",
++ "position": 7,
++ "neighbourhood": "people"
++ }
++}
ddiff --git a/manifests/services/media-hub.json b/manifests/services/media-hub.json
iindex 1abb7da3..a74f5a36 100644
---- a/manifests/services/media-hub.json
++++ b/manifests/services/media-hub.json
@@@ -101,7 +101,7 @@
"tagline": "Videos, pictures and your files",
"what": "A 25 GB drive with share links and folder backups (openvibe.download), videos you upload or record with AI captions, chapters and the AI cut, plus Live's recordings (openvibe.video), and pictures with embed links, albums, any size and format, and alt text (openvibe.pics).",
"legalProfile": "hosting",
-- "position": 20,
++ "position": 21,
"neighbourhood": "streams"
}
}
ddiff --git a/manifests/services/meme.json b/manifests/services/meme.json
iindex 745fffbb..e7602038 100644
---- a/manifests/services/meme.json
++++ b/manifests/services/meme.json
@@@ -75,7 +75,7 @@
"tagline": "The internet's meme database",
"what": "Every entry in the open meme database cites the chat line or VOD second it came from, follows the later uses on a timeline, and keeps a status. Vote for meme of the week, caption a template, and report what needs fixing.",
"legalProfile": "ugc",
-- "position": 42,
++ "position": 43,
"neighbourhood": "games"
}
}
ddiff --git a/manifests/services/news.json b/manifests/services/news.json
iindex 19812e71..b95b4513 100644
---- a/manifests/services/news.json
++++ b/manifests/services/news.json
@@@ -24,7 +24,7 @@
"tagline": "Sourced, not spun",
"what": "Source-backed stories: clustered coverage, cited summaries, multiple perspectives and timelines.",
"legalProfile": "info",
-- "position": 10,
++ "position": 11,
"tld": "news",
"accent": "#fb923c",
"description": "OpenVibe.News aggregates the news with transparency: sourced stories, summaries that show their sources, multiple angles side by side, topic pages and framing you control — not an algorithm you can't see.",
ddiff --git a/manifests/services/openre.json b/manifests/services/openre.json
iindex 916f4e3a..ca274b8f 100644
---- a/manifests/services/openre.json
++++ b/manifests/services/openre.json
@@@ -25,7 +25,7 @@
"tagline": "Go live once, stream everywhere",
"what": "Open restreaming: one stream to Twitch, YouTube, Kick and any RTMP or SRT server at once, with OpenVibe Live on by default.",
"legalProfile": "service",
-- "position": 18,
++ "position": 19,
"tld": "stream",
"accent": "#ef4444",
"description": "OpenRestream is an open restreaming platform. Send one stream from OBS or any RTMP encoder and it goes to Twitch, YouTube, Kick and any RTMP, RTMPS or SRT destination at the same time, each with its own health, logs and retries. Your OpenVibe Live channel is on by default, so every stream also shows on openvibe.live with its chat, clips and VODs; switch it off for any stream. It is free and open source, with no follower minimum. No OBS? Go live from your browser on OpenVibe.Live.",
ddiff --git a/manifests/services/play.json b/manifests/services/play.json
iindex 327e9bff..952d09a0 100644
---- a/manifests/services/play.json
++++ b/manifests/services/play.json
@@@ -87,7 +87,7 @@
"tagline": "Achievements, leaderboards and cloud saves for every game",
"what": "See this week's leaders and the all-time boards of every OpenVibe game, every achievement you have unlocked, and the saves games keep for you so your progress follows you to any device.",
"legalProfile": "ugc",
-- "position": 35,
++ "position": 36,
"faq": [
{
"question": "What is OpenVibe Play?",
ddiff --git a/manifests/services/quest.json b/manifests/services/quest.json
iindex 4a45f719..0782d44c 100644
---- a/manifests/services/quest.json
++++ b/manifests/services/quest.json
@@@ -111,7 +111,7 @@
"tagline": "Badges for what you really do",
"what": "One quest log across every OpenVibe site: real things you do on the network complete quests that pay badges and OpenCoins, and developer apps add quests on their own events.",
"legalProfile": "account",
-- "position": 27,
++ "position": 28,
"neighbourhood": "games"
}
}
ddiff --git a/manifests/services/rent.json b/manifests/services/rent.json
iindex 8f60dd6a..7617cbb2 100644
---- a/manifests/services/rent.json
++++ b/manifests/services/rent.json
@@@ -86,7 +86,7 @@
"tagline": "Every rental site, one search",
"what": "Search Craigslist, Facebook Marketplace, Zillow, Apartments.com, Zumper and more at once for apartments, houses, rooms, stays, commercial space, parking, storage and cars, next to affordable housing from HUD and listings people post here.",
"legalProfile": "ugc",
-- "position": 28,
++ "position": 29,
"neighbourhood": "shop"
}
}
ddiff --git a/manifests/services/report.json b/manifests/services/report.json
iindex 210108a3..1a44dfe4 100644
---- a/manifests/services/report.json
++++ b/manifests/services/report.json
@@@ -78,7 +78,7 @@
"tagline": "Every number on OpenVibe, honest",
"what": "The network's numbers open to everyone, what streamers talked about in The Rundown, and every stream's after-show report, each number with its definition and its date.",
"legalProfile": "public",
-- "position": 38,
++ "position": 39,
"neighbourhood": "answers"
}
}
ddiff --git a/manifests/services/reviews.json b/manifests/services/reviews.json
iindex 5d199213..e0c2090d 100644
---- a/manifests/services/reviews.json
++++ b/manifests/services/reviews.json
@@@ -24,7 +24,7 @@
"tagline": "Reviews with receipts",
"what": "Review signals gathered across sources with provenance, pros and cons, and community discussion. No invented ratings.",
"legalProfile": "ugc",
-- "position": 11,
++ "position": 12,
"tld": "reviews",
"accent": "#facc15",
"description": "OpenVibe.Reviews gathers what people say about products, services, employers, hosts and communities across many sources — with provenance, without fake ratings — and lets the community discuss it.",
ddiff --git a/manifests/services/run.json b/manifests/services/run.json
iindex 5c32c75a..5ee23a67 100644
---- a/manifests/services/run.json
++++ b/manifests/services/run.json
@@@ -97,7 +97,7 @@
"tagline": "Run jobs on machines that can",
"what": "Send a job to one API with your project's token: Compute places it on a node that offers its runtime, streams its output and meters it per second.",
"legalProfile": "hosting",
-- "position": 34,
++ "position": 35,
"tld": "run",
"accent": "#a78bfa",
"description": "OpenVibe.Run executes jobs: a project submits a job (a pre-registered artifact, its input and its limits) to one API, Run chooses a node from the network's offers that its requirements allow, OpenVibe.Bot hands it to the node and meters every wall-clock second, the output streams back, and the job ends succeeded, failed, cancelled or expired. Alpha: jobs run on nodes paired with OpenVibe through the OpenVibe Node.",
ddiff --git a/manifests/services/search.json b/manifests/services/search.json
iindex 13862695..4db5ceb3 100644
---- a/manifests/services/search.json
++++ b/manifests/services/search.json
@@@ -91,7 +91,7 @@
"tagline": "Search the OpenVibe network",
"what": "One search box over what the network's services have published: streams, clips, pastes, wiki pages, news and more, from OpenVibe's own index.",
"legalProfile": "public",
-- "position": 33,
++ "position": 34,
"faq": [
{
"question": "What does OpenVibe Search cover?",
ddiff --git a/manifests/services/services.json b/manifests/services/services.json
iindex f48b0a4f..a94a9a99 100644
---- a/manifests/services/services.json
++++ b/manifests/services/services.json
@@@ -92,7 +92,7 @@
"tagline": "Build on OpenVibe",
"what": "The developer platform: projects, apps, keys, grants and usage; API, contract, SDK and event docs; OAuth and webhook tools, playgrounds and app releases.",
"legalProfile": "ugc",
-- "position": 7,
++ "position": 8,
"neighbourhood": "build"
}
}
ddiff --git a/manifests/services/shoes.json b/manifests/services/shoes.json
iindex bd0528e4..cba4addd 100644
---- a/manifests/services/shoes.json
++++ b/manifests/services/shoes.json
@@@ -78,7 +78,7 @@
"tagline": "Every shoe, every market, the right price",
"what": "Shoe offers from OpenVibe.Deals, one page per model with every store, price history and the time each price was checked, a cited drops calendar, and price alerts through OpenVibe.Watch. No affiliate links, no raffle bots.",
"legalProfile": "ugc",
-- "position": 50,
++ "position": 51,
"neighbourhood": "shop"
}
}
ddiff --git a/manifests/services/space.json b/manifests/services/space.json
iindex 88dcc500..34dd3aa8 100644
---- a/manifests/services/space.json
++++ b/manifests/services/space.json
@@@ -22,7 +22,7 @@
"tagline": "Make a space: an app on your account",
"what": "Small apps on your OpenVibe account: describe one and OpenVibe AI builds it, or start from a template and change anything in the editor. Spaces sign visitors in, keep shared lists and private data, talk to OpenVibe AI and run their own server code. Static site hosting too.",
"legalProfile": "ugc",
-- "position": 19,
++ "position": 20,
"tld": "space",
"accent": "#818cf8",
"description": "OpenVibe.Space is where you make spaces, small web apps on your OpenVibe account that OpenVibe AI builds from a description or a template, and host static sites: immutable deploys, one-step rollback, private previews, deploys from a public Git repository and custom domains after a TXT check, with names under openvibe.website. Publishing at a public address is open to OpenVibe staff while abuse handling and a designated DMCA agent are put in place. The old /s/* forum paths redirect to openvibe.community.",
ddiff --git a/manifests/services/surf.json b/manifests/services/surf.json
iindex c60dcf32..25d2fc3f 100644
---- a/manifests/services/surf.json
++++ b/manifests/services/surf.json
@@@ -68,7 +68,7 @@
"tagline": "Ride, browse, watch",
"what": "Ride Counter-Strike-style surf maps in the browser against the clock, let an agent surf the web for you and report back with its sources, or lean back and surf what is on across OpenVibe.",
"legalProfile": "service",
-- "position": 41,
++ "position": 42,
"neighbourhood": "games"
}
}
ddiff --git a/manifests/services/tips.json b/manifests/services/tips.json
iindex ce111206..042b7738 100644
---- a/manifests/services/tips.json
++++ b/manifests/services/tips.json
@@@ -24,7 +24,7 @@
"tagline": "Tips, paid messages and alerts for any stream",
"what": "A tip page and alert kit for creators on any platform: tips, paid messages, text-to-speech and media requests, goals and OBS overlays, settled by the network’s billing ledger.",
"legalProfile": "streaming",
-- "position": 12,
++ "position": 13,
"tld": "tips",
"accent": "#4ade80",
"description": "OpenVibe.Tips gives every creator a tip page at openvibe.tips/<name> and an alert kit for their stream, wherever they stream: supporters send a tip, a highlighted paid message, a message read out on stream or a video request, within the creator’s own limits, and an overlay link shows each one in OBS as it lands, next to the creator’s goals. It works for OpenVibe.Live, Twitch, YouTube and Kick alike. Payments settle in OpenVibe.Billing, and every receipt shows separately when the payment settled and when the message was delivered.",
ddiff --git a/manifests/services/today.json b/manifests/services/today.json
iindex 6f855aa7..6fdb6476 100644
---- a/manifests/services/today.json
++++ b/manifests/services/today.json
@@@ -90,7 +90,7 @@
"tagline": "Everything happening for you, today",
"what": "Stream schedules, reminders that find you on any OpenVibe site, calendar feeds for your own calendar app, and a morning brief, all in one place.",
"legalProfile": "account",
-- "position": 40,
++ "position": 41,
"neighbourhood": "answers"
}
}
ddiff --git a/manifests/services/tours.json b/manifests/services/tours.json
iindex 061cef41..eaa226d6 100644
---- a/manifests/services/tours.json
++++ b/manifests/services/tours.json
@@@ -78,7 +78,7 @@
"tagline": "Go anywhere: fly, stay, walk, watch",
"what": "A hundred cities from Wikivoyage and OpenStreetMap with cited places and walking routes, live IRL streams and recordings from OpenVibe.Live, stays from OpenVibe.Rent, and trips you plan and share. Flights link out, no affiliate.",
"legalProfile": "ugc",
-- "position": 49,
++ "position": 50,
"neighbourhood": "streams"
}
}
ddiff --git a/manifests/services/trade.json b/manifests/services/trade.json
iindex 794ce2ea..b62ba689 100644
---- a/manifests/services/trade.json
++++ b/manifests/services/trade.json
@@@ -24,7 +24,7 @@
"tagline": "Watchlists and alerts",
"what": "Informational watchlists, sourced market context and alerts. No custody, no order execution.",
"legalProfile": "ugc",
-- "position": 14,
++ "position": 15,
"tld": "trade",
"accent": "#60a5fa",
"description": "OpenVibe.Trade is the market intelligence room of the OpenVibe network: every company on SEC's ticker list with its filings and reported numbers, AI briefs that cite every line, watchlists and alerts — information and tools, never advice.",
ddiff --git a/manifests/services/vip.json b/manifests/services/vip.json
iindex 3f10292d..a1e7c41b 100644
---- a/manifests/services/vip.json
++++ b/manifests/services/vip.json
@@@ -24,7 +24,7 @@
"tagline": "Memberships for creators and their software",
"what": "Memberships open to anyone on OpenVibe: creators publish plans with perks, members join through the network’s billing ledger, and apps and tools check a membership with the SDK.",
"legalProfile": "account",
-- "position": 13,
++ "position": 14,
"tld": "vip",
"accent": "#e879f9",
"description": "OpenVibe.VIP is a membership site, like Patreon, open to anyone with an OpenVibe account. A creator publishes plans with perks, and members join from their Vibes credit or another way OpenVibe.Billing offers. The perks follow them across OpenVibe: a badge in chat, members-only posts and rooms, roles and emotes. Plans are versioned, so members keep the terms they joined under. Developers sell subscriptions to their own apps and tools the same way: the app signs a person in with OpenVibe and asks VIP whether they are a member (openvibe-sdk/vip).",
ddiff --git a/manifests/services/vision.json b/manifests/services/vision.json
iindex fb192d5b..fa6ebf19 100644
---- a/manifests/services/vision.json
++++ b/manifests/services/vision.json
@@@ -111,7 +111,7 @@
"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,
++ "position": 44,
"neighbourhood": "answers"
}
}
ddiff --git a/manifests/services/watch.json b/manifests/services/watch.json
iindex 513f5341..68ec5bea 100644
---- a/manifests/services/watch.json
++++ b/manifests/services/watch.json
@@@ -105,7 +105,7 @@
"tagline": "Know the moment it changes",
"what": "Watch a page, a feed or a JSON API and get told when the value you care about changes or crosses the line you set, checked politely on your cadence.",
"legalProfile": "service",
-- "position": 29,
++ "position": 30,
"neighbourhood": "build"
}
}
ddiff --git a/manifests/services/wiki.json b/manifests/services/wiki.json
iindex 30d65d51..f023bf2d 100644
---- a/manifests/services/wiki.json
++++ b/manifests/services/wiki.json
@@@ -24,7 +24,7 @@
"tagline": "Knowledge, with sources",
"what": "Wiki spaces with page trees, revision history, citations and discussion, editable together.",
"legalProfile": "ugc",
-- "position": 9,
++ "position": 10,
"faq": [
{
"question": "Can I start my own wiki?",
ddiff --git a/manifests/services/work.json b/manifests/services/work.json
iindex 66f1c4d4..7a472b62 100644
---- a/manifests/services/work.json
++++ b/manifests/services/work.json
@@@ -84,7 +84,7 @@
"tagline": "Find work, with an agent on your side",
"what": "Job listings from open job boards in one search, saved searches that tell you what is new, and an application tracker where your agent helps you prepare.",
"legalProfile": "info",
-- "position": 26,
++ "position": 27,
"neighbourhood": "shop"
}
}
ddiff --git a/manifests/services/zone.json b/manifests/services/zone.json
iindex 4daf88e8..548f2233 100644
---- a/manifests/services/zone.json
++++ b/manifests/services/zone.json
@@@ -91,7 +91,7 @@
"tagline": "Private S3-compatible storage for your projects",
"what": "Named storage zones for each project and environment: buckets that the AWS SDKs, rclone and backup tools reach over S3, with access keys you scope to a zone and quotas you set.",
"legalProfile": "ugc",
-- "position": 36,
++ "position": 37,
"neighbourhood": "build"
}
}
ddiff --git a/package-lock.json b/package-lock.json
iindex 9860fe9b..1b32d4c3 100644
---- a/package-lock.json
++++ b/package-lock.json
@@@ -1,12 +1,12 @@
{
"name": "openvibe-contracts",
-- "version": "0.329.0",
++ "version": "0.330.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "openvibe-contracts",
-- "version": "0.329.0",
++ "version": "0.330.0",
"license": "AGPL-3.0-only",
"dependencies": {
"ajv": "^8.17.1",
ddiff --git a/package.json b/package.json
iindex 4293748e..65f4b998 100644
---- a/package.json
++++ b/package.json
@@@ -1,6 +1,6 @@
{
"name": "openvibe-contracts",
-- "version": "0.329.0",
++ "version": "0.330.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",