openvibers/openvibe.contracts Commits

Contracts 0.150.0: Host's engine ids retired (Space serves space.*); OpenVibe.Video is live (#106)

OP OpenVibers committed 12 Oct 2026 · 5089373adf · 47 files, +554 −4364

Plan T20, last step: OpenVibe.Host removed its copy of the static hosting engine (Host#84, live: the old routes answer 410 `host.moved_to_space`). OpenVibe.Space serves the engine as `space.*` since 0.149.0 (Space#36, live).

- **Retired:** the five engine capabilities (`host.site.manage`, `host.deploy.create`, `host.domain.manage`, `host.site.config`, `host.resource.read`), now with no routes, and the fourteen engine schemas (including the `host.deploy.activated` payload). The schemas stay loadable, and `compatibility/deprecations.json` names each `space.*` twin until 1.0.0.
- **Host manifest:** `host.catalog.manage` only; it produces `host.release.published` and `host.index_document.*`. Its notes describe the catalog and where Stage B went.
- **OpenVibe.Video is live** (MediaHub#28): the `openvibe.video` product text and the media-hub manifest describe what it serves (watch pages for Live's recordings and clips, AI chapters and captions) and what is not built. `video.*` stays planned until an app may call it.
- **Test:** the release-notification test now checks tenant activations as `space.deploy.activated` (Space produces it) and `host.deploy.activated` as retired.

`generate.js`, `compat.js v0.149.0` (no breaking changes) and the full suite (19,281 checks) pass.

Changes

ddiff --git a/CHANGELOG.md b/CHANGELOG.md
iindex 825f109a..e64f414a 100644
---- a/CHANGELOG.md
++++ b/CHANGELOG.md
@@@ -4,6 +4,18 @@ All notable changes to `openvibe-contracts`. Releases are git tags (`vX.Y.Z`) th
from `https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/<tag>`. Before v0.30.0,
the notes were in the tag and commit messages (`git tag -n1`).
++## 0.150.0 — 2026-10-12
++
++- OpenVibe.Host removed its copy of the static hosting engine (Host#84); OpenVibe.Space serves it as `space.*` (0.149.0).
++ The five engine capabilities (`host.site.manage`, `host.deploy.create`, `host.domain.manage`, `host.site.config`,
++ `host.resource.read`) are retired with no routes, and the fourteen engine schemas (project, site, deploy, domain,
++ site-config, their request/result pairs and the `host.deploy.activated` payload) are retired but stay loadable, each
++ deprecated in favour of its `space.*` twin until 1.0.0. The host manifest keeps `host.catalog.manage`,
++ `host.index_document.*` and `host.release.published`; Host answers the old routes with 410 `host.moved_to_space`.
++- OpenVibe.Video's first slice is live on openvibe.video (MediaHub#28): the product text and the media-hub manifest say what
++ it serves (watch pages for Live's recordings and clips, AI chapters and captions) and what is not built. `video.*` stays
++ planned.
++
## 0.149.0 — 2026-10-12
- The static hosting engine moved from OpenVibe.Host to OpenVibe.Space (plan T20 step 2), so its contracts are now
ddiff --git a/compatibility/deprecations.json b/compatibility/deprecations.json
iindex f7567c7f..6e076f9a 100644
---- a/compatibility/deprecations.json
++++ b/compatibility/deprecations.json
@@@ -112,6 +112,104 @@
"since": "0.113.0",
"removeAfter": "1.0.0",
"reason": "the developer portal (manifests, releases, trust, playgrounds) moves from OpenVibe.Codes to OpenVibe.Services (owner 2026-10-08; Codes becomes the open coding-agent harness); retired at once, kept loadable for historical events and compatibility"
++ },
++ {
++ "id": "host.deploy-create-request",
++ "replacement": "space.deploy-create-request@1",
++ "since": "0.150.0",
++ "removeAfter": "1.0.0",
++ "reason": "the static hosting engine moved from OpenVibe.Host to OpenVibe.Space (2026-10-12, plan T20)"
++ },
++ {
++ "id": "host.deploy-create-result",
++ "replacement": "space.deploy-create-result@1",
++ "since": "0.150.0",
++ "removeAfter": "1.0.0",
++ "reason": "the static hosting engine moved from OpenVibe.Host to OpenVibe.Space (2026-10-12, plan T20)"
++ },
++ {
++ "id": "host.deploy",
++ "replacement": "space.deploy@1",
++ "since": "0.150.0",
++ "removeAfter": "1.0.0",
++ "reason": "the static hosting engine moved from OpenVibe.Host to OpenVibe.Space (2026-10-12, plan T20)"
++ },
++ {
++ "id": "host.domain-manage-request",
++ "replacement": "space.domain-manage-request@1",
++ "since": "0.150.0",
++ "removeAfter": "1.0.0",
++ "reason": "the static hosting engine moved from OpenVibe.Host to OpenVibe.Space (2026-10-12, plan T20)"
++ },
++ {
++ "id": "host.domain-manage-result",
++ "replacement": "space.domain-manage-result@1",
++ "since": "0.150.0",
++ "removeAfter": "1.0.0",
++ "reason": "the static hosting engine moved from OpenVibe.Host to OpenVibe.Space (2026-10-12, plan T20)"
++ },
++ {
++ "id": "host.domain",
++ "replacement": "space.domain@1",
++ "since": "0.150.0",
++ "removeAfter": "1.0.0",
++ "reason": "the static hosting engine moved from OpenVibe.Host to OpenVibe.Space (2026-10-12, plan T20)"
++ },
++ {
++ "id": "host.project",
++ "replacement": "space.project@1",
++ "since": "0.150.0",
++ "removeAfter": "1.0.0",
++ "reason": "the static hosting engine moved from OpenVibe.Host to OpenVibe.Space (2026-10-12, plan T20)"
++ },
++ {
++ "id": "host.site-manage-request",
++ "replacement": "space.site-manage-request@1",
++ "since": "0.150.0",
++ "removeAfter": "1.0.0",
++ "reason": "the static hosting engine moved from OpenVibe.Host to OpenVibe.Space (2026-10-12, plan T20)"
++ },
++ {
++ "id": "host.site-manage-result",
++ "replacement": "space.site-manage-result@1",
++ "since": "0.150.0",
++ "removeAfter": "1.0.0",
++ "reason": "the static hosting engine moved from OpenVibe.Host to OpenVibe.Space (2026-10-12, plan T20)"
++ },
++ {
++ "id": "host.site",
++ "replacement": "space.site@1",
++ "since": "0.150.0",
++ "removeAfter": "1.0.0",
++ "reason": "the static hosting engine moved from OpenVibe.Host to OpenVibe.Space (2026-10-12, plan T20)"
++ },
++ {
++ "id": "host.site-config",
++ "replacement": "space.site-config@1",
++ "since": "0.150.0",
++ "removeAfter": "1.0.0",
++ "reason": "the static hosting engine moved from OpenVibe.Host to OpenVibe.Space (2026-10-12, plan T20)"
++ },
++ {
++ "id": "host.site-config-request",
++ "replacement": "space.site-config-request@1",
++ "since": "0.150.0",
++ "removeAfter": "1.0.0",
++ "reason": "the static hosting engine moved from OpenVibe.Host to OpenVibe.Space (2026-10-12, plan T20)"
++ },
++ {
++ "id": "host.site-config-result",
++ "replacement": "space.site-config-result@1",
++ "since": "0.150.0",
++ "removeAfter": "1.0.0",
++ "reason": "the static hosting engine moved from OpenVibe.Host to OpenVibe.Space (2026-10-12, plan T20)"
++ },
++ {
++ "id": "host.deploy.activated",
++ "replacement": "space.deploy.activated@1",
++ "since": "0.150.0",
++ "removeAfter": "1.0.0",
++ "reason": "the static hosting engine moved from OpenVibe.Host to OpenVibe.Space (2026-10-12, plan T20)"
}
]
}
ddiff --git a/contracts/catalog.json b/contracts/catalog.json
iindex c6d29eeb..2dde8a4d 100644
---- a/contracts/catalog.json
++++ b/contracts/catalog.json
@@@ -5468,7 +5468,7 @@
"schema": "host/deploy-create-request.v1.json",
"visibility": "first-party",
"compatibility": "backward",
-- "status": "active"
++ "status": "retired"
},
{
"id": "host.deploy-create-result",
@@@ -5477,7 +5477,7 @@
"schema": "host/deploy-create-result.v1.json",
"visibility": "first-party",
"compatibility": "backward",
-- "status": "active"
++ "status": "retired"
},
{
"id": "host.deploy",
@@@ -5486,7 +5486,7 @@
"schema": "host/deploy.v1.json",
"visibility": "first-party",
"compatibility": "backward",
-- "status": "active"
++ "status": "retired"
},
{
"id": "host.domain-manage-request",
@@@ -5495,7 +5495,7 @@
"schema": "host/domain-manage-request.v1.json",
"visibility": "first-party",
"compatibility": "backward",
-- "status": "active"
++ "status": "retired"
},
{
"id": "host.domain-manage-result",
@@@ -5504,7 +5504,7 @@
"schema": "host/domain-manage-result.v1.json",
"visibility": "first-party",
"compatibility": "backward",
-- "status": "active"
++ "status": "retired"
},
{
"id": "host.domain",
@@@ -5513,7 +5513,7 @@
"schema": "host/domain.v1.json",
"visibility": "first-party",
"compatibility": "backward",
-- "status": "active"
++ "status": "retired"
},
{
"id": "host.project",
@@@ -5522,7 +5522,7 @@
"schema": "host/project.v1.json",
"visibility": "first-party",
"compatibility": "backward",
-- "status": "active"
++ "status": "retired"
},
{
"id": "host.site-manage-request",
@@@ -5531,7 +5531,7 @@
"schema": "host/site-manage-request.v1.json",
"visibility": "first-party",
"compatibility": "backward",
-- "status": "active"
++ "status": "retired"
},
{
"id": "host.site-config",
@@@ -5540,7 +5540,7 @@
"schema": "host/site-config.v1.json",
"visibility": "first-party",
"compatibility": "backward",
-- "status": "active"
++ "status": "retired"
},
{
"id": "host.site-config-request",
@@@ -5549,7 +5549,7 @@
"schema": "host/site-config-request.v1.json",
"visibility": "first-party",
"compatibility": "backward",
-- "status": "active"
++ "status": "retired"
},
{
"id": "host.site-config-result",
@@@ -5558,7 +5558,7 @@
"schema": "host/site-config-result.v1.json",
"visibility": "first-party",
"compatibility": "backward",
-- "status": "active"
++ "status": "retired"
},
{
"id": "host.deploy.activated",
@@@ -5567,7 +5567,7 @@
"schema": "events/payloads/host.deploy.activated.v1.json",
"visibility": "first-party",
"compatibility": "backward",
-- "status": "active",
++ "status": "retired",
"adr": "ADR-004"
},
{
@@@ -5587,7 +5587,7 @@
"schema": "host/site-manage-result.v1.json",
"visibility": "first-party",
"compatibility": "backward",
-- "status": "active"
++ "status": "retired"
},
{
"id": "host.catalog-manage-request",
@@@ -5614,7 +5614,7 @@
"schema": "host/site.v1.json",
"visibility": "first-party",
"compatibility": "backward",
-- "status": "active"
++ "status": "retired"
},
{
"id": "network.node",
ddiff --git a/generated/json-schema/bundle.json b/generated/json-schema/bundle.json
iindex 247d1eb6..a30287a9 100644
---- a/generated/json-schema/bundle.json
++++ b/generated/json-schema/bundle.json
@@@ -61896,7 +61896,7 @@
"host.deploy-create-request": {
"version": "1.0.0",
"owner": "host",
-- "status": "active",
++ "status": "retired",
"schema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://openvibe.network/contracts/host/deploy-create-request.v1.json",
@@@ -61945,7 +61945,7 @@
"host.deploy-create-result": {
"version": "1.0.0",
"owner": "host",
-- "status": "active",
++ "status": "retired",
"schema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://openvibe.network/contracts/host/deploy-create-result.v1.json",
@@@ -62121,7 +62121,7 @@
"host.deploy": {
"version": "1.0.0",
"owner": "host",
-- "status": "active",
++ "status": "retired",
"schema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://openvibe.network/contracts/host/deploy.v1.json",
@@@ -62293,7 +62293,7 @@
"host.domain-manage-request": {
"version": "1.0.0",
"owner": "host",
-- "status": "active",
++ "status": "retired",
"schema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://openvibe.network/contracts/host/domain-manage-request.v1.json",
@@@ -62323,7 +62323,7 @@
"host.domain-manage-result": {
"version": "1.0.0",
"owner": "host",
-- "status": "active",
++ "status": "retired",
"schema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://openvibe.network/contracts/host/domain-manage-result.v1.json",
@@@ -62372,7 +62372,7 @@
"host.domain": {
"version": "1.0.0",
"owner": "host",
-- "status": "active",
++ "status": "retired",
"schema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://openvibe.network/contracts/host/domain.v1.json",
@@@ -62508,7 +62508,7 @@
"host.project": {
"version": "1.0.0",
"owner": "host",
-- "status": "active",
++ "status": "retired",
"schema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://openvibe.network/contracts/host/project.v1.json",
@@@ -62672,7 +62672,7 @@
"host.site-manage-request": {
"version": "1.0.0",
"owner": "host",
-- "status": "active",
++ "status": "retired",
"schema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://openvibe.network/contracts/host/site-manage-request.v1.json",
@@@ -62828,7 +62828,7 @@
"host.site-config": {
"version": "1.0.0",
"owner": "host",
-- "status": "active",
++ "status": "retired",
"schema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://openvibe.network/contracts/host/site-config.v1.json",
@@@ -62895,7 +62895,7 @@
"host.site-config-request": {
"version": "1.0.0",
"owner": "host",
-- "status": "active",
++ "status": "retired",
"schema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://openvibe.network/contracts/host/site-config-request.v1.json",
@@@ -62946,7 +62946,7 @@
"host.site-config-result": {
"version": "1.0.0",
"owner": "host",
-- "status": "active",
++ "status": "retired",
"schema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://openvibe.network/contracts/host/site-config-result.v1.json",
@@@ -62967,7 +62967,7 @@
"host.deploy.activated": {
"version": "1.0.0",
"owner": "host",
-- "status": "active",
++ "status": "retired",
"schema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://openvibe.network/contracts/events/payloads/host.deploy.activated.v1.json",
@@@ -63107,7 +63107,7 @@
"host.site-manage-result": {
"version": "1.0.0",
"owner": "host",
-- "status": "active",
++ "status": "retired",
"schema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://openvibe.network/contracts/host/site-manage-result.v1.json",
@@@ -63705,7 +63705,7 @@
"host.site": {
"version": "1.0.0",
"owner": "host",
-- "status": "active",
++ "status": "retired",
"schema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://openvibe.network/contracts/host/site.v1.json",
ddiff --git a/generated/openapi/actor.json b/generated/openapi/actor.json
iindex 60decae4..6b465cae 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.149.0",
-- "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for 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.150.0",
++ "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for 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 06c92a59..416389ac 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.149.0",
-- "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for 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.150.0",
++ "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for 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 ccba1d22..bdf03a97 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.149.0",
-- "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for 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.150.0",
++ "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for 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 9ea7e238..d9c3e3a6 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.149.0",
-- "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for 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.150.0",
++ "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for 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 d81d025c..a8e2a98f 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.149.0",
-- "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for 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.150.0",
++ "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for 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 107ba742..8d61fe36 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.149.0",
-- "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for 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.150.0",
++ "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for 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 e777b4fc..bda6c573 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.149.0",
-- "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for 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.150.0",
++ "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for 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 fd869195..404fcd91 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.149.0",
-- "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for 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.150.0",
++ "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for 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 9317f2e4..50b564b7 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.149.0",
-- "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for 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.150.0",
++ "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for 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 8f44836d..6c9a1af1 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.149.0",
-- "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for 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.150.0",
++ "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for 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 dc52f1a6..265d8f10 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.149.0",
-- "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for 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.150.0",
++ "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for 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 959b0b5b..068478ca 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.149.0",
-- "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for 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.150.0",
++ "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for 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 6e5f400a..7838ead8 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.149.0",
-- "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for 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.150.0",
++ "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for 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"
@@@ -381,4251 +381,378 @@
}
}
}
-- },
-- "/api/v1/deploys/{id}": {
-- "delete": {
-- "operationId": "delete_api_v1_deploys_id",
-- "summary": "Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner ",
-- "description": "**host.site.manage** (first-party): Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner role), create and delete sites, delete a deploy that is not active. Also judged by the acting principal's project role; a sandbox token (env=sandbox) is refused on production projects. Quota changes and takedowns (stop serving a site or a whole project while keeping its content for review; lift) additionally need a Network staff user. Read, set or remove a site's Git source (provider, public repository URL and branch; never a credential).",
-- "tags": [
-- "host.site"
-- ],
-- "x-openvibe-capabilities": [
-- "host.site.manage"
-- ],
-- "x-openvibe-visibility": [
-- "first-party"
-- ],
-- "x-openvibe-quota-class": "host-manage",
-- "security": [
-- {
-- "openvibeToken": [
-- "host.site.manage"
-- ]
-- }
-- ],
-- "x-openvibe-input": {
-- "$ref": "#/components/schemas/host.site-manage-request.v1"
-- },
-- "parameters": [
-- {
-- "name": "id",
-- "in": "path",
-- "required": true,
-- "schema": {
-- "type": "string"
-- }
-- }
-- ],
-- "responses": {
-- "2XX": {
-- "description": "Success",
-- "content": {
-- "application/json": {
-- "schema": {
-- "$ref": "#/components/schemas/host.site-manage-result.v1"
-- }
-- }
-- }
-- },
-- "default": {
-- "description": "An error (RFC 9457 problem details)",
-- "content": {
-- "application/problem+json": {
-- "schema": {
-- "$ref": "#/components/schemas/errors.problem.v1"
-- }
-- }
-- }
-- }
-- }
-- },
-- "get": {
-- "operationId": "get_api_v1_deploys_id",
-- "summary": "Upload an immutable static deploy (tar/tar.gz or multipart files; validated for path traversal, links, special and hidden files, server-side code, file types and quotas; never executed), list deploys ",
-- "description": "**host.deploy.create** (first-party): Upload an immutable static deploy (tar/tar.gz or multipart files; validated for path traversal, links, special and hidden files, server-side code, file types and quotas; never executed), list deploys and their upload logs, activate a deploy and roll a site back to any earlier ready deploy (one atomic pointer switch). Also judged by the acting principal's project role (deployer or above); an app principal added to a project as deployer can deploy from CI. A site with a Git source also accepts a CI-built deploy at /sites/:id/source/deploys naming the ref and full commit_sha; it is always a preview and records that commit as immutable provenance.",
-- "tags": [
-- "host.deploy"
-- ],
-- "x-openvibe-capabilities": [
-- "host.deploy.create"
-- ],
-- "x-openvibe-visibility": [
-- "first-party"
-- ],
-- "x-openvibe-quota-class": "host-deploy",
-- "security": [
-- {
-- "openvibeToken": [
-- "host.deploy.create"
-- ]
-- }
-- ],
-- "x-openvibe-input": {
-- "$ref": "#/components/schemas/host.deploy-create-request.v1"
-- },
-- "parameters": [
-- {
-- "name": "id",
-- "in": "path",
-- "required": true,
-- "schema": {
-- "type": "string"
-- }
-- }
-- ],
-- "responses": {
-- "2XX": {
-- "description": "Success",
-- "content": {
-- "application/json": {
-- "schema": {
-- "$ref": "#/components/schemas/host.deploy-create-result.v1"
-- }
-- }
-- }
-- },
-- "default": {
-- "description": "An error (RFC 9457 problem details)",
-- "content": {
-- "application/problem+json": {
-- "schema": {
-- "$ref": "#/components/schemas/errors.problem.v1"
-- }
-- }
-- }
-- }
-- }
-- }
-- },
-- "/api/v1/deploys/{id}/activate": {
-- "post": {
-- "operationId": "post_api_v1_deploys_id_activate",
-- "summary": "Upload an immutable static deploy (tar/tar.gz or multipart files; validated for path traversal, links, special and hidden files, server-side code, file types and quotas; never executed), list deploys ",
-- "description": "**host.deploy.create** (first-party): Upload an immutable static deploy (tar/tar.gz or multipart files; validated for path traversal, links, special and hidden files, server-side code, file types and quotas; never executed), list deploys and their upload logs, activate a deploy and roll a site back to any earlier ready deploy (one atomic pointer switch). Also judged by the acting principal's project role (deployer or above); an app principal added to a project as deployer can deploy from CI. A site with a Git source also accepts a CI-built deploy at /sites/:id/source/deploys naming the ref and full commit_sha; it is always a preview and records that commit as immutable provenance.",
-- "tags": [
-- "host.deploy"
-- ],
-- "x-openvibe-capabilities": [
-- "host.deploy.create"
-- ],
-- "x-openvibe-visibility": [
-- "first-party"
-- ],
-- "x-openvibe-quota-class": "host-deploy",
-- "security": [
-- {
-- "openvibeToken": [
-- "host.deploy.create"
-- ]
-- }
-- ],
-- "requestBody": {
-- "required": false,
-- "content": {
-- "application/json": {
-- "schema": {
-- "$ref": "#/components/schemas/host.deploy-create-request.v1"
-- }
-- }
-- }
-- },
-- "parameters": [
-- {
-- "name": "id",
-- "in": "path",
-- "required": true,
-- "schema": {
-- "type": "string"
-- }
-- }
-- ],
-- "responses": {
-- "2XX": {
-- "description": "Success",
-- "content": {
-- "application/json": {
-- "schema": {
-- "$ref": "#/components/schemas/host.deploy-create-result.v1"
-- }
-- }
-- }
-- },
-- "default": {
-- "description": "An error (RFC 9457 problem details)",
-- "content": {
-- "application/problem+json": {
-- "schema": {
-- "$ref": "#/components/schemas/errors.problem.v1"
-- }
-- }
-- }
-- }
-- }
-- }
-- },
-- "/api/v1/deploys/{id}/log": {
-- "get": {
-- "operationId": "get_api_v1_deploys_id_log",
-- "summary": "Upload an immutable static deploy (tar/tar.gz or multipart files; validated for path traversal, links, special and hidden files, server-side code, file types and quotas; never executed), list deploys ",
-- "description": "**host.deploy.create** (first-party): Upload an immutable static deploy (tar/tar.gz or multipart files; validated for path traversal, links, special and hidden files, server-side code, file types and quotas; never executed), list deploys and their upload logs, activate a deploy and roll a site back to any earlier ready deploy (one atomic pointer switch). Also judged by the acting principal's project role (deployer or above); an app principal added to a project as deployer can deploy from CI. A site with a Git source also accepts a CI-built deploy at /sites/:id/source/deploys naming the ref and full commit_sha; it is always a preview and records that commit as immutable provenance.",
-- "tags": [
-- "host.deploy"
-- ],
-- "x-openvibe-capabilities": [
-- "host.deploy.create"
-- ],
-- "x-openvibe-visibility": [
-- "first-party"
-- ],
-- "x-openvibe-quota-class": "host-deploy",
-- "security": [
-- {
-- "openvibeToken": [
-- "host.deploy.create"
-- ]
-- }
-- ],
-- "x-openvibe-input": {
-- "$ref": "#/components/schemas/host.deploy-create-request.v1"
-- },
-- "parameters": [
-- {
-- "name": "id",
-- "in": "path",
-- "required": true,
-- "schema": {
-- "type": "string"
-- }
-- }
-- ],
-- "responses": {
-- "2XX": {
-- "description": "Success",
-- "content": {
-- "application/json": {
-- "schema": {
-- "$ref": "#/components/schemas/host.deploy-create-result.v1"
-- }
-- }
-- }
-- },
-- "default": {
-- "description": "An error (RFC 9457 problem details)",
-- "content": {
-- "application/problem+json": {
-- "schema": {
-- "$ref": "#/components/schemas/errors.problem.v1"
-- }
-- }
-- }
-- }
-- }
-- }
-- },
-- "/api/v1/domains/{id}": {
-- "delete": {
-- "operationId": "delete_api_v1_domains_id",
-- "summary": "Add a custom domain to a static site (never an OpenVibe domain; not in sandbox projects), read its DNS TXT verification and routing records, trigger a verification check, and remove it.",
-- "description": "**host.domain.manage** (first-party): Add a custom domain to a static site (never an OpenVibe domain; not in sandbox projects), read its DNS TXT verification and routing records, trigger a verification check, and remove it. A custom domain is served only after its TXT record is verified; TLS certificates are issued by an operator and never pass through this capability.",
-- "tags": [
-- "host.domain"
-- ],
-- "x-openvibe-capabilities": [
-- "host.domain.manage"
-- ],
-- "x-openvibe-visibility": [
-- "first-party"
-- ],
-- "x-openvibe-quota-class": "host-manage",
-- "security": [
-- {
-- "openvibeToken": [
-- "host.domain.manage"
-- ]
-- }
-- ],
-- "x-openvibe-input": {
-- "$ref": "#/components/schemas/host.domain-manage-request.v1"
-- },
-- "parameters": [
-- {
-- "name": "id",
-- "in": "path",
-- "required": true,
-- "schema": {
-- "type": "string"
-- }
-- }
-- ],
-- "responses": {
-- "2XX": {
-- "description": "Success",
-- "content": {
-- "application/json": {
-- "schema": {
-- "$ref": "#/components/schemas/host.domain-manage-result.v1"
-- }
-- }
-- }
-- },
-- "default": {
-- "description": "An error (RFC 9457 problem details)",
-- "content": {
-- "application/problem+json": {
-- "schema": {
-- "$ref": "#/components/schemas/errors.problem.v1"
-- }
-- }
-- }
-- }
-- }
-- }
-- },
-- "/api/v1/domains/{id}/verify": {
-- "post": {
-- "operationId": "post_api_v1_domains_id_verify",
-- "summary": "Add a custom domain to a static site (never an OpenVibe domain; not in sandbox projects), read its DNS TXT verification and routing records, trigger a verification check, and remove it.",
-- "description": "**host.domain.manage** (first-party): Add a custom domain to a static site (never an OpenVibe domain; not in sandbox projects), read its DNS TXT verification and routing records, trigger a verification check, and remove it. A custom domain is served only after its TXT record is verified; TLS certificates are issued by an operator and never pass through this capability.",
-- "tags": [
-- "host.domain"
-- ],
-- "x-openvibe-capabilities": [
-- "host.domain.manage"
-- ],
-- "x-openvibe-visibility": [
-- "first-party"
-- ],
-- "x-openvibe-quota-class": "host-manage",
-- "security": [
-- {
-- "openvibeToken": [
-- "host.domain.manage"
-- ]
-- }
-- ],
-- "requestBody": {
-- "required": false,
-- "content": {
-- "application/json": {
-- "schema": {
-- "$ref": "#/components/schemas/host.domain-manage-request.v1"
-- }
-- }
-- }
-- },
-- "parameters": [
-- {
-- "name": "id",
-- "in": "path",
-- "required": true,
-- "schema": {
-- "type": "string"
-- }
-- }
-- ],
-- "responses": {
-- "2XX": {
-- "description": "Success",
-- "content": {
-- "application/json": {
-- "schema": {
-- "$ref": "#/components/schemas/host.domain-manage-result.v1"
-- }
-- }
-- }
-- },
-- "default": {
-- "description": "An error (RFC 9457 problem details)",
-- "content": {
-- "application/problem+json": {
-- "schema": {
-- "$ref": "#/components/schemas/errors.problem.v1"
-- }
-- }
-- }
-- }
-- }
-- }
-- },
-- "/api/v1/projects": {
-- "get": {
-- "operationId": "get_api_v1_projects",
-- "summary": "Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner ",
-- "description": "**host.site.manage** (first-party): Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner role), create and delete sites, delete a deploy that is not active. Also judged by the acting principal's project role; a sandbox token (env=sandbox) is refused on production projects. Quota changes and takedowns (stop serving a site or a whole project while keeping its content for review; lift) additionally need a Network staff user. Read, set or remove a site's Git source (provider, public repository URL and branch; never a credential).",
-- "tags": [
-- "host.site"
-- ],
-- "x-openvibe-capabilities": [
-- "host.site.manage"
-- ],
-- "x-openvibe-visibility": [
-- "first-party"
-- ],
-- "x-openvibe-quota-class": "host-manage",
-- "security": [
-- {
-- "openvibeToken": [
-- "host.site.manage"
-- ]
-- }
-- ],
-- "x-openvibe-input": {
-- "$ref": "#/components/schemas/host.site-manage-request.v1"
-- },
-- "responses": {
-- "2XX": {
-- "description": "Success",
-- "content": {
-- "application/json": {
-- "schema": {
-- "$ref": "#/components/schemas/host.site-manage-result.v1"
-- }
-- }
-- }
-- },
-- "default": {
-- "description": "An error (RFC 9457 problem details)",
-- "content": {
-- "application/problem+json": {
-- "schema": {
-- "$ref": "#/components/schemas/errors.problem.v1"
-- }
-- }
-- }
-- }
-- }
-- },
-- "post": {
-- "operationId": "post_api_v1_projects",
-- "summary": "Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner ",
-- "description": "**host.site.manage** (first-party): Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner role), create and delete sites, delete a deploy that is not active. Also judged by the acting principal's project role; a sandbox token (env=sandbox) is refused on production projects. Quota changes and takedowns (stop serving a site or a whole project while keeping its content for review; lift) additionally need a Network staff user. Read, set or remove a site's Git source (provider, public repository URL and branch; never a credential).",
-- "tags": [
-- "host.site"
-- ],
-- "x-openvibe-capabilities": [
-- "host.site.manage"
-- ],
-- "x-openvibe-visibility": [
-- "first-party"
-- ],
-- "x-openvibe-quota-class": "host-manage",
-- "security": [
-- {
-- "openvibeToken": [
-- "host.site.manage"
-- ]
-- }
-- ],
-- "requestBody": {
-- "required": false,
-- "content": {
-- "application/json": {
-- "schema": {
-- "$ref": "#/components/schemas/host.site-manage-request.v1"
-- }
-- }
-- }
-- },
-- "responses": {
-- "2XX": {
-- "description": "Success",
-- "content": {
-- "application/json": {
-- "schema": {
-- "$ref": "#/components/schemas/host.site-manage-result.v1"
-- }
-- }
-- }
-- },
-- "default": {
-- "description": "An error (RFC 9457 problem details)",
-- "content": {
-- "application/problem+json": {
-- "schema": {
-- "$ref": "#/components/schemas/errors.problem.v1"
-- }
-- }
-- }
-- }
-- }
-- }
-- },
-- "/api/v1/projects/{id}": {
-- "delete": {
-- "operationId": "delete_api_v1_projects_id",
-- "summary": "Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner ",
-- "description": "**host.site.manage** (first-party): Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner role), create and delete sites, delete a deploy that is not active. Also judged by the acting principal's project role; a sandbox token (env=sandbox) is refused on production projects. Quota changes and takedowns (stop serving a site or a whole project while keeping its content for review; lift) additionally need a Network staff user. Read, set or remove a site's Git source (provider, public repository URL and branch; never a credential).",
-- "tags": [
-- "host.site"
-- ],
-- "x-openvibe-capabilities": [
-- "host.site.manage"
-- ],
-- "x-openvibe-visibility": [
-- "first-party"
-- ],
-- "x-openvibe-quota-class": "host-manage",
-- "security": [
-- {
-- "openvibeToken": [
-- "host.site.manage"
-- ]
-- }
-- ],
-- "x-openvibe-input": {
-- "$ref": "#/components/schemas/host.site-manage-request.v1"
-- },
-- "parameters": [
-- {
-- "name": "id",
-- "in": "path",
-- "required": true,
-- "schema": {
-- "type": "string"
-- }
-- }
-- ],
-- "responses": {
-- "2XX": {
-- "description": "Success",
-- "content": {
-- "application/json": {
-- "schema": {
-- "$ref": "#/components/schemas/host.site-manage-result.v1"
-- }
-- }
-- }
-- },
-- "default": {
-- "description": "An error (RFC 9457 problem details)",
-- "content": {
-- "application/problem+json": {
-- "schema": {
-- "$ref": "#/components/schemas/errors.problem.v1"
-- }
-- }
-- }
-- }
-- }
-- },
-- "get": {
-- "operationId": "get_api_v1_projects_id",
-- "summary": "Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner ",
-- "description": "**host.site.manage** (first-party): Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner role), create and delete sites, delete a deploy that is not active. Also judged by the acting principal's project role; a sandbox token (env=sandbox) is refused on production projects. Quota changes and takedowns (stop serving a site or a whole project while keeping its content for review; lift) additionally need a Network staff user. Read, set or remove a site's Git source (provider, public repository URL and branch; never a credential).",
-- "tags": [
-- "host.site"
-- ],
-- "x-openvibe-capabilities": [
-- "host.site.manage"
-- ],
-- "x-openvibe-visibility": [
-- "first-party"
-- ],
-- "x-openvibe-quota-class": "host-manage",
-- "security": [
-- {
-- "openvibeToken": [
-- "host.site.manage"
-- ]
-- }
-- ],
-- "x-openvibe-input": {
-- "$ref": "#/components/schemas/host.site-manage-request.v1"
-- },
-- "parameters": [
-- {
-- "name": "id",
-- "in": "path",
-- "required": true,
-- "schema": {
-- "type": "string"
-- }
-- }
-- ],
-- "responses": {
-- "2XX": {
-- "description": "Success",
-- "content": {
-- "application/json": {
-- "schema": {
-- "$ref": "#/components/schemas/host.site-manage-result.v1"
-- }
-- }
-- }
-- },
-- "default": {
-- "description": "An error (RFC 9457 problem details)",
-- "content": {
-- "application/problem+json": {
-- "schema": {
-- "$ref": "#/components/schemas/errors.problem.v1"
-- }
-- }
-- }
-- }
-- }
-- }
-- },
-- "/api/v1/projects/{id}/members/{principal}": {
-- "delete": {
-- "operationId": "delete_api_v1_projects_id_members_principal",
-- "summary": "Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner ",
-- "description": "**host.site.manage** (first-party): Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner role), create and delete sites, delete a deploy that is not active. Also judged by the acting principal's project role; a sandbox token (env=sandbox) is refused on production projects. Quota changes and takedowns (stop serving a site or a whole project while keeping its content for review; lift) additionally need a Network staff user. Read, set or remove a site's Git source (provider, public repository URL and branch; never a credential).",
-- "tags": [
-- "host.site"
-- ],
-- "x-openvibe-capabilities": [
-- "host.site.manage"
-- ],
-- "x-openvibe-visibility": [
-- "first-party"
-- ],
-- "x-openvibe-quota-class": "host-manage",
-- "security": [
-- {
-- "openvibeToken": [
-- "host.site.manage"
-- ]
-- }
-- ],
-- "x-openvibe-input": {
-- "$ref": "#/components/schemas/host.site-manage-request.v1"
-- },
-- "parameters": [
-- {
-- "name": "id",
-- "in": "path",
-- "required": true,
-- "schema": {
-- "type": "string"
-- }
-- },
-- {
-- "name": "principal",
-- "in": "path",
-- "required": true,
-- "schema": {
-- "type": "string"
-- }
-- }
-- ],
-- "responses": {
-- "2XX": {
-- "description": "Success",
-- "content": {
-- "application/json": {
-- "schema": {
-- "$ref": "#/components/schemas/host.site-manage-result.v1"
-- }
-- }
-- }
-- },
-- "default": {
-- "description": "An error (RFC 9457 problem details)",
-- "content": {
-- "application/problem+json": {
-- "schema": {
-- "$ref": "#/components/schemas/errors.problem.v1"
-- }
-- }
-- }
-- }
-- }
-- },
-- "put": {
-- "operationId": "put_api_v1_projects_id_members_principal",
-- "summary": "Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner ",
-- "description": "**host.site.manage** (first-party): Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner role), create and delete sites, delete a deploy that is not active. Also judged by the acting principal's project role; a sandbox token (env=sandbox) is refused on production projects. Quota changes and takedowns (stop serving a site or a whole project while keeping its content for review; lift) additionally need a Network staff user. Read, set or remove a site's Git source (provider, public repository URL and branch; never a credential).",
-- "tags": [
-- "host.site"
-- ],
-- "x-openvibe-capabilities": [
-- "host.site.manage"
-- ],
-- "x-openvibe-visibility": [
-- "first-party"
-- ],
-- "x-openvibe-quota-class": "host-manage",
-- "security": [
-- {
-- "openvibeToken": [
-- "host.site.manage"
-- ]
-- }
-- ],
-- "requestBody": {
-- "required": false,
-- "content": {
-- "application/json": {
-- "schema": {
-- "$ref": "#/components/schemas/host.site-manage-request.v1"
-- }
-- }
-- }
-- },
-- "parameters": [
-- {
-- "name": "id",
-- "in": "path",
-- "required": true,
-- "schema": {
-- "type": "string"
-- }
-- },
-- {
-- "name": "principal",
-- "in": "path",
-- "required": true,
-- "schema": {
-- "type": "string"
-- }
-- }
-- ],
-- "responses": {
-- "2XX": {
-- "description": "Success",
-- "content": {
-- "application/json": {
-- "schema": {
-- "$ref": "#/components/schemas/host.site-manage-result.v1"
-- }
-- }
-- }
-- },
-- "default": {
-- "description": "An error (RFC 9457 problem details)",
-- "content": {
-- "application/problem+json": {
-- "schema": {
-- "$ref": "#/components/schemas/errors.problem.v1"
-- }
-- }
-- }
-- }
-- }
-- }
-- },
-- "/api/v1/projects/{id}/quota": {
-- "get": {
-- "operationId": "get_api_v1_projects_id_quota",
-- "summary": "Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner ",
-- "description": "**host.site.manage** (first-party): Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner role), create and delete sites, delete a deploy that is not active. Also judged by the acting principal's project role; a sandbox token (env=sandbox) is refused on production projects. Quota changes and takedowns (stop serving a site or a whole project while keeping its content for review; lift) additionally need a Network staff user. Read, set or remove a site's Git source (provider, public repository URL and branch; never a credential).",
-- "tags": [
-- "host.site"
-- ],
-- "x-openvibe-capabilities": [
-- "host.site.manage"
-- ],
-- "x-openvibe-visibility": [
-- "first-party"
-- ],
-- "x-openvibe-quota-class": "host-manage",
-- "security": [
-- {
-- "openvibeToken": [
-- "host.site.manage"
-- ]
-- }
-- ],
-- "x-openvibe-input": {
-- "$ref": "#/components/schemas/host.site-manage-request.v1"
-- },
-- "parameters": [
-- {
-- "name": "id",
-- "in": "path",
-- "required": true,
-- "schema": {
-- "type": "string"
-- }
-- }
-- ],
-- "responses": {
-- "2XX": {
-- "description": "Success",
-- "content": {
-- "application/json": {
-- "schema": {
-- "$ref": "#/components/schemas/host.site-manage-result.v1"
-- }
-- }
-- }
-- },
-- "default": {
-- "description": "An error (RFC 9457 problem details)",
-- "content": {
-- "application/problem+json": {
-- "schema": {
-- "$ref": "#/components/schemas/errors.problem.v1"
-- }
-- }
-- }
-- }
-- }
-- },
-- "put": {
-- "operationId": "put_api_v1_projects_id_quota",
-- "summary": "Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner ",
-- "description": "**host.site.manage** (first-party): Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner role), create and delete sites, delete a deploy that is not active. Also judged by the acting principal's project role; a sandbox token (env=sandbox) is refused on production projects. Quota changes and takedowns (stop serving a site or a whole project while keeping its content for review; lift) additionally need a Network staff user. Read, set or remove a site's Git source (provider, public repository URL and branch; never a credential).",
-- "tags": [
-- "host.site"
-- ],
-- "x-openvibe-capabilities": [
-- "host.site.manage"
-- ],
-- "x-openvibe-visibility": [
-- "first-party"
-- ],
-- "x-openvibe-quota-class": "host-manage",
-- "security": [
-- {
-- "openvibeToken": [
-- "host.site.manage"
-- ]
-- }
-- ],
-- "requestBody": {
-- "required": false,
-- "content": {
-- "application/json": {
-- "schema": {
-- "$ref": "#/components/schemas/host.site-manage-request.v1"
-- }
-- }
-- }
-- },
-- "parameters": [
-- {
-- "name": "id",
-- "in": "path",
-- "required": true,
-- "schema": {
-- "type": "string"
-- }
-- }
-- ],
-- "responses": {
-- "2XX": {
-- "description": "Success",
-- "content": {
-- "application/json": {
-- "schema": {
-- "$ref": "#/components/schemas/host.site-manage-result.v1"
-- }
-- }
-- }
-- },
-- "default": {
-- "description": "An error (RFC 9457 problem details)",
-- "content": {
-- "application/problem+json": {
-- "schema": {
-- "$ref": "#/components/schemas/errors.problem.v1"
-- }
-- }
-- }
-- }
-- }
-- }
-- },
-- "/api/v1/projects/{id}/sites": {
-- "get": {
-- "operationId": "get_api_v1_projects_id_sites",
-- "summary": "Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner ",
-- "description": "**host.site.manage** (first-party): Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner role), create and delete sites, delete a deploy that is not active. Also judged by the acting principal's project role; a sandbox token (env=sandbox) is refused on production projects. Quota changes and takedowns (stop serving a site or a whole project while keeping its content for review; lift) additionally need a Network staff user. Read, set or remove a site's Git source (provider, public repository URL and branch; never a credential).",
-- "tags": [
-- "host.site"
-- ],
-- "x-openvibe-capabilities": [
-- "host.site.manage"
-- ],
-- "x-openvibe-visibility": [
-- "first-party"
-- ],
-- "x-openvibe-quota-class": "host-manage",
-- "security": [
-- {
-- "openvibeToken": [
-- "host.site.manage"
-- ]
-- }
-- ],
-- "x-openvibe-input": {
-- "$ref": "#/components/schemas/host.site-manage-request.v1"
-- },
-- "parameters": [
-- {
-- "name": "id",
-- "in": "path",
-- "required": true,
-- "schema": {
-- "type": "string"
-- }
-- }
-- ],
-- "responses": {
-- "2XX": {
-- "description": "Success",
-- "content": {
-- "application/json": {
-- "schema": {
-- "$ref": "#/components/schemas/host.site-manage-result.v1"
-- }
-- }
-- }
-- },
-- "default": {
-- "description": "An error (RFC 9457 problem details)",
-- "content": {
-- "application/problem+json": {
-- "schema": {
-- "$ref": "#/components/schemas/errors.problem.v1"
-- }
-- }
-- }
-- }
-- }
-- },
-- "post": {
-- "operationId": "post_api_v1_projects_id_sites",
-- "summary": "Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner ",
-- "description": "**host.site.manage** (first-party): Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner role), create and delete sites, delete a deploy that is not active. Also judged by the acting principal's project role; a sandbox token (env=sandbox) is refused on production projects. Quota changes and takedowns (stop serving a site or a whole project while keeping its content for review; lift) additionally need a Network staff user. Read, set or remove a site's Git source (provider, public repository URL and branch; never a credential).",
-- "tags": [
-- "host.site"
-- ],
-- "x-openvibe-capabilities": [
-- "host.site.manage"
-- ],
-- "x-openvibe-visibility": [
-- "first-party"
-- ],
-- "x-openvibe-quota-class": "host-manage",
-- "security": [
-- {
-- "openvibeToken": [
-- "host.site.manage"
-- ]
-- }
-- ],
-- "requestBody": {
-- "required": false,
-- "content": {
-- "application/json": {
-- "schema": {
-- "$ref": "#/components/schemas/host.site-manage-request.v1"
-- }
-- }
-- }
-- },
-- "parameters": [
-- {
-- "name": "id",
-- "in": "path",
-- "required": true,
-- "schema": {
-- "type": "string"
-- }
-- }
-- ],
-- "responses": {
-- "2XX": {
-- "description": "Success",
-- "content": {
-- "application/json": {
-- "schema": {
-- "$ref": "#/components/schemas/host.site-manage-result.v1"
-- }
-- }
-- }
-- },
-- "default": {
-- "description": "An error (RFC 9457 problem details)",
-- "content": {
-- "application/problem+json": {
-- "schema": {
-- "$ref": "#/components/schemas/errors.problem.v1"
-- }
-- }
-- }
-- }
-- }
-- }
-- },
-- "/api/v1/projects/{id}/takedown": {
-- "delete": {
-- "operationId": "delete_api_v1_projects_id_takedown",
-- "summary": "Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner ",
-- "description": "**host.site.manage** (first-party): Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner role), create and delete sites, delete a deploy that is not active. Also judged by the acting principal's project role; a sandbox token (env=sandbox) is refused on production projects. Quota changes and takedowns (stop serving a site or a whole project while keeping its content for review; lift) additionally need a Network staff user. Read, set or remove a site's Git source (provider, public repository URL and branch; never a credential).",
-- "tags": [
-- "host.site"
-- ],
-- "x-openvibe-capabilities": [
-- "host.site.manage"
-- ],
-- "x-openvibe-visibility": [
-- "first-party"
-- ],
-- "x-openvibe-quota-class": "host-manage",
-- "security": [
-- {
-- "openvibeToken": [
-- "host.site.manage"
-- ]
-- }
-- ],
-- "x-openvibe-input": {
-- "$ref": "#/components/schemas/host.site-manage-request.v1"
-- },
-- "parameters": [
-- {
-- "name": "id",
-- "in": "path",
-- "required": true,
-- "schema": {
-- "type": "string"
-- }
-- }
-- ],
-- "responses": {
-- "2XX": {
-- "description": "Success",
-- "content": {
-- "application/json": {
-- "schema": {
-- "$ref": "#/components/schemas/host.site-manage-result.v1"
-- }
-- }
-- }
-- },
-- "default": {
-- "description": "An error (RFC 9457 problem details)",
-- "content": {
-- "application/problem+json": {
-- "schema": {
-- "$ref": "#/components/schemas/errors.problem.v1"
-- }
-- }
-- }
-- }
-- }
-- },
-- "post": {
-- "operationId": "post_api_v1_projects_id_takedown",
-- "summary": "Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner ",
-- "description": "**host.site.manage** (first-party): Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner role), create and delete sites, delete a deploy that is not active. Also judged by the acting principal's project role; a sandbox token (env=sandbox) is refused on production projects. Quota changes and takedowns (stop serving a site or a whole project while keeping its content for review; lift) additionally need a Network staff user. Read, set or remove a site's Git source (provider, public repository URL and branch; never a credential).",
-- "tags": [
-- "host.site"
-- ],
-- "x-openvibe-capabilities": [
-- "host.site.manage"
-- ],
-- "x-openvibe-visibility": [
-- "first-party"
-- ],
-- "x-openvibe-quota-class": "host-manage",
-- "security": [
-- {
-- "openvibeToken": [
-- "host.site.manage"
-- ]
-- }
-- ],
-- "requestBody": {
-- "required": false,
-- "content": {
-- "application/json": {
-- "schema": {
-- "$ref": "#/components/schemas/host.site-manage-request.v1"
-- }
-- }
-- }
-- },
-- "parameters": [
-- {
-- "name": "id",
-- "in": "path",
-- "required": true,
-- "schema": {
-- "type": "string"
-- }
-- }
-- ],
-- "responses": {
-- "2XX": {
-- "description": "Success",
-- "content": {
-- "application/json": {
-- "schema": {
-- "$ref": "#/components/schemas/host.site-manage-result.v1"
-- }
-- }
-- }
-- },
-- "default": {
-- "description": "An error (RFC 9457 problem details)",
-- "content": {
-- "application/problem+json": {
-- "schema": {
-- "$ref": "#/components/schemas/errors.problem.v1"
-- }
-- }
-- }
-- }
-- }
-- }
-- },
-- "/api/v1/resources": {
-- "get": {
-- "operationId": "get_api_v1_resources",
-- "summary": "Read OpenVibe.Host's resource index (ADR-048): GET /api/v1/resources lists the resources Host owns as a page of common.resource-summary@1 (common.resource-list-result@1), and GET /api/v1/resources/:ov",
-- "description": "**host.resource.read** (first-party): Read OpenVibe.Host's resource index (ADR-048): GET /api/v1/resources lists the resources Host owns as a page of common.resource-summary@1 (common.resource-list-result@1), and GET /api/v1/resources/:ovrn reads one by its OVRN (common.resource-summary@1). Every authority serves these for OpenVibe.Services to fan out and merge; Host's own resources are its static sites (kind host.site, id sit_<ULID>), the immutable deploys of those sites (kind host.deploy, id dpl_<ULID>) and their default and custom domains (kind host.domain, id dom_<ULID>), each with the project_id of the Network project that owns it. Host lists no projects; only Network lists projects. Planned until Host ships the index.",
-- "tags": [
-- "host.resource"
-- ],
-- "x-openvibe-capabilities": [
-- "host.resource.read"
-- ],
-- "x-openvibe-visibility": [
-- "first-party"
-- ],
-- "x-openvibe-quota-class": "standard",
-- "security": [
-- {
-- "openvibeToken": [
-- "host.resource.read"
-- ]
-- }
-- ],
-- "responses": {
-- "2XX": {
-- "description": "Success",
-- "content": {
-- "application/json": {
-- "schema": {
-- "$ref": "#/components/schemas/common.resource-list-result.v1"
-- }
-- }
-- }
-- },
-- "default": {
-- "description": "An error (RFC 9457 problem details)",
-- "content": {
-- "application/problem+json": {
-- "schema": {
-- "$ref": "#/components/schemas/errors.problem.v1"
-- }
-- }
-- }
-- }
-- }
-- }
-- },
-- "/api/v1/resources/{ovrn}": {
-- "get": {
-- "operationId": "get_api_v1_resources_ovrn",
-- "summary": "Read OpenVibe.Host's resource index (ADR-048): GET /api/v1/resources lists the resources Host owns as a page of common.resource-summary@1 (common.resource-list-result@1), and GET /api/v1/resources/:ov",
-- "description": "**host.resource.read** (first-party): Read OpenVibe.Host's resource index (ADR-048): GET /api/v1/resources lists the resources Host owns as a page of common.resource-summary@1 (common.resource-list-result@1), and GET /api/v1/resources/:ovrn reads one by its OVRN (common.resource-summary@1). Every authority serves these for OpenVibe.Services to fan out and merge; Host's own resources are its static sites (kind host.site, id sit_<ULID>), the immutable deploys of those sites (kind host.deploy, id dpl_<ULID>) and their default and custom domains (kind host.domain, id dom_<ULID>), each with the project_id of the Network project that owns it. Host lists no projects; only Network lists projects. Planned until Host ships the index.",
-- "tags": [
-- "host.resource"
-- ],
-- "x-openvibe-capabilities": [
-- "host.resource.read"
-- ],
-- "x-openvibe-visibility": [
-- "first-party"
-- ],
-- "x-openvibe-quota-class": "standard",
-- "security": [
-- {
-- "openvibeToken": [
-- "host.resource.read"
-- ]
-- }
-- ],
-- "parameters": [
-- {
-- "name": "ovrn",
-- "in": "path",
-- "required": true,
-- "schema": {
-- "type": "string"
-- }
-- }
-- ],
-- "responses": {
-- "2XX": {
-- "description": "Success",
-- "content": {
-- "application/json": {
-- "schema": {
-- "$ref": "#/components/schemas/common.resource-list-result.v1"
-- }
-- }
-- }
-- },
-- "default": {
-- "description": "An error (RFC 9457 problem details)",
-- "content": {
-- "application/problem+json": {
-- "schema": {
-- "$ref": "#/components/schemas/errors.problem.v1"
-- }
-- }
-- }
-- }
-- }
-- }
-- },
-- "/api/v1/sites/{id}": {
-- "delete": {
-- "operationId": "delete_api_v1_sites_id",
-- "summary": "Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner ",
-- "description": "**host.site.manage** (first-party): Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner role), create and delete sites, delete a deploy that is not active. Also judged by the acting principal's project role; a sandbox token (env=sandbox) is refused on production projects. Quota changes and takedowns (stop serving a site or a whole project while keeping its content for review; lift) additionally need a Network staff user. Read, set or remove a site's Git source (provider, public repository URL and branch; never a credential).",
-- "tags": [
-- "host.site"
-- ],
-- "x-openvibe-capabilities": [
-- "host.site.manage"
-- ],
-- "x-openvibe-visibility": [
-- "first-party"
-- ],
-- "x-openvibe-quota-class": "host-manage",
-- "security": [
-- {
-- "openvibeToken": [
-- "host.site.manage"
-- ]
-- }
-- ],
-- "x-openvibe-input": {
-- "$ref": "#/components/schemas/host.site-manage-request.v1"
-- },
-- "parameters": [
-- {
-- "name": "id",
-- "in": "path",
-- "required": true,
-- "schema": {
-- "type": "string"
-- }
-- }
-- ],
-- "responses": {
-- "2XX": {
-- "description": "Success",
-- "content": {
-- "application/json": {
-- "schema": {
-- "$ref": "#/components/schemas/host.site-manage-result.v1"
-- }
-- }
-- }
-- },
-- "default": {
-- "description": "An error (RFC 9457 problem details)",
-- "content": {
-- "application/problem+json": {
-- "schema": {
-- "$ref": "#/components/schemas/errors.problem.v1"
-- }
-- }
-- }
-- }
-- }
-- },
-- "get": {
-- "operationId": "get_api_v1_sites_id",
-- "summary": "Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner ",
-- "description": "**host.site.manage** (first-party): Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner role), create and delete sites, delete a deploy that is not active. Also judged by the acting principal's project role; a sandbox token (env=sandbox) is refused on production projects. Quota changes and takedowns (stop serving a site or a whole project while keeping its content for review; lift) additionally need a Network staff user. Read, set or remove a site's Git source (provider, public repository URL and branch; never a credential).",
-- "tags": [
-- "host.site"
-- ],
-- "x-openvibe-capabilities": [
-- "host.site.manage"
-- ],
-- "x-openvibe-visibility": [
-- "first-party"
-- ],
-- "x-openvibe-quota-class": "host-manage",
-- "security": [
-- {
-- "openvibeToken": [
-- "host.site.manage"
-- ]
-- }
-- ],
-- "x-openvibe-input": {
-- "$ref": "#/components/schemas/host.site-manage-request.v1"
-- },
-- "parameters": [
-- {
-- "name": "id",
-- "in": "path",
-- "required": true,
-- "schema": {
-- "type": "string"
-- }
-- }
-- ],
-- "responses": {
-- "2XX": {
-- "description": "Success",
-- "content": {
-- "application/json": {
-- "schema": {
-- "$ref": "#/components/schemas/host.site-manage-result.v1"
-- }
-- }
-- }
-- },
-- "default": {
-- "description": "An error (RFC 9457 problem details)",
-- "content": {
-- "application/problem+json": {
-- "schema": {
-- "$ref": "#/components/schemas/errors.problem.v1"
-- }
-- }
-- }
-- }
-- }
-- }
-- },
-- "/api/v1/sites/{id}/config": {
-- "delete": {
-- "operationId": "delete_api_v1_sites_id_config",
-- "summary": "Read, set and reset a Host site's serving configuration: response headers, local-only redirects and the SPA fallback (extensionless paths serve index.html).",
-- "description": "**host.site.config** (first-party): Read, set and reset a Host site's serving configuration: response headers, local-only redirects and the SPA fallback (extensionless paths serve index.html). A capability holder must also hold the acting principal's project role (maintainer or owner to change, any role to read). Reserved headers (Content-Security-Policy, Strict-Transport-Security, Set-Cookie, X-Forwarded-*, caching, scope, transport and the platform's own) are refused, and a redirect target must be a local path, so a site can never become an open redirect.",
-- "tags": [
-- "host.site"
-- ],
-- "x-openvibe-capabilities": [
-- "host.site.config"
-- ],
-- "x-openvibe-visibility": [
-- "first-party"
-- ],
-- "x-openvibe-quota-class": "host-manage",
-- "security": [
-- {
-- "openvibeToken": [
-- "host.site.config"
-- ]
-- }
-- ],
-- "x-openvibe-input": {
-- "$ref": "#/components/schemas/host.site-config-request.v1"
-- },
-- "parameters": [
-- {
-- "name": "id",
-- "in": "path",
-- "required": true,
-- "schema": {
-- "type": "string"
-- }
-- },
-- {
-- "name": "headers",
-- "in": "query",
-- "required": false,
-- "schema": {
-- "type": "object",
-- "additionalProperties": {
-- "type": "string"
-- }
-- }
-- },
-- {
-- "name": "redirects",
-- "in": "query",
-- "required": false,
-- "schema": {
-- "type": "array",
-- "items": {
-- "type": "object",
-- "additionalProperties": false,
-- "required": [
-- "from",
-- "to"
-- ],
-- "properties": {
-- "from": {
-- "type": "string"
-- },
-- "to": {
-- "type": "string"
-- },
-- "status": {
-- "enum": [
-- 301,
-- 302,
-- 307,
-- 308
-- ]
-- }
-- }
-- }
-- }
-- },
-- {
-- "name": "spa",
-- "in": "query",
-- "required": false,
-- "schema": {
-- "type": "boolean"
-- }
-- }
-- ],
-- "responses": {
-- "2XX": {
-- "description": "Success",
-- "content": {
-- "application/json": {
-- "schema": {
-- "$ref": "#/components/schemas/host.site-config-result.v1"
-- }
-- }
-- }
-- },
-- "default": {
-- "description": "An error (RFC 9457 problem details)",
-- "content": {
-- "application/problem+json": {
-- "schema": {
-- "$ref": "#/components/schemas/errors.problem.v1"
-- }
-- }
-- }
-- }
-- }
-- },
-- "get": {
-- "operationId": "get_api_v1_sites_id_config",
-- "summary": "Read, set and reset a Host site's serving configuration: response headers, local-only redirects and the SPA fallback (extensionless paths serve index.html).",
-- "description": "**host.site.config** (first-party): Read, set and reset a Host site's serving configuration: response headers, local-only redirects and the SPA fallback (extensionless paths serve index.html). A capability holder must also hold the acting principal's project role (maintainer or owner to change, any role to read). Reserved headers (Content-Security-Policy, Strict-Transport-Security, Set-Cookie, X-Forwarded-*, caching, scope, transport and the platform's own) are refused, and a redirect target must be a local path, so a site can never become an open redirect.",
-- "tags": [
-- "host.site"
-- ],
-- "x-openvibe-capabilities": [
-- "host.site.config"
-- ],
-- "x-openvibe-visibility": [
-- "first-party"
-- ],
-- "x-openvibe-quota-class": "host-manage",
-- "security": [
-- {
-- "openvibeToken": [
-- "host.site.config"
-- ]
-- }
-- ],
-- "x-openvibe-input": {
-- "$ref": "#/components/schemas/host.site-config-request.v1"
-- },
-- "parameters": [
-- {
-- "name": "id",
-- "in": "path",
-- "required": true,
-- "schema": {
-- "type": "string"
-- }
-- },
-- {
-- "name": "headers",
-- "in": "query",
-- "required": false,
-- "schema": {
-- "type": "object",
-- "additionalProperties": {
-- "type": "string"
-- }
-- }
-- },
-- {
-- "name": "redirects",
-- "in": "query",
-- "required": false,
-- "schema": {
-- "type": "array",
-- "items": {
-- "type": "object",
-- "additionalProperties": false,
-- "required": [
-- "from",
-- "to"
-- ],
-- "properties": {
-- "from": {
-- "type": "string"
-- },
-- "to": {
-- "type": "string"
-- },
-- "status": {
-- "enum": [
-- 301,
-- 302,
-- 307,
-- 308
-- ]
-- }
-- }
-- }
-- }
-- },
-- {
-- "name": "spa",
-- "in": "query",
-- "required": false,
-- "schema": {
-- "type": "boolean"
-- }
-- }
-- ],
-- "responses": {
-- "2XX": {
-- "description": "Success",
-- "content": {
-- "application/json": {
-- "schema": {
-- "$ref": "#/components/schemas/host.site-config-result.v1"
-- }
-- }
-- }
-- },
-- "default": {
-- "description": "An error (RFC 9457 problem details)",
-- "content": {
-- "application/problem+json": {
-- "schema": {
-- "$ref": "#/components/schemas/errors.problem.v1"
-- }
-- }
-- }
-- }
-- }
-- },
-- "put": {
-- "operationId": "put_api_v1_sites_id_config",
-- "summary": "Read, set and reset a Host site's serving configuration: response headers, local-only redirects and the SPA fallback (extensionless paths serve index.html).",
-- "description": "**host.site.config** (first-party): Read, set and reset a Host site's serving configuration: response headers, local-only redirects and the SPA fallback (extensionless paths serve index.html). A capability holder must also hold the acting principal's project role (maintainer or owner to change, any role to read). Reserved headers (Content-Security-Policy, Strict-Transport-Security, Set-Cookie, X-Forwarded-*, caching, scope, transport and the platform's own) are refused, and a redirect target must be a local path, so a site can never become an open redirect.",
-- "tags": [
-- "host.site"
-- ],
-- "x-openvibe-capabilities": [
-- "host.site.config"
-- ],
-- "x-openvibe-visibility": [
-- "first-party"
-- ],
-- "x-openvibe-quota-class": "host-manage",
-- "security": [
-- {
-- "openvibeToken": [
-- "host.site.config"
-- ]
-- }
-- ],
-- "requestBody": {
-- "required": false,
-- "content": {
-- "application/json": {
-- "schema": {
-- "$ref": "#/components/schemas/host.site-config-request.v1"
-- }
-- }
-- }
-- },
-- "parameters": [
-- {
-- "name": "id",
-- "in": "path",
-- "required": true,
-- "schema": {
-- "type": "string"
-- }
-- }
-- ],
-- "responses": {
-- "2XX": {
-- "description": "Success",
-- "content": {
-- "application/json": {
-- "schema": {
-- "$ref": "#/components/schemas/host.site-config-result.v1"
-- }
-- }
-- }
-- },
-- "default": {
-- "description": "An error (RFC 9457 problem details)",
-- "content": {
-- "application/problem+json": {
-- "schema": {
-- "$ref": "#/components/schemas/errors.problem.v1"
-- }
-- }
-- }
-- }
-- }
-- }
-- },
-- "/api/v1/sites/{id}/deploys": {
-- "get": {
-- "operationId": "get_api_v1_sites_id_deploys",
-- "summary": "Upload an immutable static deploy (tar/tar.gz or multipart files; validated for path traversal, links, special and hidden files, server-side code, file types and quotas; never executed), list deploys ",
-- "description": "**host.deploy.create** (first-party): Upload an immutable static deploy (tar/tar.gz or multipart files; validated for path traversal, links, special and hidden files, server-side code, file types and quotas; never executed), list deploys and their upload logs, activate a deploy and roll a site back to any earlier ready deploy (one atomic pointer switch). Also judged by the acting principal's project role (deployer or above); an app principal added to a project as deployer can deploy from CI. A site with a Git source also accepts a CI-built deploy at /sites/:id/source/deploys naming the ref and full commit_sha; it is always a preview and records that commit as immutable provenance.",
-- "tags": [
-- "host.deploy"
-- ],
-- "x-openvibe-capabilities": [
-- "host.deploy.create"
-- ],
-- "x-openvibe-visibility": [
-- "first-party"
-- ],
-- "x-openvibe-quota-class": "host-deploy",
-- "security": [
-- {
-- "openvibeToken": [
-- "host.deploy.create"
-- ]
-- }
-- ],
-- "x-openvibe-input": {
-- "$ref": "#/components/schemas/host.deploy-create-request.v1"
-- },
-- "parameters": [
-- {
-- "name": "id",
-- "in": "path",
-- "required": true,
-- "schema": {
-- "type": "string"
-- }
-- }
-- ],
-- "responses": {
-- "2XX": {
-- "description": "Success",
-- "content": {
-- "application/json": {
-- "schema": {
-- "$ref": "#/components/schemas/host.deploy-create-result.v1"
-- }
-- }
-- }
-- },
-- "default": {
-- "description": "An error (RFC 9457 problem details)",
-- "content": {
-- "application/problem+json": {
-- "schema": {
-- "$ref": "#/components/schemas/errors.problem.v1"
-- }
-- }
-- }
-- }
-- }
-- },
-- "post": {
-- "operationId": "post_api_v1_sites_id_deploys",
-- "summary": "Upload an immutable static deploy (tar/tar.gz or multipart files; validated for path traversal, links, special and hidden files, server-side code, file types and quotas; never executed), list deploys ",
-- "description": "**host.deploy.create** (first-party): Upload an immutable static deploy (tar/tar.gz or multipart files; validated for path traversal, links, special and hidden files, server-side code, file types and quotas; never executed), list deploys and their upload logs, activate a deploy and roll a site back to any earlier ready deploy (one atomic pointer switch). Also judged by the acting principal's project role (deployer or above); an app principal added to a project as deployer can deploy from CI. A site with a Git source also accepts a CI-built deploy at /sites/:id/source/deploys naming the ref and full commit_sha; it is always a preview and records that commit as immutable provenance.",
-- "tags": [
-- "host.deploy"
-- ],
-- "x-openvibe-capabilities": [
-- "host.deploy.create"
-- ],
-- "x-openvibe-visibility": [
-- "first-party"
-- ],
-- "x-openvibe-quota-class": "host-deploy",
-- "security": [
-- {
-- "openvibeToken": [
-- "host.deploy.create"
-- ]
-- }
-- ],
-- "requestBody": {
-- "required": false,
-- "content": {
-- "application/json": {
-- "schema": {
-- "$ref": "#/components/schemas/host.deploy-create-request.v1"
-- }
-- }
-- }
-- },
-- "parameters": [
-- {
-- "name": "id",
-- "in": "path",
-- "required": true,
-- "schema": {
-- "type": "string"
-- }
-- }
-- ],
-- "responses": {
-- "2XX": {
-- "description": "Success",
-- "content": {
-- "application/json": {
-- "schema": {
-- "$ref": "#/components/schemas/host.deploy-create-result.v1"
-- }
-- }
-- }
-- },
-- "default": {
-- "description": "An error (RFC 9457 problem details)",
-- "content": {
-- "application/problem+json": {
-- "schema": {
-- "$ref": "#/components/schemas/errors.problem.v1"
-- }
-- }
-- }
-- }
-- }
-- }
-- },
-- "/api/v1/sites/{id}/domains": {
-- "get": {
-- "operationId": "get_api_v1_sites_id_domains",
-- "summary": "Add a custom domain to a static site (never an OpenVibe domain; not in sandbox projects), read its DNS TXT verification and routing records, trigger a verification check, and remove it.",
-- "description": "**host.domain.manage** (first-party): Add a custom domain to a static site (never an OpenVibe domain; not in sandbox projects), read its DNS TXT verification and routing records, trigger a verification check, and remove it. A custom domain is served only after its TXT record is verified; TLS certificates are issued by an operator and never pass through this capability.",
-- "tags": [
-- "host.domain"
-- ],
-- "x-openvibe-capabilities": [
-- "host.domain.manage"
-- ],
-- "x-openvibe-visibility": [
-- "first-party"
-- ],
-- "x-openvibe-quota-class": "host-manage",
-- "security": [
-- {
-- "openvibeToken": [
-- "host.domain.manage"
-- ]
-- }
-- ],
-- "x-openvibe-input": {
-- "$ref": "#/components/schemas/host.domain-manage-request.v1"
-- },
-- "parameters": [
-- {
-- "name": "id",
-- "in": "path",
-- "required": true,
-- "schema": {
-- "type": "string"
-- }
-- }
-- ],
-- "responses": {
-- "2XX": {
-- "description": "Success",
-- "content": {
-- "application/json": {
-- "schema": {
-- "$ref": "#/components/schemas/host.domain-manage-result.v1"
-- }
-- }
-- }
-- },
-- "default": {
-- "description": "An error (RFC 9457 problem details)",
-- "content": {
-- "application/problem+json": {
-- "schema": {
-- "$ref": "#/components/schemas/errors.problem.v1"
-- }
-- }
-- }
-- }
-- }
-- },
-- "post": {
-- "operationId": "post_api_v1_sites_id_domains",
-- "summary": "Add a custom domain to a static site (never an OpenVibe domain; not in sandbox projects), read its DNS TXT verification and routing records, trigger a verification check, and remove it.",
-- "description": "**host.domain.manage** (first-party): Add a custom domain to a static site (never an OpenVibe domain; not in sandbox projects), read its DNS TXT verification and routing records, trigger a verification check, and remove it. A custom domain is served only after its TXT record is verified; TLS certificates are issued by an operator and never pass through this capability.",
-- "tags": [
-- "host.domain"
-- ],
-- "x-openvibe-capabilities": [
-- "host.domain.manage"
-- ],
-- "x-openvibe-visibility": [
-- "first-party"
-- ],
-- "x-openvibe-quota-class": "host-manage",
-- "security": [
-- {
-- "openvibeToken": [
-- "host.domain.manage"
-- ]
-- }
-- ],
-- "requestBody": {
-- "required": false,
-- "content": {
-- "application/json": {
-- "schema": {
-- "$ref": "#/components/schemas/host.domain-manage-request.v1"
-- }
-- }
-- }
-- },
-- "parameters": [
-- {
-- "name": "id",
-- "in": "path",
-- "required": true,
-- "schema": {
-- "type": "string"
-- }
-- }
-- ],
-- "responses": {
-- "2XX": {
-- "description": "Success",
-- "content": {
-- "application/json": {
-- "schema": {
-- "$ref": "#/components/schemas/host.domain-manage-result.v1"
-- }
-- }
-- }
-- },
-- "default": {
-- "description": "An error (RFC 9457 problem details)",
-- "content": {
-- "application/problem+json": {
-- "schema": {
-- "$ref": "#/components/schemas/errors.problem.v1"
-- }
-- }
-- }
-- }
-- }
-- }
-- },
-- "/api/v1/sites/{id}/rollback": {
-- "post": {
-- "operationId": "post_api_v1_sites_id_rollback",
-- "summary": "Upload an immutable static deploy (tar/tar.gz or multipart files; validated for path traversal, links, special and hidden files, server-side code, file types and quotas; never executed), list deploys ",
-- "description": "**host.deploy.create** (first-party): Upload an immutable static deploy (tar/tar.gz or multipart files; validated for path traversal, links, special and hidden files, server-side code, file types and quotas; never executed), list deploys and their upload logs, activate a deploy and roll a site back to any earlier ready deploy (one atomic pointer switch). Also judged by the acting principal's project role (deployer or above); an app principal added to a project as deployer can deploy from CI. A site with a Git source also accepts a CI-built deploy at /sites/:id/source/deploys naming the ref and full commit_sha; it is always a preview and records that commit as immutable provenance.",
-- "tags": [
-- "host.deploy"
-- ],
-- "x-openvibe-capabilities": [
-- "host.deploy.create"
-- ],
-- "x-openvibe-visibility": [
-- "first-party"
-- ],
-- "x-openvibe-quota-class": "host-deploy",
-- "security": [
-- {
-- "openvibeToken": [
-- "host.deploy.create"
-- ]
-- }
-- ],
-- "requestBody": {
-- "required": false,
-- "content": {
-- "application/json": {
-- "schema": {
-- "$ref": "#/components/schemas/host.deploy-create-request.v1"
-- }
-- }
-- }
-- },
-- "parameters": [
-- {
-- "name": "id",
-- "in": "path",
-- "required": true,
-- "schema": {
-- "type": "string"
-- }
-- }
-- ],
-- "responses": {
-- "2XX": {
-- "description": "Success",
-- "content": {
-- "application/json": {
-- "schema": {
-- "$ref": "#/components/schemas/host.deploy-create-result.v1"
-- }
-- }
-- }
-- },
-- "default": {
-- "description": "An error (RFC 9457 problem details)",
-- "content": {
-- "application/problem+json": {
-- "schema": {
-- "$ref": "#/components/schemas/errors.problem.v1"
-- }
-- }
-- }
-- }
-- }
-- }
-- },
-- "/api/v1/sites/{id}/source": {
-- "delete": {
-- "operationId": "delete_api_v1_sites_id_source",
-- "summary": "Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner ",
-- "description": "**host.site.manage** (first-party): Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner role), create and delete sites, delete a deploy that is not active. Also judged by the acting principal's project role; a sandbox token (env=sandbox) is refused on production projects. Quota changes and takedowns (stop serving a site or a whole project while keeping its content for review; lift) additionally need a Network staff user. Read, set or remove a site's Git source (provider, public repository URL and branch; never a credential).",
-- "tags": [
-- "host.site"
-- ],
-- "x-openvibe-capabilities": [
-- "host.site.manage"
-- ],
-- "x-openvibe-visibility": [
-- "first-party"
-- ],
-- "x-openvibe-quota-class": "host-manage",
-- "security": [
-- {
-- "openvibeToken": [
-- "host.site.manage"
-- ]
-- }
-- ],
-- "x-openvibe-input": {
-- "$ref": "#/components/schemas/host.site-manage-request.v1"
-- },
-- "parameters": [
-- {
-- "name": "id",
-- "in": "path",
-- "required": true,
-- "schema": {
-- "type": "string"
-- }
-- }
-- ],
-- "responses": {
-- "2XX": {
-- "description": "Success",
-- "content": {
-- "application/json": {
-- "schema": {
-- "$ref": "#/components/schemas/host.site-manage-result.v1"
-- }
-- }
-- }
-- },
-- "default": {
-- "description": "An error (RFC 9457 problem details)",
-- "content": {
-- "application/problem+json": {
-- "schema": {
-- "$ref": "#/components/schemas/errors.problem.v1"
-- }
-- }
-- }
-- }
-- }
-- },
-- "get": {
-- "operationId": "get_api_v1_sites_id_source",
-- "summary": "Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner ",
-- "description": "**host.site.manage** (first-party): Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner role), create and delete sites, delete a deploy that is not active. Also judged by the acting principal's project role; a sandbox token (env=sandbox) is refused on production projects. Quota changes and takedowns (stop serving a site or a whole project while keeping its content for review; lift) additionally need a Network staff user. Read, set or remove a site's Git source (provider, public repository URL and branch; never a credential).",
-- "tags": [
-- "host.site"
-- ],
-- "x-openvibe-capabilities": [
-- "host.site.manage"
-- ],
-- "x-openvibe-visibility": [
-- "first-party"
-- ],
-- "x-openvibe-quota-class": "host-manage",
-- "security": [
-- {
-- "openvibeToken": [
-- "host.site.manage"
-- ]
-- }
-- ],
-- "x-openvibe-input": {
-- "$ref": "#/components/schemas/host.site-manage-request.v1"
-- },
-- "parameters": [
-- {
-- "name": "id",
-- "in": "path",
-- "required": true,
-- "schema": {
-- "type": "string"
-- }
-- }
-- ],
-- "responses": {
-- "2XX": {
-- "description": "Success",
-- "content": {
-- "application/json": {
-- "schema": {
-- "$ref": "#/components/schemas/host.site-manage-result.v1"
-- }
-- }
-- }
-- },
-- "default": {
-- "description": "An error (RFC 9457 problem details)",
-- "content": {
-- "application/problem+json": {
-- "schema": {
-- "$ref": "#/components/schemas/errors.problem.v1"
-- }
-- }
-- }
-- }
-- }
-- },
-- "put": {
-- "operationId": "put_api_v1_sites_id_source",
-- "summary": "Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner ",
-- "description": "**host.site.manage** (first-party): Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner role), create and delete sites, delete a deploy that is not active. Also judged by the acting principal's project role; a sandbox token (env=sandbox) is refused on production projects. Quota changes and takedowns (stop serving a site or a whole project while keeping its content for review; lift) additionally need a Network staff user. Read, set or remove a site's Git source (provider, public repository URL and branch; never a credential).",
-- "tags": [
-- "host.site"
-- ],
-- "x-openvibe-capabilities": [
-- "host.site.manage"
-- ],
-- "x-openvibe-visibility": [
-- "first-party"
-- ],
-- "x-openvibe-quota-class": "host-manage",
-- "security": [
-- {
-- "openvibeToken": [
-- "host.site.manage"
-- ]
-- }
-- ],
-- "requestBody": {
-- "required": false,
-- "content": {
-- "application/json": {
-- "schema": {
-- "$ref": "#/components/schemas/host.site-manage-request.v1"
-- }
-- }
-- }
-- },
-- "parameters": [
-- {
-- "name": "id",
-- "in": "path",
-- "required": true,
-- "schema": {
-- "type": "string"
-- }
-- }
-- ],
-- "responses": {
-- "2XX": {
-- "description": "Success",
-- "content": {
-- "application/json": {
-- "schema": {
-- "$ref": "#/components/schemas/host.site-manage-result.v1"
-- }
-- }
-- }
-- },
-- "default": {
-- "description": "An error (RFC 9457 problem details)",
-- "content": {
-- "application/problem+json": {
-- "schema": {
-- "$ref": "#/components/schemas/errors.problem.v1"
-- }
-- }
-- }
-- }
-- }
-- }
-- },
-- "/api/v1/sites/{id}/source/deploys": {
-- "post": {
-- "operationId": "post_api_v1_sites_id_source_deploys",
-- "summary": "Upload an immutable static deploy (tar/tar.gz or multipart files; validated for path traversal, links, special and hidden files, server-side code, file types and quotas; never executed), list deploys ",
-- "description": "**host.deploy.create** (first-party): Upload an immutable static deploy (tar/tar.gz or multipart files; validated for path traversal, links, special and hidden files, server-side code, file types and quotas; never executed), list deploys and their upload logs, activate a deploy and roll a site back to any earlier ready deploy (one atomic pointer switch). Also judged by the acting principal's project role (deployer or above); an app principal added to a project as deployer can deploy from CI. A site with a Git source also accepts a CI-built deploy at /sites/:id/source/deploys naming the ref and full commit_sha; it is always a preview and records that commit as immutable provenance.",
-- "tags": [
-- "host.deploy"
-- ],
-- "x-openvibe-capabilities": [
-- "host.deploy.create"
-- ],
-- "x-openvibe-visibility": [
-- "first-party"
-- ],
-- "x-openvibe-quota-class": "host-deploy",
-- "security": [
-- {
-- "openvibeToken": [
-- "host.deploy.create"
-- ]
-- }
-- ],
-- "requestBody": {
-- "required": false,
-- "content": {
-- "application/json": {
-- "schema": {
-- "$ref": "#/components/schemas/host.deploy-create-request.v1"
-- }
-- }
-- }
-- },
-- "parameters": [
-- {
-- "name": "id",
-- "in": "path",
-- "required": true,
-- "schema": {
-- "type": "string"
-- }
-- }
-- ],
-- "responses": {
-- "2XX": {
-- "description": "Success",
-- "content": {
-- "application/json": {
-- "schema": {
-- "$ref": "#/components/schemas/host.deploy-create-result.v1"
-- }
-- }
-- }
-- },
-- "default": {
-- "description": "An error (RFC 9457 problem details)",
-- "content": {
-- "application/problem+json": {
-- "schema": {
-- "$ref": "#/components/schemas/errors.problem.v1"
-- }
-- }
-- }
-- }
-- }
-- }
-- },
-- "/api/v1/sites/{id}/takedown": {
-- "delete": {
-- "operationId": "delete_api_v1_sites_id_takedown",
-- "summary": "Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner ",
-- "description": "**host.site.manage** (first-party): Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner role), create and delete sites, delete a deploy that is not active. Also judged by the acting principal's project role; a sandbox token (env=sandbox) is refused on production projects. Quota changes and takedowns (stop serving a site or a whole project while keeping its content for review; lift) additionally need a Network staff user. Read, set or remove a site's Git source (provider, public repository URL and branch; never a credential).",
-- "tags": [
-- "host.site"
-- ],
-- "x-openvibe-capabilities": [
-- "host.site.manage"
-- ],
-- "x-openvibe-visibility": [
-- "first-party"
-- ],
-- "x-openvibe-quota-class": "host-manage",
-- "security": [
-- {
-- "openvibeToken": [
-- "host.site.manage"
-- ]
-- }
-- ],
-- "x-openvibe-input": {
-- "$ref": "#/components/schemas/host.site-manage-request.v1"
-- },
-- "parameters": [
-- {
-- "name": "id",
-- "in": "path",
-- "required": true,
-- "schema": {
-- "type": "string"
-- }
-- }
-- ],
-- "responses": {
-- "2XX": {
-- "description": "Success",
-- "content": {
-- "application/json": {
-- "schema": {
-- "$ref": "#/components/schemas/host.site-manage-result.v1"
-- }
-- }
-- }
-- },
-- "default": {
-- "description": "An error (RFC 9457 problem details)",
-- "content": {
-- "application/problem+json": {
-- "schema": {
-- "$ref": "#/components/schemas/errors.problem.v1"
-- }
-- }
-- }
-- }
-- }
-- },
-- "post": {
-- "operationId": "post_api_v1_sites_id_takedown",
-- "summary": "Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner ",
-- "description": "**host.site.manage** (first-party): Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner role), create and delete sites, delete a deploy that is not active. Also judged by the acting principal's project role; a sandbox token (env=sandbox) is refused on production projects. Quota changes and takedowns (stop serving a site or a whole project while keeping its content for review; lift) additionally need a Network staff user. Read, set or remove a site's Git source (provider, public repository URL and branch; never a credential).",
-- "tags": [
-- "host.site"
-- ],
-- "x-openvibe-capabilities": [
-- "host.site.manage"
-- ],
-- "x-openvibe-visibility": [
-- "first-party"
-- ],
-- "x-openvibe-quota-class": "host-manage",
-- "security": [
-- {
-- "openvibeToken": [
-- "host.site.manage"
-- ]
-- }
-- ],
-- "requestBody": {
-- "required": false,
-- "content": {
-- "application/json": {
-- "schema": {
-- "$ref": "#/components/schemas/host.site-manage-request.v1"
-- }
-- }
-- }
-- },
-- "parameters": [
-- {
-- "name": "id",
-- "in": "path",
-- "required": true,
-- "schema": {
-- "type": "string"
-- }
-- }
-- ],
-- "responses": {
-- "2XX": {
-- "description": "Success",
-- "content": {
-- "application/json": {
-- "schema": {
-- "$ref": "#/components/schemas/host.site-manage-result.v1"
-- }
-- }
-- }
-- },
-- "default": {
-- "description": "An error (RFC 9457 problem details)",
-- "content": {
-- "application/problem+json": {
-- "schema": {
-- "$ref": "#/components/schemas/errors.problem.v1"
-- }
-- }
-- }
-- }
-- }
-- }
-- }
-- },
-- "components": {
-- "schemas": {
-- "common.no-body.v1": {
-- "title": "NoBody",
-- "description": "common.no-body@1: the capability's request carries no body; its parameters are the path and query of the routes in implementedBy (an id, a page cursor). An input schema that says so explicitly, so every active capability names one (roadmap WS-C task 4).",
-- "type": "object",
-- "maxProperties": 0
-- },
-- "common.resource-list-result.v1": {
-- "title": "ResourceListResult",
-- "description": "A page of the resource index (roadmap WS-Z7).",
-- "type": "object",
-- "additionalProperties": false,
-- "required": [
-- "resources",
-- "next_cursor"
-- ],
-- "properties": {
-- "resources": {
-- "type": "array",
-- "items": {
-- "$ref": "#/components/schemas/common.resource-summary.v1"
-- }
-- },
-- "next_cursor": {
-- "type": [
-- "string",
-- "null"
-- ]
-- },
-- "partial": {
-- "type": "array",
-- "description": "Authorities a merged index (OpenVibe.Services, ADR-048) could not read for this page: a slow or failing authority is omitted, never fails the page. Each entry names the authority and the problem code it answered. Added in 1.1.0; a single authority's own index leaves it out.",
-- "items": {
-- "type": "object",
-- "required": [
-- "service",
-- "code"
-- ],
-- "additionalProperties": false,
-- "properties": {
-- "service": {
-- "type": "string",
-- "pattern": "^[a-z][a-z0-9-]{1,39}$"
-- },
-- "code": {
-- "type": "string",
-- "pattern": "^[a-z][a-z0-9_]*(\\.[a-z0-9_]+)*$"
-- }
-- }
-- }
-- }
-- }
-- },
-- "common.resource-summary.v1": {
-- "title": "ResourceSummary",
-- "description": "One resource of any service, as the resource index lists it (roadmap WS-Z7): every service answers GET /api/v1/resources with these, so OpenVibe.Services shows any resource without owning its data.",
-- "type": "object",
-- "additionalProperties": false,
-- "required": [
-- "id",
-- "kind",
-- "service",
-- "state",
-- "created_at"
-- ],
-- "properties": {
-- "id": {
-- "type": "string"
-- },
-- "kind": {
-- "type": "string",
-- "description": "service.kind, e.g. watch.watch, actor.actor, media.object, events.subscription"
-- },
-- "service": {
-- "type": "string"
-- },
-- "project_id": {
-- "type": "string",
-- "pattern": "^prj_[0-9A-HJKMNP-TV-Z]{26}$"
-- },
-- "ovrn": {
-- "type": "string",
-- "maxLength": 200,
-- "pattern": "^ovrn:[a-z][a-z0-9-]{0,31}:prj_[0-9A-HJKMNP-TV-Z]{26}:[a-z][a-z0-9-]{0,39}/[a-z]{3}_[0-9A-HJKMNP-TV-Z]{26}$",
-- "description": "Optional resource name (ADR-034 section 2), the name grants, audit, events, usage records and bills use: ovrn:<service>:<project_id>:<type>/<id>, e.g. ovrn:watch:<project_id>:watch/<wch_id>, with the pattern of common.usage-recorded@1 resource. Its service, project and id are this summary's service, project_id and id. Added in 1.1.0."
-- },
-- "owner": {
-- "$ref": "#/components/schemas/identity.subject-ref.v1"
-- },
-- "name": {
-- "type": "string"
-- },
-- "state": {
-- "type": "string"
-- },
-- "created_at": {
-- "type": "string",
-- "format": "date-time"
-- },
-- "updated_at": {
-- "type": "string",
-- "format": "date-time"
-- },
-- "usage": {
-- "type": "object",
-- "additionalProperties": {
-- "type": "number",
-- "minimum": 0
-- },
-- "properties": {},
-- "description": "cost units by name (WS-Z1)"
-- },
-- "links": {
-- "type": "object",
-- "additionalProperties": false,
-- "properties": {
-- "self": {
-- "type": "string",
-- "format": "uri"
-- },
-- "console": {
-- "type": "string",
-- "format": "uri"
-- },
-- "docs": {
-- "type": "string",
-- "format": "uri"
-- }
-- }
-- }
-- }
-- },
-- "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}."
-- }
-- }
-- },
-- "host.catalog-manage-request.v1": {
-- "title": "HostCatalogManageRequest",
-- "description": "host.catalog-manage-request@1: bodies of host.catalog.manage on OpenVibe.Host (a Network staff user only). POST/PATCH /api/v1/catalog/providers { slug, name, homepage_url, description?, affiliate_url?, affiliate_note?, status? }; POST/PATCH /api/v1/catalog/plans { provider_id, external_id, name, kind, currency, price_monthly, source_url, vcpu?, ram_mb?, disk_gb?, disk_type?, bandwidth_gb?, unmetered?, port_mbps?, ipv4?, locations?, price_hourly?, setup_fee?, checked_at?, status? } (a plan from OpenVibe.Sources takes only status); POST/PATCH /api/v1/catalog/promos { provider_id, title, url, details?, code?, affiliate?, starts_at?, ends_at?, status? }. A PATCH carries any subset. Unknown fields are refused (422 host.catalog.invalid); a missing entry is 404 host.catalog.not_found; anyone but staff is 403 host.catalog.forbidden. A staff plan's checked_at defaults to now: the staff member confirming the price that day.",
-- "anyOf": [
-- {
-- "type": "object",
-- "additionalProperties": false,
-- "properties": {
-- "slug": {
-- "type": "string",
-- "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
-- "maxLength": 80
-- },
-- "name": {
-- "type": "string",
-- "minLength": 1,
-- "maxLength": 2048
-- },
-- "homepage_url": {
-- "type": "string",
-- "maxLength": 2048,
-- "pattern": "^https?://"
-- },
-- "description": {
-- "type": [
-- "string",
-- "null"
-- ],
-- "maxLength": 2048
-- },
-- "affiliate_url": {
-- "anyOf": [
-- {
-- "type": "string",
-- "maxLength": 2048,
-- "pattern": "^https?://"
-- },
-- {
-- "type": "null"
-- }
-- ]
-- },
-- "affiliate_note": {
-- "type": [
-- "string",
-- "null"
-- ],
-- "maxLength": 2048,
-- "description": "The exact disclosure shown beside the provider's affiliate links."
-- },
-- "status": {
-- "enum": [
-- "active",
-- "hidden"
-- ]
-- }
-- }
-- },
-- {
-- "type": "object",
-- "additionalProperties": false,
-- "properties": {
-- "provider_id": {
-- "type": "string"
-- },
-- "external_id": {
-- "type": "string",
-- "minLength": 1,
-- "maxLength": 2048
-- },
-- "name": {
-- "type": "string",
-- "minLength": 1,
-- "maxLength": 2048
-- },
-- "kind": {
-- "enum": [
-- "cloud",
-- "vps",
-- "dedicated",
-- "storage",
-- "domain"
-- ]
-- },
-- "vcpu": {
-- "type": "number",
-- "minimum": 0
-- },
-- "ram_mb": {
-- "type": "number",
-- "minimum": 0
-- },
-- "disk_gb": {
-- "type": "number",
-- "minimum": 0
-- },
-- "disk_type": {
-- "enum": [
-- "ssd",
-- "nvme",
-- "hdd",
-- null
-- ]
-- },
-- "bandwidth_gb": {
-- "type": "number",
-- "minimum": 0
-- },
-- "unmetered": {
-- "type": [
-- "boolean",
-- "null"
-- ]
-- },
-- "port_mbps": {
-- "type": "number",
-- "minimum": 0
-- },
-- "ipv4": {
-- "type": "integer",
-- "minimum": 0
-- },
-- "locations": {
-- "type": [
-- "array",
-- "null"
-- ],
-- "items": {
-- "type": "string",
-- "minLength": 1
-- }
-- },
-- "currency": {
-- "type": "string",
-- "pattern": "^[A-Z]{3}$",
-- "description": "ISO 4217."
-- },
-- "price_monthly": {
-- "type": "number",
-- "minimum": 0,
-- "exclusiveMaximum": 100000000
-- },
-- "price_hourly": {
-- "type": [
-- "number",
-- "null"
-- ],
-- "minimum": 0
-- },
-- "setup_fee": {
-- "type": [
-- "number",
-- "null"
-- ],
-- "minimum": 0
-- },
-- "source_url": {
-- "type": "string",
-- "maxLength": 2048,
-- "pattern": "^https?://"
-- },
-- "checked_at": {
-- "type": "integer",
-- "minimum": 0,
-- "description": "Epoch milliseconds the price was confirmed."
-- },
-- "status": {
-- "enum": [
-- "active",
-- "gone",
-- "hidden"
-- ]
-- }
-- }
-- },
-- {
-- "type": "object",
-- "additionalProperties": false,
-- "properties": {
-- "provider_id": {
-- "type": "string"
-- },
-- "title": {
-- "type": "string",
-- "minLength": 1,
-- "maxLength": 2048
-- },
-- "details": {
-- "type": [
-- "string",
-- "null"
-- ],
-- "maxLength": 2048
-- },
-- "code": {
-- "type": [
-- "string",
-- "null"
-- ],
-- "maxLength": 2048
-- },
-- "url": {
-- "type": "string",
-- "maxLength": 2048,
-- "pattern": "^https?://"
-- },
-- "affiliate": {
-- "type": [
-- "boolean",
-- "null"
-- ]
-- },
-- "starts_at": {
-- "type": [
-- "integer",
-- "null"
-- ],
-- "minimum": 0,
-- "description": "Epoch milliseconds."
-- },
-- "ends_at": {
-- "type": [
-- "integer",
-- "null"
-- ],
-- "minimum": 0,
-- "description": "Epoch milliseconds."
-- },
-- "status": {
-- "enum": [
-- "active",
-- "ended",
-- "hidden"
-- ]
-- }
-- }
-- }
-- ]
-- },
-- "host.catalog-manage-result.v1": {
-- "title": "HostCatalogManageResult",
-- "description": "host.catalog-manage-result@1: the saved entry, under its type's name: { provider } (with affiliate_rel and affiliate_disclosure when it has an affiliate link), { plan } or { promo } (an active promo past ends_at reads as ended). 201 on create, 200 on update.",
-- "anyOf": [
-- {
-- "type": "object",
-- "required": [
-- "provider"
-- ],
-- "properties": {
-- "provider": {
-- "type": "object",
-- "required": [
-- "id"
-- ],
-- "properties": {
-- "id": {
-- "type": "string"
-- }
-- },
-- "additionalProperties": true
-- }
-- }
-- },
-- {
-- "type": "object",
-- "required": [
-- "plan"
-- ],
-- "properties": {
-- "plan": {
-- "type": "object",
-- "required": [
-- "id"
-- ],
-- "properties": {
-- "id": {
-- "type": "string"
-- }
-- },
-- "additionalProperties": true
-- }
-- }
-- },
-- {
-- "type": "object",
-- "required": [
-- "promo"
-- ],
-- "properties": {
-- "promo": {
-- "type": "object",
-- "required": [
-- "id"
-- ],
-- "properties": {
-- "id": {
-- "type": "string"
-- }
-- },
-- "additionalProperties": true
-- }
-- }
-- }
-- ]
-- },
-- "host.deploy-create-request.v1": {
-- "title": "HostDeployCreateRequest",
-- "description": "host.deploy-create-request@1: bodies of host.deploy.create on OpenVibe.Host (a deployer or above of the project; an app principal added as deployer can deploy from CI). POST /api/v1/sites/:id/deploys uploads a deploy: the raw body is a tar or tar.gz archive (Content-Type application/gzip, application/x-gzip, application/x-tar or application/octet-stream), or multipart/form-data with archive=<one archive> or files=<file>… (each part's filename is its path); optional fields activate=1, root=<subdirectory to deploy> and strip=folder (removes a shared first segment) also work as query parameters. It is validated (path traversal, links, special and hidden files, server-side code, file types, sizes and quotas) and never executed; a refusal is a problem whose extra carries the failed deploy_id and its log (413 upload.too_large, quota.storage; 422 validation codes; 429 quota.deploys_per_day; 403 site.taken_down; 503 upload.busy; 507 storage.host_full). POST /api/v1/deploys/:id/activate { expected_active? } and POST /api/v1/sites/:id/rollback { deploy_id?, expected_active? } switch the site's pointer in one step (rollback without deploy_id goes to the deploy active before; 409 deploy.not_ready, site.active_changed when expected_active is stale, deploy.no_previous). GET /api/v1/sites/:id/deploys, /deploys/:id and /deploys/:id/log take no body.",
-- "anyOf": [
-- {
-- "type": "string",
-- "contentEncoding": "binary",
-- "description": "The upload itself: the tar or tar.gz bytes, or the multipart/form-data body (as common.binary@1)."
-- },
-- {
-- "type": "object",
-- "properties": {
-- "deploy_id": {
-- "anyOf": [
-- {
-- "type": "string",
-- "pattern": "^dpl_[0-9A-HJKMNP-TV-Z]{26}$"
-- },
-- {
-- "type": "null"
-- }
-- ]
-- },
-- "expected_active": {
-- "anyOf": [
-- {
-- "type": "string",
-- "pattern": "^dpl_[0-9A-HJKMNP-TV-Z]{26}$"
-- },
-- {
-- "type": "null"
-- }
-- ],
-- "description": "The deploy you saw active (null: none); refused with 409 site.active_changed when it moved."
-- }
-- }
-- },
-- {
-- "$ref": "#/components/schemas/common.no-body.v1"
-- }
-- ]
-- },
-- "host.deploy-create-result.v1": {
-- "title": "HostDeployCreateResult",
-- "description": "host.deploy-create-result@1: answers of host.deploy.create on OpenVibe.Host. GET /api/v1/sites/:id/deploys?limit= → { active_deploy_id, deploys, activations } (newest first; the last 20 pointer switches). POST /api/v1/sites/:id/deploys → 201 { deploy, activated, url } (the ready deploy with its validation log; activated when activate=1 switched the site to it). GET /api/v1/deploys/:id → { deploy } with its files. GET /api/v1/deploys/:id/log → { deploy_id, state, log }. POST /api/v1/deploys/:id/activate and /sites/:id/rollback → { active_deploy_id, previous_deploy_id, changed } (changed false when it was already active). Emits host.deploy.created|activated|failed.",
-- "anyOf": [
-- {
-- "type": "object",
-- "required": [
-- "active_deploy_id",
-- "deploys",
-- "activations"
-- ],
-- "properties": {
-- "active_deploy_id": {
-- "anyOf": [
-- {
-- "type": "string",
-- "pattern": "^dpl_[0-9A-HJKMNP-TV-Z]{26}$"
-- },
-- {
-- "type": "null"
-- }
-- ]
-- },
-- "deploys": {
-- "type": "array",
-- "items": {
-- "$ref": "#/components/schemas/host.deploy.v1"
-- }
-- },
-- "activations": {
-- "type": "array",
-- "items": {
-- "type": "object",
-- "required": [
-- "deploy_id",
-- "previous_deploy_id",
-- "kind",
-- "actor",
-- "at"
-- ],
-- "properties": {
-- "deploy_id": {
-- "type": "string",
-- "pattern": "^dpl_[0-9A-HJKMNP-TV-Z]{26}$"
-- },
-- "previous_deploy_id": {
-- "anyOf": [
-- {
-- "type": "string",
-- "pattern": "^dpl_[0-9A-HJKMNP-TV-Z]{26}$"
-- },
-- {
-- "type": "null"
-- }
-- ]
-- },
-- "kind": {
-- "enum": [
-- "activate",
-- "rollback"
-- ]
-- },
-- "actor": {
-- "type": "string"
-- },
-- "at": {
-- "type": "string",
-- "format": "date-time"
-- }
-- }
-- }
-- }
-- }
-- },
-- {
-- "type": "object",
-- "required": [
-- "deploy"
-- ],
-- "properties": {
-- "deploy": {
-- "$ref": "#/components/schemas/host.deploy.v1"
-- },
-- "activated": {
-- "type": "boolean"
-- },
-- "url": {
-- "type": "string"
-- }
-- }
-- },
-- {
-- "type": "object",
-- "required": [
-- "deploy_id",
-- "state",
-- "log"
-- ],
-- "properties": {
-- "deploy_id": {
-- "type": "string",
-- "pattern": "^dpl_[0-9A-HJKMNP-TV-Z]{26}$"
-- },
-- "state": {
-- "enum": [
-- "ready",
-- "failed",
-- "deleted"
-- ]
-- },
-- "log": {
-- "type": "array",
-- "items": {
-- "type": "object",
-- "required": [
-- "level",
-- "message",
-- "at"
-- ],
-- "properties": {
-- "level": {
-- "enum": [
-- "info",
-- "warn",
-- "error"
-- ]
-- },
-- "message": {
-- "type": "string"
-- },
-- "at": {
-- "type": "string",
-- "format": "date-time"
-- }
-- }
-- }
-- }
-- }
-- },
-- {
-- "type": "object",
-- "required": [
-- "active_deploy_id",
-- "previous_deploy_id",
-- "changed"
-- ],
-- "properties": {
-- "active_deploy_id": {
-- "type": "string",
-- "pattern": "^dpl_[0-9A-HJKMNP-TV-Z]{26}$"
-- },
-- "previous_deploy_id": {
-- "anyOf": [
-- {
-- "type": "string",
-- "pattern": "^dpl_[0-9A-HJKMNP-TV-Z]{26}$"
-- },
-- {
-- "type": "null"
-- }
-- ]
-- },
-- "changed": {
-- "type": "boolean"
-- }
-- }
-- }
-- ]
-- },
-- "host.deploy.v1": {
-- "title": "HostDeploy",
-- "description": "host.deploy@1: one immutable static deploy on OpenVibe.Host (server/http/serialize.js deploy): ready (validated and stored, never executed) or failed (refused, with its failure code and log), whether the site serves it, its size and manifest hash. GET /api/v1/deploys/:id adds the files; the upload answer adds the log.",
-- "type": "object",
-- "required": [
-- "id",
-- "site_id",
-- "project_id",
-- "state",
-- "active",
-- "source",
-- "file_count",
-- "total_bytes",
-- "new_bytes",
-- "manifest_sha256",
-- "failure_code",
-- "created_by",
-- "created_at"
-- ],
-- "properties": {
-- "id": {
-- "type": "string",
-- "pattern": "^dpl_[0-9A-HJKMNP-TV-Z]{26}$"
-- },
-- "site_id": {
-- "type": "string",
-- "pattern": "^site_[0-9A-HJKMNP-TV-Z]{26}$"
-- },
-- "project_id": {
-- "type": "string",
-- "pattern": "^prj_[0-9A-HJKMNP-TV-Z]{26}$"
-- },
-- "state": {
-- "enum": [
-- "ready",
-- "failed",
-- "deleted"
-- ]
-- },
-- "active": {
-- "type": "boolean"
-- },
-- "source": {
-- "enum": [
-- "archive",
-- "files",
-- "preview",
-- "git"
-- ]
-- },
-- "git": {
-- "type": "object",
-- "required": [
-- "provider",
-- "repo_url",
-- "ref",
-- "commit_sha"
-- ],
-- "properties": {
-- "provider": {
-- "type": "string"
-- },
-- "repo_url": {
-- "type": "string"
-- },
-- "ref": {
-- "type": "string"
-- },
-- "commit_sha": {
-- "type": "string",
-- "pattern": "^[0-9a-f]{40}$"
-- }
-- },
-- "description": "Present on source git: the commit this deploy was built from (public provenance, never a credential)."
-- },
-- "file_count": {
-- "type": "integer",
-- "minimum": 0
-- },
-- "total_bytes": {
-- "type": "integer",
-- "minimum": 0
-- },
-- "new_bytes": {
-- "type": "integer",
-- "minimum": 0,
-- "description": "Bytes this deploy added to the project's store."
-- },
-- "manifest_sha256": {
-- "type": [
-- "string",
-- "null"
-- ],
-- "pattern": "^[0-9a-f]{64}$"
-- },
-- "failure_code": {
-- "type": [
-- "string",
-- "null"
-- ]
-- },
-- "created_by": {
-- "type": "string"
-- },
-- "created_at": {
-- "type": "string",
-- "format": "date-time"
-- },
-- "files": {
-- "type": "array",
-- "items": {
-- "type": "object",
-- "required": [
-- "path",
-- "sha256",
-- "size",
-- "content_type"
-- ],
-- "properties": {
-- "path": {
-- "type": "string"
-- },
-- "sha256": {
-- "type": "string",
-- "pattern": "^[0-9a-f]{64}$"
-- },
-- "size": {
-- "type": "integer",
-- "minimum": 0
-- },
-- "content_type": {
-- "type": "string"
-- }
-- }
-- }
-- },
-- "log": {
-- "type": "array",
-- "items": {
-- "type": "object",
-- "required": [
-- "level",
-- "message",
-- "at"
-- ],
-- "properties": {
-- "level": {
-- "enum": [
-- "info",
-- "warn",
-- "error"
-- ]
-- },
-- "message": {
-- "type": "string"
-- },
-- "at": {
-- "type": "string",
-- "format": "date-time"
-- }
-- }
-- }
-- }
-- }
-- },
-- "host.domain-manage-request.v1": {
-- "title": "HostDomainManageRequest",
-- "description": "host.domain-manage-request@1: bodies of host.domain.manage on OpenVibe.Host (a maintainer or above of the project). POST /api/v1/sites/:id/domains { hostname } adds a custom domain, pending until its TXT record is verified: a fully qualified host name, lowercased (422 domain.invalid_hostname; 422 domain.reserved for any OpenVibe domain; 403 domain.sandbox in sandbox projects; 429 quota.custom_domains; 409 domain.exists, domain.taken). GET /api/v1/sites/:id/domains, POST /api/v1/domains/:id/verify (checks the TXT record now) and DELETE /api/v1/domains/:id (409 domain.default: the default domain goes only with the site) take no body.",
-- "anyOf": [
-- {
-- "type": "object",
-- "required": [
-- "hostname"
-- ],
-- "properties": {
-- "hostname": {
-- "type": "string",
-- "minLength": 1,
-- "maxLength": 254,
-- "description": "e.g. www.example.org (a trailing dot is dropped)."
-- }
-- }
-- },
-- {
-- "$ref": "#/components/schemas/common.no-body.v1"
-- }
-- ]
-- },
-- "host.domain-manage-result.v1": {
-- "title": "HostDomainManageResult",
-- "description": "host.domain-manage-result@1: answers of host.domain.manage on OpenVibe.Host. GET /api/v1/sites/:id/domains → { domains } (the default domain first). POST /api/v1/sites/:id/domains → 201 { domain } with the DNS records to publish. POST /api/v1/domains/:id/verify → { domain } after the check (status verified and served once the TXT record matches, else last_error says what was found; emits host.domain.verified). DELETE /api/v1/domains/:id → { deleted: true }.",
-- "anyOf": [
-- {
-- "type": "object",
-- "required": [
-- "domains"
-- ],
-- "properties": {
-- "domains": {
-- "type": "array",
-- "items": {
-- "$ref": "#/components/schemas/host.domain.v1"
-- }
-- }
-- }
-- },
-- {
-- "type": "object",
-- "required": [
-- "domain"
-- ],
-- "properties": {
-- "domain": {
-- "$ref": "#/components/schemas/host.domain.v1"
-- }
-- }
-- },
-- {
-- "type": "object",
-- "required": [
-- "deleted"
-- ],
-- "properties": {
-- "deleted": {
-- "const": true
-- }
-- }
-- }
-- ]
-- },
-- "host.domain.v1": {
-- "title": "HostDomain",
-- "description": "host.domain@1: one domain of a static site on OpenVibe.Host (server/http/serialize.js domain): the default <site>.openvibe.host, or a custom domain that is served only once its DNS TXT record is verified (re-checked daily; it lapses when the record is gone). A custom domain carries the records its owner must publish (the TXT verification value is public by design and shown only to members); TLS certificates are issued by an operator.",
-- "type": "object",
-- "required": [
-- "id",
-- "site_id",
-- "hostname",
-- "kind",
-- "status",
-- "served",
-- "verified_at",
-- "last_checked_at",
-- "last_error"
-- ],
-- "properties": {
-- "id": {
-- "type": "string",
-- "pattern": "^dom_[0-9A-HJKMNP-TV-Z]{26}$"
-- },
-- "site_id": {
-- "type": "string",
-- "pattern": "^site_[0-9A-HJKMNP-TV-Z]{26}$"
-- },
-- "hostname": {
-- "type": "string"
-- },
-- "kind": {
-- "enum": [
-- "default",
-- "custom"
-- ]
-- },
-- "status": {
-- "enum": [
-- "pending",
-- "verified",
-- "failed",
-- "lapsed"
-- ]
-- },
-- "served": {
-- "type": "boolean"
-- },
-- "verified_at": {
-- "type": [
-- "string",
-- "null"
-- ],
-- "format": "date-time"
-- },
-- "last_checked_at": {
-- "type": [
-- "string",
-- "null"
-- ],
-- "format": "date-time"
-- },
-- "last_error": {
-- "type": [
-- "string",
-- "null"
-- ]
-- },
-- "instructions": {
-- "type": "object",
-- "required": [
-- "verification",
-- "routing",
-- "tls"
-- ],
-- "properties": {
-- "verification": {
-- "type": "object",
-- "required": [
-- "type",
-- "name",
-- "value"
-- ],
-- "properties": {
-- "type": {
-- "const": "TXT"
-- },
-- "name": {
-- "type": "string",
-- "description": "_openvibe-host.<hostname>"
-- },
-- "value": {
-- "type": "string",
-- "description": "openvibe-host-verification=<token>"
-- },
-- "note": {
-- "type": "string"
-- }
-- }
-- },
-- "routing": {
-- "type": "array",
-- "items": {
-- "type": "object",
-- "required": [
-- "type",
-- "name",
-- "value"
-- ],
-- "properties": {
-- "type": {
-- "type": "string"
-- },
-- "name": {
-- "type": "string"
-- },
-- "value": {
-- "type": "string"
-- },
-- "note": {
-- "type": "string"
-- }
-- }
-- },
-- "description": "A CNAME for a subdomain; A/AAAA for an apex domain when the operator configured them."
-- },
-- "tls": {
-- "type": "string"
-- }
-- }
-- }
-- }
-- },
-- "host.project.v1": {
-- "title": "HostProject",
-- "description": "host.project@1: one OpenVibe.Host tenant project (server/http/serialize.js project): owned by a person (usr_…), production or sandbox, with the caller's role in it and any staff takedown. POST /api/v1/projects and GET /api/v1/projects/:id add the effective quota and the usage.",
-- "type": "object",
-- "required": [
-- "id",
-- "name",
-- "environment",
-- "network_project_id",
-- "owner",
-- "role",
-- "created_at",
-- "takedown"
-- ],
-- "properties": {
-- "id": {
-- "type": "string",
-- "pattern": "^prj_[0-9A-HJKMNP-TV-Z]{26}$"
-- },
-- "name": {
-- "type": "string",
-- "minLength": 1,
-- "maxLength": 80
-- },
-- "environment": {
-- "enum": [
-- "production",
-- "sandbox"
-- ]
-- },
-- "network_project_id": {
-- "type": [
-- "string",
-- "null"
-- ],
-- "description": "The OpenVibe.Network project once Network has projects."
-- },
-- "owner": {
-- "type": "string",
-- "pattern": "^usr_[0-9A-HJKMNP-TV-Z]{26}$"
-- },
-- "role": {
-- "enum": [
-- "owner",
-- "maintainer",
-- "deployer",
-- "staff",
-- null
-- ],
-- "description": "The caller's role (staff: a Network admin who is not a member)."
-- },
-- "created_at": {
-- "type": "string",
-- "format": "date-time"
-- },
-- "takedown": {
-- "type": [
-- "object",
-- "null"
-- ],
-- "required": [
-- "scope",
-- "reason",
-- "since"
-- ],
-- "description": "A staff takedown covering it: serving stops while the content is kept for review.",
-- "properties": {
-- "scope": {
-- "enum": [
-- "project",
-- "site"
-- ]
-- },
-- "reason": {
-- "type": "string"
-- },
-- "since": {
-- "type": [
-- "string",
-- "null"
-- ],
-- "format": "date-time"
-- }
-- }
-- },
-- "quota": {
-- "type": "object",
-- "required": [
-- "storage_bytes",
-- "deploys_per_day",
-- "max_files",
-- "max_file_bytes",
-- "sites",
-- "custom_domains"
-- ],
-- "description": "The effective quota: the project's override where set, else its environment's default.",
-- "properties": {
-- "storage_bytes": {
-- "type": "integer",
-- "minimum": 0
-- },
-- "deploys_per_day": {
-- "type": "integer",
-- "minimum": 0
-- },
-- "max_files": {
-- "type": "integer",
-- "minimum": 0
-- },
-- "max_file_bytes": {
-- "type": "integer",
-- "minimum": 0
-- },
-- "sites": {
-- "type": "integer",
-- "minimum": 0
-- },
-- "custom_domains": {
-- "type": "integer",
-- "minimum": 0
-- }
-- }
-- },
-- "usage": {
-- "type": "object",
-- "required": [
-- "storage_bytes",
-- "objects",
-- "deploys_last_24h",
-- "sites",
-- "custom_domains"
-- ],
-- "properties": {
-- "storage_bytes": {
-- "type": "integer",
-- "minimum": 0
-- },
-- "objects": {
-- "type": "integer",
-- "minimum": 0
-- },
-- "deploys_last_24h": {
-- "type": "integer",
-- "minimum": 0
-- },
-- "sites": {
-- "type": "integer",
-- "minimum": 0
-- },
-- "custom_domains": {
-- "type": "integer",
-- "minimum": 0
-- }
-- }
-- }
-- }
-- },
-- "host.site-config-request.v1": {
-- "title": "HostSiteConfigRequest",
-- "description": "host.site-config-request@1: the body of PUT /api/v1/sites/:id/config on OpenVibe.Host (host.site.config; the acting principal must be a maintainer or owner of the site's project). { headers?, redirects?, spa? } replaces the whole configuration: a field left out is reset to its default. A redirect's status defaults to 301. Refusals are 422 problem+json: site_config.reserved_header, site_config.header_name, site_config.header_value (longer than 1024 characters or a control character), site_config.too_many (over 50 headers or 200 redirects), site_config.redirect (not a local path, a duplicate from, or a status outside 301/302/307/308), site_config.headers and site_config.redirects (wrong type). GET and DELETE /api/v1/sites/:id/config take no body (DELETE resets to the defaults).",
-- "type": "object",
-- "additionalProperties": false,
-- "properties": {
-- "headers": {
-- "type": "object",
-- "additionalProperties": {
-- "type": "string"
-- }
-- },
-- "redirects": {
-- "type": "array",
-- "items": {
-- "type": "object",
-- "additionalProperties": false,
-- "required": [
-- "from",
-- "to"
-- ],
-- "properties": {
-- "from": {
-- "type": "string"
-- },
-- "to": {
-- "type": "string"
-- },
-- "status": {
-- "enum": [
-- 301,
-- 302,
-- 307,
-- 308
-- ]
-- }
-- }
-- }
-- },
-- "spa": {
-- "type": "boolean"
-- }
-- }
-- },
-- "host.site-config-result.v1": {
-- "title": "HostSiteConfigResult",
-- "description": "host.site-config-result@1: every answer of host.site.config on OpenVibe.Host. GET, PUT and DELETE /api/v1/sites/:id/config → { config } (after a PUT, the configuration as stored; after a DELETE, the defaults).",
-- "type": "object",
-- "additionalProperties": false,
-- "required": [
-- "config"
-- ],
-- "properties": {
-- "config": {
-- "$ref": "#/components/schemas/host.site-config.v1"
-- }
-- }
-- },
-- "host.site-config.v1": {
-- "title": "HostSiteConfig",
-- "description": "host.site-config@1: one Host site's serving configuration (plan T12 J3). headers are applied to every response of the site before the platform's own, which always win; the platform's security, routing, caching, scope and transport headers (Content-Security-Policy, Strict-Transport-Security, Set-Cookie, Cache-Control, Content-Type, Location, Service-Worker-Allowed, Alt-Svc and the rest of Host's reserved list) and every X-Forwarded-* header are refused. redirects are local paths only (no scheme, host, protocol-relative URL, backslash or control character, also after percent-decoding). spa serves /index.html for an extensionless path that has no file. A site with no configuration answers { headers: {}, redirects: [], spa: false }.",
-- "type": "object",
-- "additionalProperties": false,
-- "required": [
-- "headers",
-- "redirects",
-- "spa"
-- ],
-- "properties": {
-- "headers": {
-- "type": "object",
-- "maxProperties": 50,
-- "propertyNames": {
-- "pattern": "^[A-Za-z0-9][A-Za-z0-9-]{0,63}$"
-- },
-- "additionalProperties": {
-- "type": "string",
-- "maxLength": 1024
-- }
-- },
-- "redirects": {
-- "type": "array",
-- "maxItems": 200,
-- "items": {
-- "type": "object",
-- "additionalProperties": false,
-- "required": [
-- "from",
-- "to",
-- "status"
-- ],
-- "properties": {
-- "from": {
-- "type": "string",
-- "pattern": "^/(?!/)",
-- "maxLength": 1024
-- },
-- "to": {
-- "type": "string",
-- "pattern": "^/(?!/)",
-- "maxLength": 1024
-- },
-- "status": {
-- "enum": [
-- 301,
-- 302,
-- 307,
-- 308
-- ]
-- }
-- }
-- }
-- },
-- "spa": {
-- "type": "boolean"
-- }
-- }
-- },
-- "host.site-manage-request.v1": {
-- "title": "HostSiteManageRequest",
-- "description": "host.site-manage-request@1: bodies of host.site.manage on OpenVibe.Host (judged by the acting principal's project role too; a sandbox token is refused on production projects). POST /api/v1/projects { name, environment?, network_project_id? } creates a project owned by the person named with X-OV-Subject (403 project.owner_must_be_user; 422 project.invalid_name over 80 characters, project.invalid_environment; 429 quota.projects; 409 project.network_project_taken). PUT /api/v1/projects/:id/quota { storage_bytes?, deploys_per_day?, max_files?, max_file_bytes?, sites?, custom_domains? } (a Network staff user: 403 auth.staff_only; fields left out keep their value). PUT /api/v1/projects/:id/members/:principal { role } (the owner: 422 member.invalid_role, 409 member.owner_fixed). POST /api/v1/projects/:id/sites { name } (a maintainer; lowercased and trimmed, one DNS label of 3–40 characters: 422 site.invalid_name, site.name_reserved; 409 site.name_taken, site.name_held; 429 quota.sites). POST /api/v1/projects/:id/takedown and /sites/:id/takedown { reason } (staff: stop serving, keep the content; 409 takedown.exists); DELETE on those { note? } lifts it. GET /api/v1/projects, /projects/:id, /projects/:id/quota, /projects/:id/sites and /sites/:id, and DELETE /api/v1/projects/:id, /projects/:id/members/:principal, /sites/:id and /deploys/:id take no body (deleting refuses taken-down content for non-staff: 409 site.taken_down; an active deploy: 409 deploy.active).",
-- "anyOf": [
-- {
-- "type": "object",
-- "required": [
-- "name"
-- ],
-- "properties": {
-- "name": {
-- "type": "string",
-- "minLength": 1,
-- "description": "1–80 characters once trimmed."
-- },
-- "environment": {
-- "enum": [
-- "production",
-- "sandbox",
-- null
-- ],
-- "description": "Default production; a sandbox credential creates sandbox projects only."
-- },
-- "network_project_id": {
-- "anyOf": [
-- {
-- "type": "string",
-- "pattern": "^([A-Za-z0-9_:-]{3,80})?$"
-- },
-- {
-- "type": "null"
-- }
-- ]
-- }
-- }
-- },
-- {
-- "type": "object",
-- "properties": {
-- "storage_bytes": {
-- "type": [
-- "integer",
-- "null"
-- ],
-- "minimum": 0,
-- "description": "A non-negative integer, or null for the environment default."
-- },
-- "deploys_per_day": {
-- "type": [
-- "integer",
-- "null"
-- ],
-- "minimum": 0,
-- "description": "A non-negative integer, or null for the environment default."
-- },
-- "max_files": {
-- "type": [
-- "integer",
-- "null"
-- ],
-- "minimum": 0,
-- "description": "A non-negative integer, or null for the environment default."
-- },
-- "max_file_bytes": {
-- "type": [
-- "integer",
-- "null"
-- ],
-- "minimum": 0,
-- "description": "A non-negative integer, or null for the environment default."
-- },
-- "sites": {
-- "type": [
-- "integer",
-- "null"
-- ],
-- "minimum": 0,
-- "description": "A non-negative integer, or null for the environment default."
-- },
-- "custom_domains": {
-- "type": [
-- "integer",
-- "null"
-- ],
-- "minimum": 0,
-- "description": "A non-negative integer, or null for the environment default."
-- }
-- }
-- },
-- {
-- "type": "object",
-- "required": [
-- "role"
-- ],
-- "properties": {
-- "role": {
-- "enum": [
-- "owner",
-- "maintainer",
-- "deployer"
-- ],
-- "description": "Only a person (usr_…) can be an owner."
-- }
-- }
++ }
++ },
++ "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"
},
-- {
-- "type": "object",
-- "required": [
-- "name"
-- ],
-- "properties": {
-- "name": {
-- "type": "string",
-- "pattern": "^\\s*[A-Za-z0-9](?:[A-Za-z0-9]|-(?=[A-Za-z0-9])){2,39}\\s*$",
-- "description": "The site name (lowercased)."
-- }
-- }
++ "title": {
++ "type": "string",
++ "minLength": 1
},
-- {
-- "type": "object",
-- "required": [
-- "reason"
-- ],
-- "properties": {
-- "reason": {
-- "type": "string",
-- "minLength": 1,
-- "maxLength": 500,
-- "description": "Members see it."
-- }
-- }
++ "status": {
++ "type": "integer",
++ "minimum": 400,
++ "maximum": 599
},
-- {
-- "type": "object",
-- "properties": {
-- "note": {
-- "type": [
-- "string",
-- "null"
-- ],
-- "description": "Cut to 500 characters."
-- }
-- }
++ "detail": {
++ "type": "string"
},
-- {
-- "$ref": "#/components/schemas/common.no-body.v1"
-- }
-- ]
-- },
-- "host.site-manage-result.v1": {
-- "title": "HostSiteManageResult",
-- "description": "host.site-manage-result@1: answers of host.site.manage on OpenVibe.Host. GET /api/v1/projects → { projects } (the caller's projects with their role). POST /api/v1/projects → 201 { project } (with quota and usage). GET /api/v1/projects/:id → { project, sites, members }. GET and PUT /api/v1/projects/:id/quota → { quota, usage }. PUT and DELETE /api/v1/projects/:id/members/:principal → { members }. GET /api/v1/projects/:id/sites → { sites }. POST /api/v1/projects/:id/sites → 201 { site }. GET /api/v1/sites/:id → { site, domains }. DELETE /api/v1/projects/:id and /sites/:id → { deleted: true } (serving stops at once; the objects are removed). DELETE /api/v1/deploys/:id → { deleted: true, objects_removed }. POST …/takedown → 201 { takedown }; DELETE …/takedown → { lifted: true }.",
-- "anyOf": [
-- {
-- "type": "object",
-- "required": [
-- "projects"
-- ],
-- "properties": {
-- "projects": {
-- "type": "array",
-- "items": {
-- "$ref": "#/components/schemas/host.project.v1"
-- }
-- }
-- }
++ "instance": {
++ "type": "string",
++ "format": "uri-reference"
},
-- {
-- "type": "object",
-- "required": [
-- "project"
-- ],
-- "properties": {
-- "project": {
-- "$ref": "#/components/schemas/host.project.v1"
-- },
-- "sites": {
-- "type": "array",
-- "items": {
-- "$ref": "#/components/schemas/host.site.v1"
-- }
-- },
-- "members": {
-- "type": "array",
-- "items": {
-- "type": "object",
-- "required": [
-- "principal",
-- "role",
-- "added_at"
-- ],
-- "properties": {
-- "principal": {
-- "type": "string",
-- "description": "usr_…, app:app_… or svc:…"
-- },
-- "role": {
-- "enum": [
-- "owner",
-- "maintainer",
-- "deployer"
-- ]
-- },
-- "added_at": {
-- "type": "string",
-- "format": "date-time"
-- }
-- }
-- }
-- }
-- }
++ "code": {
++ "type": "string",
++ "pattern": "^[a-z][a-z0-9_]*(\\.[a-z0-9_]+)*$"
},
-- {
-- "type": "object",
-- "required": [
-- "quota",
-- "usage"
-- ],
-- "properties": {
-- "quota": {
-- "type": "object",
-- "required": [
-- "storage_bytes",
-- "deploys_per_day",
-- "max_files",
-- "max_file_bytes",
-- "sites",
-- "custom_domains"
-- ],
-- "description": "The effective quota: the project's override where set, else its environment's default.",
-- "properties": {
-- "storage_bytes": {
-- "type": "integer",
-- "minimum": 0
-- },
-- "deploys_per_day": {
-- "type": "integer",
-- "minimum": 0
-- },
-- "max_files": {
-- "type": "integer",
-- "minimum": 0
-- },
-- "max_file_bytes": {
-- "type": "integer",
-- "minimum": 0
-- },
-- "sites": {
-- "type": "integer",
-- "minimum": 0
-- },
-- "custom_domains": {
-- "type": "integer",
-- "minimum": 0
-- }
-- }
-- },
-- "usage": {
-- "type": "object",
-- "required": [
-- "storage_bytes",
-- "objects",
-- "deploys_last_24h",
-- "sites",
-- "custom_domains"
-- ],
-- "properties": {
-- "storage_bytes": {
-- "type": "integer",
-- "minimum": 0
-- },
-- "objects": {
-- "type": "integer",
-- "minimum": 0
-- },
-- "deploys_last_24h": {
-- "type": "integer",
-- "minimum": 0
-- },
-- "sites": {
-- "type": "integer",
-- "minimum": 0
-- },
-- "custom_domains": {
-- "type": "integer",
-- "minimum": 0
-- }
-- }
-- }
-- }
++ "request_id": {
++ "type": "string"
},
-- {
-- "type": "object",
-- "required": [
-- "members"
-- ],
-- "properties": {
-- "members": {
-- "type": "array",
-- "items": {
-- "type": "object",
-- "required": [
-- "principal",
-- "role",
-- "added_at"
-- ],
-- "properties": {
-- "principal": {
-- "type": "string",
-- "description": "usr_…, app:app_… or svc:…"
-- },
-- "role": {
-- "enum": [
-- "owner",
-- "maintainer",
-- "deployer"
-- ]
-- },
-- "added_at": {
-- "type": "string",
-- "format": "date-time"
-- }
-- }
-- }
-- }
-- }
++ "trace_id": {
++ "type": "string",
++ "pattern": "^[0-9a-f]{32}$"
},
-- {
-- "type": "object",
-- "required": [
-- "sites"
-- ],
-- "properties": {
-- "sites": {
-- "type": "array",
-- "items": {
-- "$ref": "#/components/schemas/host.site.v1"
++ "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}."
++ }
++ }
++ },
++ "host.catalog-manage-request.v1": {
++ "title": "HostCatalogManageRequest",
++ "description": "host.catalog-manage-request@1: bodies of host.catalog.manage on OpenVibe.Host (a Network staff user only). POST/PATCH /api/v1/catalog/providers { slug, name, homepage_url, description?, affiliate_url?, affiliate_note?, status? }; POST/PATCH /api/v1/catalog/plans { provider_id, external_id, name, kind, currency, price_monthly, source_url, vcpu?, ram_mb?, disk_gb?, disk_type?, bandwidth_gb?, unmetered?, port_mbps?, ipv4?, locations?, price_hourly?, setup_fee?, checked_at?, status? } (a plan from OpenVibe.Sources takes only status); POST/PATCH /api/v1/catalog/promos { provider_id, title, url, details?, code?, affiliate?, starts_at?, ends_at?, status? }. A PATCH carries any subset. Unknown fields are refused (422 host.catalog.invalid); a missing entry is 404 host.catalog.not_found; anyone but staff is 403 host.catalog.forbidden. A staff plan's checked_at defaults to now: the staff member confirming the price that day.",
++ "anyOf": [
{
"type": "object",
-- "required": [
-- "site"
-- ],
++ "additionalProperties": false,
"properties": {
-- "site": {
-- "$ref": "#/components/schemas/host.site.v1"
++ "slug": {
++ "type": "string",
++ "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
++ "maxLength": 80
},
-- "domains": {
-- "type": "array",
-- "items": {
-- "$ref": "#/components/schemas/host.domain.v1"
-- }
-- }
-- }
-- },
-- {
-- "type": "object",
-- "required": [
-- "deleted"
-- ],
-- "properties": {
-- "deleted": {
-- "const": true
++ "name": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 2048
},
-- "objects_removed": {
-- "type": "integer",
-- "minimum": 0
-- }
-- }
-- },
-- {
-- "type": "object",
-- "required": [
-- "takedown"
-- ],
-- "properties": {
-- "takedown": {
-- "type": "object",
-- "required": [
-- "scope",
-- "reason",
-- "since"
-- ],
-- "description": "The takedown now in force.",
-- "properties": {
-- "scope": {
-- "enum": [
-- "project",
-- "site"
-- ]
-- },
-- "reason": {
-- "type": "string"
-- },
-- "since": {
-- "type": [
-- "string",
-- "null"
-- ],
-- "format": "date-time"
-- }
-- }
-- }
-- }
-- },
-- {
-- "type": "object",
-- "required": [
-- "lifted"
-- ],
-- "properties": {
-- "lifted": {
-- "const": true
-- }
-- }
-- }
-- ]
-- },
-- "host.site.v1": {
-- "title": "HostSite",
-- "description": "host.site@1: one static site on OpenVibe.Host (server/http/serialize.js site): its name (one DNS label), the default hostname and URL it is served at, the deploy it serves (one pointer; null until a deploy is activated) and any staff takedown.",
-- "type": "object",
-- "required": [
-- "id",
-- "project_id",
-- "name",
-- "hostname",
-- "url",
-- "active_deploy_id",
-- "takedown",
-- "created_at",
-- "updated_at"
-- ],
-- "properties": {
-- "id": {
-- "type": "string",
-- "pattern": "^site_[0-9A-HJKMNP-TV-Z]{26}$"
-- },
-- "project_id": {
-- "type": "string",
-- "pattern": "^prj_[0-9A-HJKMNP-TV-Z]{26}$"
-- },
-- "name": {
-- "type": "string",
-- "pattern": "^[a-z0-9](?:[a-z0-9]|-(?=[a-z0-9])){2,39}$"
-- },
-- "hostname": {
-- "type": "string"
-- },
-- "url": {
-- "type": "string"
-- },
-- "active_deploy_id": {
-- "anyOf": [
-- {
++ "homepage_url": {
"type": "string",
-- "pattern": "^dpl_[0-9A-HJKMNP-TV-Z]{26}$"
++ "maxLength": 2048,
++ "pattern": "^https?://"
},
-- {
-- "type": "null"
-- }
-- ]
-- },
-- "takedown": {
-- "type": [
-- "object",
-- "null"
-- ],
-- "required": [
-- "scope",
-- "reason",
-- "since"
-- ],
-- "description": "A staff takedown covering it: serving stops while the content is kept for review.",
-- "properties": {
-- "scope": {
-- "enum": [
-- "project",
-- "site"
++ "description": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "maxLength": 2048
++ },
++ "affiliate_url": {
++ "anyOf": [
++ {
++ "type": "string",
++ "maxLength": 2048,
++ "pattern": "^https?://"
++ },
++ {
++ "type": "null"
++ }
]
},
-- "reason": {
-- "type": "string"
-- },
-- "since": {
++ "affiliate_note": {
"type": [
"string",
"null"
],
-- "format": "date-time"
++ "maxLength": 2048,
++ "description": "The exact disclosure shown beside the provider's affiliate links."
++ },
++ "status": {
++ "enum": [
++ "active",
++ "hidden"
++ ]
}
}
},
-- "created_at": {
-- "type": "string",
-- "format": "date-time"
-- },
-- "updated_at": {
-- "type": "string",
-- "format": "date-time"
-- }
-- }
-- },
-- "identity.subject-ref.v1": {
-- "title": "SubjectRef",
-- "description": "The one cross-platform reference to an actor. Issued by OpenVibe.Network. Never a service-local integer id.",
-- "oneOf": [
{
"type": "object",
-- "required": [
-- "type",
-- "id"
-- ],
"additionalProperties": false,
"properties": {
-- "type": {
-- "const": "user"
++ "provider_id": {
++ "type": "string"
},
-- "id": {
++ "external_id": {
"type": "string",
-- "pattern": "^usr_[0-9A-HJKMNP-TV-Z]{26}$"
-- }
-- },
-- "description": "UserSubject"
-- },
-- {
-- "type": "object",
-- "required": [
-- "type",
-- "id"
-- ],
-- "additionalProperties": false,
-- "properties": {
-- "type": {
-- "const": "guest"
++ "minLength": 1,
++ "maxLength": 2048
++ },
++ "name": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 2048
++ },
++ "kind": {
++ "enum": [
++ "cloud",
++ "vps",
++ "dedicated",
++ "storage",
++ "domain"
++ ]
++ },
++ "vcpu": {
++ "type": "number",
++ "minimum": 0
++ },
++ "ram_mb": {
++ "type": "number",
++ "minimum": 0
++ },
++ "disk_gb": {
++ "type": "number",
++ "minimum": 0
++ },
++ "disk_type": {
++ "enum": [
++ "ssd",
++ "nvme",
++ "hdd",
++ null
++ ]
++ },
++ "bandwidth_gb": {
++ "type": "number",
++ "minimum": 0
++ },
++ "unmetered": {
++ "type": [
++ "boolean",
++ "null"
++ ]
++ },
++ "port_mbps": {
++ "type": "number",
++ "minimum": 0
++ },
++ "ipv4": {
++ "type": "integer",
++ "minimum": 0
++ },
++ "locations": {
++ "type": [
++ "array",
++ "null"
++ ],
++ "items": {
++ "type": "string",
++ "minLength": 1
++ }
++ },
++ "currency": {
++ "type": "string",
++ "pattern": "^[A-Z]{3}$",
++ "description": "ISO 4217."
++ },
++ "price_monthly": {
++ "type": "number",
++ "minimum": 0,
++ "exclusiveMaximum": 100000000
},
-- "id": {
++ "price_hourly": {
++ "type": [
++ "number",
++ "null"
++ ],
++ "minimum": 0
++ },
++ "setup_fee": {
++ "type": [
++ "number",
++ "null"
++ ],
++ "minimum": 0
++ },
++ "source_url": {
"type": "string",
-- "pattern": "^gst_[0-9A-HJKMNP-TV-Z]{26}$"
++ "maxLength": 2048,
++ "pattern": "^https?://"
++ },
++ "checked_at": {
++ "type": "integer",
++ "minimum": 0,
++ "description": "Epoch milliseconds the price was confirmed."
++ },
++ "status": {
++ "enum": [
++ "active",
++ "gone",
++ "hidden"
++ ]
}
-- },
-- "description": "GuestSubject"
++ }
},
{
"type": "object",
-- "required": [
-- "type",
-- "id"
-- ],
"additionalProperties": false,
"properties": {
-- "type": {
-- "const": "app"
++ "provider_id": {
++ "type": "string"
++ },
++ "title": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 2048
++ },
++ "details": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "maxLength": 2048
++ },
++ "code": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "maxLength": 2048
},
-- "id": {
++ "url": {
"type": "string",
-- "pattern": "^app_[0-9A-HJKMNP-TV-Z]{26}$"
++ "maxLength": 2048,
++ "pattern": "^https?://"
++ },
++ "affiliate": {
++ "type": [
++ "boolean",
++ "null"
++ ]
++ },
++ "starts_at": {
++ "type": [
++ "integer",
++ "null"
++ ],
++ "minimum": 0,
++ "description": "Epoch milliseconds."
++ },
++ "ends_at": {
++ "type": [
++ "integer",
++ "null"
++ ],
++ "minimum": 0,
++ "description": "Epoch milliseconds."
++ },
++ "status": {
++ "enum": [
++ "active",
++ "ended",
++ "hidden"
++ ]
}
-- },
-- "description": "AppSubject"
-- },
++ }
++ }
++ ]
++ },
++ "host.catalog-manage-result.v1": {
++ "title": "HostCatalogManageResult",
++ "description": "host.catalog-manage-result@1: the saved entry, under its type's name: { provider } (with affiliate_rel and affiliate_disclosure when it has an affiliate link), { plan } or { promo } (an active promo past ends_at reads as ended). 201 on create, 200 on update.",
++ "anyOf": [
{
"type": "object",
"required": [
-- "type",
-- "id"
++ "provider"
],
-- "additionalProperties": false,
"properties": {
-- "type": {
-- "const": "mod"
-- },
-- "id": {
-- "type": "string",
-- "pattern": "^mod_[0-9A-HJKMNP-TV-Z]{26}$"
++ "provider": {
++ "type": "object",
++ "required": [
++ "id"
++ ],
++ "properties": {
++ "id": {
++ "type": "string"
++ }
++ },
++ "additionalProperties": true
}
-- },
-- "description": "ModSubject"
++ }
},
{
"type": "object",
"required": [
-- "type",
-- "id"
++ "plan"
],
-- "additionalProperties": false,
"properties": {
-- "type": {
-- "enum": [
-- "service",
-- "system"
-- ]
-- },
-- "id": {
-- "type": "string",
-- "pattern": "^[a-z][a-z0-9-]{1,39}$"
++ "plan": {
++ "type": "object",
++ "required": [
++ "id"
++ ],
++ "properties": {
++ "id": {
++ "type": "string"
++ }
++ },
++ "additionalProperties": true
}
-- },
-- "description": "PrincipalSubject"
++ }
},
{
"type": "object",
"required": [
-- "type",
-- "id"
++ "promo"
],
-- "additionalProperties": false,
"properties": {
-- "type": {
-- "const": "agent"
-- },
-- "id": {
-- "type": "string",
-- "pattern": "^agt_[0-9A-HJKMNP-TV-Z]{26}$"
++ "promo": {
++ "type": "object",
++ "required": [
++ "id"
++ ],
++ "properties": {
++ "id": {
++ "type": "string"
++ }
++ },
++ "additionalProperties": true
}
-- },
-- "description": "AgentSubject: an agent (OpenVibe.Actor, or a developer app's agent) acting under grants its owner delegated (roadmap WS-Z2). In an event envelope, on_behalf_of names the owner."
++ }
}
]
}
ddiff --git a/generated/openapi/index.json b/generated/openapi/index.json
iindex 0000daf3..b090c0e5 100644
---- a/generated/openapi/index.json
++++ b/generated/openapi/index.json
@@@ -89,8 +89,8 @@
"service": "host",
"name": "OpenVibe.Host",
"origin": "https://openvibe.host",
-- "operations": 42,
-- "capabilities": 6
++ "operations": 6,
++ "capabilities": 1
},
{
"service": "inventory",
ddiff --git a/generated/openapi/inventory.json b/generated/openapi/inventory.json
iindex cf09c9ac..5c63e451 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.149.0",
-- "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for 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.150.0",
++ "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for 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 646957e6..993d19b2 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.149.0",
-- "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for 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.150.0",
++ "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for 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 5db2712e..cbe99a3f 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.149.0",
-- "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for 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.150.0",
++ "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for 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 9efd7ccb..5a7904b5 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.149.0",
-- "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for 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.150.0",
++ "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for 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 1e8aaa63..7177969f 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.149.0",
-- "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for 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.150.0",
++ "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for 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 21e829d9..79c9fb5d 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.149.0",
-- "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for 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.150.0",
++ "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for 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 9dc090b0..2c5d2485 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.149.0",
-- "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for 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.150.0",
++ "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for 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 db83f1be..a07f16eb 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.149.0",
-- "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for 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.150.0",
++ "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for 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 01d5aed1..0c289611 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.149.0",
-- "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for 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.150.0",
++ "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for 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 101528f5..a25f6f0e 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.149.0",
-- "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for 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.150.0",
++ "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for 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 14bba400..cb939031 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.149.0",
-- "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for 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.150.0",
++ "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for 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 0caa5cee..34c05200 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.149.0",
-- "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for 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.150.0",
++ "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for 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 3b845f3a..a5218782 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.149.0",
-- "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for 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.150.0",
++ "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for 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 3bf5d429..9406aa68 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.149.0",
-- "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for 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.150.0",
++ "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for 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 c9f3c381..45ff7b08 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.149.0",
-- "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for 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.150.0",
++ "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for 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 2b0e9606..575e9099 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.149.0",
-- "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for 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.150.0",
++ "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for 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 0ca545a2..aeae11c9 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.149.0",
-- "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for 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.150.0",
++ "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for 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 11ff7d2e..fd591c9f 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.149.0",
-- "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for 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.150.0",
++ "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for 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 64bb6114..26a0ca77 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.149.0",
-- "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for 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.150.0",
++ "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for 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/host.deploy.create.json b/manifests/capabilities/host.deploy.create.json
iindex 82f8dfcf..534742e2 100644
---- a/manifests/capabilities/host.deploy.create.json
++++ b/manifests/capabilities/host.deploy.create.json
@@@ -2,9 +2,9 @@
"id": "host.deploy.create",
"version": "1.0",
"owner": "host",
-- "status": "active",
++ "status": "retired",
"visibility": "first-party",
-- "description": "Upload an immutable static deploy (tar/tar.gz or multipart files; validated for path traversal, links, special and hidden files, server-side code, file types and quotas; never executed), list deploys and their upload logs, activate a deploy and roll a site back to any earlier ready deploy (one atomic pointer switch). Also judged by the acting principal's project role (deployer or above); an app principal added to a project as deployer can deploy from CI. A site with a Git source also accepts a CI-built deploy at /sites/:id/source/deploys naming the ref and full commit_sha; it is always a preview and records that commit as immutable provenance.",
++ "description": "RETIRED at 0.150.0: the static hosting engine moved from OpenVibe.Host to OpenVibe.Space on 2026-10-12 (plan T20). Use space.deploy.create on OpenVibe.Space. Host answers the old routes with 410 host.moved_to_space.",
"permissions": [
"host:deploy"
],
@@@ -17,15 +17,7 @@
"host.deploy.activated",
"host.deploy.failed"
],
-- "implementedBy": [
-- "GET /api/v1/sites/:id/deploys",
-- "POST /api/v1/sites/:id/deploys",
-- "POST /api/v1/sites/:id/source/deploys",
-- "GET /api/v1/deploys/:id",
-- "GET /api/v1/deploys/:id/log",
-- "POST /api/v1/deploys/:id/activate",
-- "POST /api/v1/sites/:id/rollback"
-- ],
++ "implementedBy": [],
"inputSchema": "host.deploy-create-request@1",
"outputSchema": "host.deploy-create-result@1"
}
ddiff --git a/manifests/capabilities/host.domain.manage.json b/manifests/capabilities/host.domain.manage.json
iindex 9dcbe80e..aa756c1a 100644
---- a/manifests/capabilities/host.domain.manage.json
++++ b/manifests/capabilities/host.domain.manage.json
@@@ -2,9 +2,9 @@
"id": "host.domain.manage",
"version": "1.0",
"owner": "host",
-- "status": "active",
++ "status": "retired",
"visibility": "first-party",
-- "description": "Add a custom domain to a static site (never an OpenVibe domain; not in sandbox projects), read its DNS TXT verification and routing records, trigger a verification check, and remove it. A custom domain is served only after its TXT record is verified; TLS certificates are issued by an operator and never pass through this capability.",
++ "description": "RETIRED at 0.150.0: the static hosting engine moved from OpenVibe.Host to OpenVibe.Space on 2026-10-12 (plan T20). Use space.domain.manage on OpenVibe.Space. Host answers the old routes with 410 host.moved_to_space.",
"permissions": [
"host:write"
],
@@@ -15,12 +15,7 @@
"events": [
"host.domain.verified"
],
-- "implementedBy": [
-- "GET /api/v1/sites/:id/domains",
-- "POST /api/v1/sites/:id/domains",
-- "POST /api/v1/domains/:id/verify",
-- "DELETE /api/v1/domains/:id"
-- ],
++ "implementedBy": [],
"inputSchema": "host.domain-manage-request@1",
"outputSchema": "host.domain-manage-result@1"
}
ddiff --git a/manifests/capabilities/host.resource.read.json b/manifests/capabilities/host.resource.read.json
iindex a9a56b5f..b1ca79bd 100644
---- a/manifests/capabilities/host.resource.read.json
++++ b/manifests/capabilities/host.resource.read.json
@@@ -2,9 +2,9 @@
"id": "host.resource.read",
"version": "1.0",
"owner": "host",
-- "status": "active",
++ "status": "retired",
"visibility": "first-party",
-- "description": "Read OpenVibe.Host's resource index (ADR-048): GET /api/v1/resources lists the resources Host owns as a page of common.resource-summary@1 (common.resource-list-result@1), and GET /api/v1/resources/:ovrn reads one by its OVRN (common.resource-summary@1). Every authority serves these for OpenVibe.Services to fan out and merge; Host's own resources are its static sites (kind host.site, id sit_<ULID>), the immutable deploys of those sites (kind host.deploy, id dpl_<ULID>) and their default and custom domains (kind host.domain, id dom_<ULID>), each with the project_id of the Network project that owns it. Host lists no projects; only Network lists projects. Planned until Host ships the index.",
++ "description": "RETIRED at 0.150.0: the static hosting engine moved from OpenVibe.Host to OpenVibe.Space on 2026-10-12 (plan T20). Use space.resource.read on OpenVibe.Space. Host answers the old routes with 410 host.moved_to_space.",
"permissions": [
"resources:read"
],
@@@ -13,10 +13,7 @@
],
"quotaClass": "standard",
"events": [],
-- "implementedBy": [
-- "GET /api/v1/resources",
-- "GET /api/v1/resources/:ovrn"
-- ],
++ "implementedBy": [],
"inputSchema": "common.no-body@1",
"outputSchema": "common.resource-list-result@1"
}
ddiff --git a/manifests/capabilities/host.site.config.json b/manifests/capabilities/host.site.config.json
iindex d56b5f06..b77c93f1 100644
---- a/manifests/capabilities/host.site.config.json
++++ b/manifests/capabilities/host.site.config.json
@@@ -2,9 +2,9 @@
"id": "host.site.config",
"version": "1.0",
"owner": "host",
-- "status": "active",
++ "status": "retired",
"visibility": "first-party",
-- "description": "Read, set and reset a Host site's serving configuration: response headers, local-only redirects and the SPA fallback (extensionless paths serve index.html). A capability holder must also hold the acting principal's project role (maintainer or owner to change, any role to read). Reserved headers (Content-Security-Policy, Strict-Transport-Security, Set-Cookie, X-Forwarded-*, caching, scope, transport and the platform's own) are refused, and a redirect target must be a local path, so a site can never become an open redirect.",
++ "description": "RETIRED at 0.150.0: the static hosting engine moved from OpenVibe.Host to OpenVibe.Space on 2026-10-12 (plan T20). Use space.site.config on OpenVibe.Space. Host answers the old routes with 410 host.moved_to_space.",
"permissions": [
"host:write"
],
@@@ -13,11 +13,7 @@
],
"quotaClass": "host-manage",
"events": [],
-- "implementedBy": [
-- "GET /api/v1/sites/:id/config",
-- "PUT /api/v1/sites/:id/config",
-- "DELETE /api/v1/sites/:id/config"
-- ],
++ "implementedBy": [],
"inputSchema": "host.site-config-request@1",
"outputSchema": "host.site-config-result@1"
}
ddiff --git a/manifests/capabilities/host.site.manage.json b/manifests/capabilities/host.site.manage.json
iindex d3fa4a52..568cdc63 100644
---- a/manifests/capabilities/host.site.manage.json
++++ b/manifests/capabilities/host.site.manage.json
@@@ -2,9 +2,9 @@
"id": "host.site.manage",
"version": "1.0",
"owner": "host",
-- "status": "active",
++ "status": "retired",
"visibility": "first-party",
-- "description": "Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner role), create and delete sites, delete a deploy that is not active. Also judged by the acting principal's project role; a sandbox token (env=sandbox) is refused on production projects. Quota changes and takedowns (stop serving a site or a whole project while keeping its content for review; lift) additionally need a Network staff user. Read, set or remove a site's Git source (provider, public repository URL and branch; never a credential).",
++ "description": "RETIRED at 0.150.0: the static hosting engine moved from OpenVibe.Host to OpenVibe.Space on 2026-10-12 (plan T20). Use space.site.manage on OpenVibe.Space. Host answers the old routes with 410 host.moved_to_space.",
"permissions": [
"host:write"
],
@@@ -13,28 +13,7 @@
],
"quotaClass": "host-manage",
"events": [],
-- "implementedBy": [
-- "GET /api/v1/projects",
-- "POST /api/v1/projects",
-- "GET /api/v1/projects/:id",
-- "DELETE /api/v1/projects/:id",
-- "GET /api/v1/projects/:id/quota",
-- "PUT /api/v1/projects/:id/quota",
-- "PUT /api/v1/projects/:id/members/:principal",
-- "DELETE /api/v1/projects/:id/members/:principal",
-- "GET /api/v1/projects/:id/sites",
-- "POST /api/v1/projects/:id/sites",
-- "GET /api/v1/sites/:id",
-- "GET /api/v1/sites/:id/source",
-- "PUT /api/v1/sites/:id/source",
-- "DELETE /api/v1/sites/:id/source",
-- "DELETE /api/v1/sites/:id",
-- "DELETE /api/v1/deploys/:id",
-- "POST /api/v1/projects/:id/takedown",
-- "DELETE /api/v1/projects/:id/takedown",
-- "POST /api/v1/sites/:id/takedown",
-- "DELETE /api/v1/sites/:id/takedown"
-- ],
++ "implementedBy": [],
"inputSchema": "host.site-manage-request@1",
"outputSchema": "host.site-manage-result@1"
}
ddiff --git a/manifests/products/openvibe.video.json b/manifests/products/openvibe.video.json
iindex 3c390f4a..80149884 100644
---- a/manifests/products/openvibe.video.json
++++ b/manifests/products/openvibe.video.json
@@@ -4,24 +4,24 @@
"name": "OpenVibe.Video",
"icon": "fa-film",
"accent": "#f87171",
-- "tagline": "Your videos, everywhere.",
-- "description": "OpenVibe.Video will be the home of long-form video on the OpenVibe network: watch pages, channels and playlists for uploads and past streams, a creator tool that publishes one upload to many platforms, and AI captions, highlights and editing, delivered by OpenVibe.Media.",
++ "tagline": "Watch what OpenVibe streamed.",
++ "description": "OpenVibe.Video is the watch site for the OpenVibe network: stream recordings and clips from OpenVibe.Live, each with a player, AI chapters and WebVTT captions, its clips and its OpenVibe.Community thread, and a page per channel. The files stay on OpenVibe.Media. Uploads, playlists and publishing to other platforms come later.",
"pillars": [
{
"title": "Watch",
-- "text": "Channels, playlists and search for uploads and past streams."
++ "text": "Recordings and clips from OpenVibe.Live, and a page per channel."
},
{
-- "title": "Publish everywhere",
-- "text": "One upload, sent to the platforms you choose, tracked in one place."
++ "title": "Chapters and captions",
++ "text": "Chapters from the AI moments of a stream, captions from its AI transcript."
},
{
-- "title": "AI tools",
-- "text": "Captions, translations, highlights and shorts from long videos."
++ "title": "From your streams",
++ "text": "What you stream on OpenVibe.Live and make public lands here."
},
{
-- "title": "From your streams",
-- "text": "Recordings from OpenVibe.Live land here, ready to share."
++ "title": "Next",
++ "text": "Uploads, playlists and publishing to other platforms are not built yet."
}
],
"keywords": "openvibe video, video hosting, youtube alternative, multi-platform upload, ai video tools",
@@@ -30,15 +30,15 @@
"service": "media-hub",
"noRepo": true,
"meanwhile": [
-- {
-- "label": "OpenVibe.Live",
-- "url": "https://openvibe.live",
-- "note": "Streams, recordings and clips live on OpenVibe.Live today."
-- },
{
"label": "OpenRestream",
"url": "https://openre.stream",
"note": "Restreaming to many platforms is the sibling product."
++ },
++ {
++ "label": "OpenVibe.Live",
++ "url": "https://openvibe.live",
++ "note": "Owners manage their recordings and clips on OpenVibe.Live."
}
]
}
ddiff --git a/manifests/services/host.json b/manifests/services/host.json
iindex 0e00ccf8..114f0b8b 100644
---- a/manifests/services/host.json
++++ b/manifests/services/host.json
@@@ -65,19 +65,10 @@
}
},
"capabilities": [
-- "host.site.manage",
-- "host.deploy.create",
-- "host.domain.manage",
-- "host.resource.read",
-- "host.site.config",
"host.catalog.manage"
],
"eventsProduced": [
-- "host.deploy.created",
-- "host.deploy.activated",
-- "host.deploy.failed",
"host.release.published",
-- "host.domain.verified",
"host.index_document.upserted",
"host.index_document.deleted"
],
@@@ -137,5 +128,5 @@
]
}
},
-- "notes": "Stage A: the ovhost operator CLI (no server). Stage B: the Host API service on port 4910 (unit openvibe-host.service, state /var/lib/openvibe-host-api): tenant projects keyed by project id (prj_, network_project_id once Network has projects, ADR-014), static sites served by Host header at <site>.openvibe.host (a registrable domain separate from every other OpenVibe domain) and on TXT-verified custom domains, immutable content-addressed deploys with rollback, quotas enforced here, upload logs. Consumes OpenVibe.Network (SSO, JWKS, client-credentials) and publishes through OpenVibe.Events (events.event.publish). The ovhost CLI publishes host.release.published (subject release, visibility public) when a network service's release goes live (ovhost deploy/rollback/announce; release notifications, WS-P task 9); host.deploy.activated is Stage B's tenant activations only. Stage C (sandboxed user code) is not started."
++ "notes": "Stage A: the ovhost operator CLI (no server). The Host service on port 4910 (unit openvibe-host.service) serves openvibe.host, hosting compared: providers, plans and promotions with dated, sourced prices from OpenVibe.Sources and staff entries (host.catalog.manage), discussion on OpenVibe.Community and its pages as OpenVibe.Search documents (host.index_document.*). The ovhost CLI publishes host.release.published. Stage B (tenant static hosting) moved to OpenVibe.Space on 2026-10-12 (plan T20): its host.* capabilities and events are retired at 0.150.0 in favour of space.*, and Host answers the old routes and tenant hosts with 410 host.moved_to_space."
}
ddiff --git a/manifests/services/media-hub.json b/manifests/services/media-hub.json
iindex 3ab65c4f..2e3e1174 100644
---- a/manifests/services/media-hub.json
++++ b/manifests/services/media-hub.json
@@@ -87,7 +87,7 @@
"none": "no claims: one process serves the three domains"
}
},
-- "notes": "Port 4990, unit openvibe-media-hub.service, one process for openvibe.download, openvibe.pics and openvibe.video (plan T10 D4, by Host header). v1: openvibe.download is a private drive — account-only uploads streamed into OpenVibe.Media (app media-hub; a plain form up to 256 MB, resumable multipart beyond), private files and folders with per-person limits, share links that expire, need a signed-in downloader and may name accounts (matched by subject), reports that suspend a share for staff, and sandboxed attachment downloads. openvibe.pics and openvibe.video answer with coming pages: their uploads wait for scanning and abuse intake (the video.*/pics.*/download.* capabilities stay planned until an app may call them). Consumes OpenVibe.Network (SSO with PKCE S256 as OAuth client media-hub, JWKS, identity.subject.resolve) and OpenVibe.Media; answers account export and deletion (ADR-033).",
++ "notes": "Port 4990, unit openvibe-media-hub.service, one process for openvibe.download, openvibe.pics and openvibe.video (plan T10 D4, by Host header). v1: openvibe.download is a private drive — account-only uploads streamed into OpenVibe.Media (app media-hub; a plain form up to 256 MB, resumable multipart beyond), private files and folders with per-person limits, share links that expire, need a signed-in downloader and may name accounts (matched by subject), reports that suspend a share for staff, and sandboxed attachment downloads. openvibe.pics and openvibe.video answer with coming pages: their uploads wait for scanning and abuse intake (the video.*/pics.*/download.* capabilities stay planned until an app may call them). Consumes OpenVibe.Network (SSO with PKCE S256 as OAuth client media-hub, JWKS, identity.subject.resolve) and OpenVibe.Media; answers account export and deletion (ADR-033). Since 2026-10-12 the same process serves openvibe.video, OpenVibe.Video v1: public, read-only watch pages for OpenVibe.Live's stream recordings and clips (read from Live's public API, files on OpenVibe.Media), with WebVTT captions from the AI transcript and chapters from the AI moments. video.* stays planned until an app may call it; openvibe.pics stays parked.",
"health": "/api/health",
"ready": "/api/ready",
"internalOrigin": "http://127.0.0.1:4990",
@@@ -95,7 +95,7 @@
"name": "Media Hub",
"icon": "media-hub",
"tagline": "Video, pics and downloads",
-- "what": "The media-hub products in one service: video watch pages, chapters, captions and playlists (openvibe.video); image hosting and albums (openvibe.pics); share links, drive and backup (openvibe.download). Bytes stay in OpenVibe.Media.",
++ "what": "Your private drive with share links you control (openvibe.download), and watch pages for OpenVibe.Live's recordings and clips with AI chapters and captions (openvibe.video). Image hosting on openvibe.pics is not open.",
"legalProfile": "hosting",
"position": 20
}
ddiff --git a/package.json b/package.json
iindex 9239df11..4f293d7c 100644
---- a/package.json
++++ b/package.json
@@@ -1,6 +1,6 @@
{
"name": "openvibe-contracts",
-- "version": "0.149.0",
++ "version": "0.150.0",
"description": "Machine-readable contracts for the OpenVibe network: schemas, manifests, ids, error envelope, capability checks.",
"main": "index.js",
"types": "generated/typescript/index.d.ts",
ddiff --git a/test/run.js b/test/run.js
iindex 21e7ada2..657ff465 100644
---- a/test/run.js
++++ b/test/run.js
@@@ -823,19 +823,22 @@ await assert.rejects(failing.getToken(), /401: invalid_client/);
// ── Release notifications (WS-P task 9, ADR-016): host.release.published, public, identifiers only ──
// A network service's release went live (subject release, visibility public: browsers get it over
--// Events realtime). Tenant hosting's activations stay host.deploy.activated (first-party, its own shape);
--// neither payload passes for the other.
++// Events realtime). Tenant hosting's activations are space.deploy.activated since the engine moved to OpenVibe.Space
++// (0.149.0; host.deploy.activated is retired at 0.150.0): first-party, its own shape; neither payload passes for the other.
{
const R = (p) => contracts.validate('host.release.published@1', p).valid;
-- const D = (p) => contracts.validate('host.deploy.activated@1', p).valid;
++ const D = (p) => contracts.validate('space.deploy.activated@1', p).valid;
const cat = (id) => contracts.catalog.find(c => c.id === id);
ok(cat('host.release.published') && cat('host.release.published').owner === 'host' && cat('host.release.published').visibility === 'public', 'host.release.published is a public Host event');
-- ok(cat('host.deploy.activated') && cat('host.deploy.activated').visibility === 'first-party', 'host.deploy.activated stays first-party (tenant hosting)');
-- for (const id of ['host.release.published', 'host.deploy.activated']) ok(services.get('host').eventsProduced.includes(id), `the host manifest produces ${id}`);
++ ok(cat('space.deploy.activated') && cat('space.deploy.activated').visibility === 'first-party', 'space.deploy.activated is first-party (tenant hosting)');
++ ok(cat('host.deploy.activated') && cat('host.deploy.activated').status === 'retired', 'host.deploy.activated is retired (the engine moved to Space)');
++ ok(services.get('host').eventsProduced.includes('host.release.published'), 'the host manifest produces host.release.published');
++ ok(!services.get('host').eventsProduced.includes('host.deploy.activated'), 'the host manifest no longer produces host.deploy.activated');
++ ok(services.get('space').eventsProduced.includes('space.deploy.activated'), 'the space manifest produces space.deploy.activated');
const rel = { service: 'live', release: 'd4e849f2', commit: null, origin: 'https://openvibe.live', deployed_at: '2026-09-26T08:00:05.000Z' };
-- const ten = JSON.parse(fs.readFileSync(path.join(ROOT, 'fixtures/host.deploy.activated/valid/tenant-site.json'), 'utf8'));
++ const ten = JSON.parse(fs.readFileSync(path.join(ROOT, 'fixtures/space.deploy.activated/valid/tenant-site.json'), 'utf8'));
ok(R(rel) && D(ten) && !R(ten) && !D(rel) && !R({ ...rel, ...ten }), 'a release and a tenant activation are two contracts that never mix');
-- ok(!contracts.schema('host.deploy.activated').oneOf && !contracts.schema('host.release.published').oneOf, 'one shape each');
++ ok(!contracts.schema('space.deploy.activated').oneOf && !contracts.schema('host.release.published').oneOf, 'one shape each');
for (const k of ['service', 'release', 'commit', 'origin', 'deployed_at']) ok(!R({ ...rel, [k]: undefined }), `a release needs ${k} (commit and origin may be null)`);
for (const extra of [{ commits: [] }, { notes: 'x' }, { url: 'https://openvibe.live/updates' }]) ok(!R({ ...rel, ...extra }), `a release carries identifiers only (${Object.keys(extra)[0]})`);
ok(R({ ...rel, release: 'd4e849f2a1b3c5d7e9f0a2b4c6d8e0f1a3b5c7d9' }) && !R({ ...rel, release: 'd4e84' }), 'a release is 7 to 40 hex, as registry.release-manifest@1 says');