openvibers/openvibe.contracts Commits

Space's builder API moves under /api/v1/builder/spaces (0.324.0) (#333)

OP OpenVibers committed 6 days ago · 2560b19df8 · 50 files, +829 −824

GET /api/v1/spaces was the forum's old API: it lives on OpenVibe.Community
since 2026-11-07 and Space still answers it with a redirect, so the API the
person's own agent works through needs an address of its own.

The capabilities name the new routes: space.build.read, space.build.create,
space.build.write and space.build.publish. The person's answer still arrives
at POST /api/v1/agent/approvals/:id/decide.

No contract shape changes: the bodies and the capability ids stay as they
were.

Changes

ddiff --git a/CHANGELOG.md b/CHANGELOG.md
iindex ba0f2b6b..5acde934 100644
---- a/CHANGELOG.md
++++ b/CHANGELOG.md
@@@ -1,5 +1,10 @@
# Changelog
++## 0.324.0 — 2026-11-07
++
++- Space's builder API moves under `/api/v1/builder/spaces`: `GET /api/v1/spaces` was the forum's old API (it lives on OpenVibe.Community since 2026-11-07, and Space still answers it with a redirect), so the API the person's own agent works through needs an address of its own. The capabilities name the new routes: `space.build.read` (`GET /api/v1/builder/spaces`, `…/:id`, `…/:id/files`, `…/:id/files/:path`, `…/:id/preview`), `space.build.create` (`POST /api/v1/builder/spaces`), `space.build.write` (`PUT /api/v1/builder/spaces/:id/files`) and `space.build.publish` (`POST /api/v1/builder/spaces/:id/publish`, and the person's answer at `POST /api/v1/agent/approvals/:id/decide`).
++- No contract shape changes: the bodies and the capability ids stay as they were.
++
## 0.323.0 — 2026-11-07
- Space's builder API says two more routes in its capabilities: `space.build.read` now names `GET /api/v1/spaces/:id/files/:path` (one file of one of the person's own spaces), and `space.build.publish` names `POST /api/v1/agent/approvals/:id/decide` (the person's answer to the agent's request to publish, which OpenVibe.Actor passes on with the person's own token).
ddiff --git a/generated/openapi/actor.json b/generated/openapi/actor.json
iindex a28fc5b6..9627ec94 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.323.0",
-- "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.323.0): each operation lists the capabilities it performs; a token for 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.324.0",
++ "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.324.0): each operation lists the capabilities it performs; a token for 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 67a3843d..1ccf40ae 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.323.0",
-- "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.323.0): each operation lists the capabilities it performs; a token for 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.324.0",
++ "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.324.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/bench.json b/generated/openapi/bench.json
iindex 9e43e4e9..ba7ccee0 100644
---- a/generated/openapi/bench.json
++++ b/generated/openapi/bench.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Bench API",
-- "version": "0.323.0",
-- "description": "Routes of OpenVibe.Bench as the OpenVibe contracts describe them (openvibe-contracts 0.323.0): each operation lists the capabilities it performs; a token for 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.324.0",
++ "description": "Routes of OpenVibe.Bench as the OpenVibe contracts describe them (openvibe-contracts 0.324.0): each operation lists the capabilities it performs; a token for 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 a2802161..9e5d9f48 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.323.0",
-- "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.323.0): each operation lists the capabilities it performs; a token for 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.324.0",
++ "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.324.0): each operation lists the capabilities it performs; a token for 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 61828738..f8c44134 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.323.0",
-- "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.323.0): each operation lists the capabilities it performs; a token for 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.324.0",
++ "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.324.0): each operation lists the capabilities it performs; a token for 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 4e7b0b3a..0bfafe8c 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.323.0",
-- "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.323.0): each operation lists the capabilities it performs; a token for 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.324.0",
++ "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.324.0): each operation lists the capabilities it performs; a token for 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 7cce962d..aa54f65d 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.323.0",
-- "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.323.0): each operation lists the capabilities it performs; a token for 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.324.0",
++ "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.324.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/codes.json b/generated/openapi/codes.json
iindex efc8c44d..b9fa493b 100644
---- a/generated/openapi/codes.json
++++ b/generated/openapi/codes.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Codes API",
-- "version": "0.323.0",
-- "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.323.0): each operation lists the capabilities it performs; a token for 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.324.0",
++ "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.324.0): each operation lists the capabilities it performs; a token for 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 5c669dae..085c2775 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.323.0",
-- "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.323.0): each operation lists the capabilities it performs; a token for 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.324.0",
++ "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.324.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/connect.json b/generated/openapi/connect.json
iindex 2c9614a0..a7e34bee 100644
---- a/generated/openapi/connect.json
++++ b/generated/openapi/connect.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe Connect API",
-- "version": "0.323.0",
-- "description": "Routes of OpenVibe Connect as the OpenVibe contracts describe them (openvibe-contracts 0.323.0): each operation lists the capabilities it performs; a token for 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.324.0",
++ "description": "Routes of OpenVibe Connect as the OpenVibe contracts describe them (openvibe-contracts 0.324.0): each operation lists the capabilities it performs; a token for 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 ad3128f5..c7f955eb 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.323.0",
-- "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.323.0): each operation lists the capabilities it performs; a token for 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.324.0",
++ "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.324.0): each operation lists the capabilities it performs; a token for 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 3e2a034c..f3b0d292 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.323.0",
-- "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.323.0): each operation lists the capabilities it performs; a token for 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.324.0",
++ "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.324.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/design.json b/generated/openapi/design.json
iindex bc66362b..5a2d1577 100644
---- a/generated/openapi/design.json
++++ b/generated/openapi/design.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Design API",
-- "version": "0.323.0",
-- "description": "Routes of OpenVibe.Design as the OpenVibe contracts describe them (openvibe-contracts 0.323.0): each operation lists the capabilities it performs; a token for 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.324.0",
++ "description": "Routes of OpenVibe.Design as the OpenVibe contracts describe them (openvibe-contracts 0.324.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/domains.json b/generated/openapi/domains.json
iindex 385f81ae..da7f6efe 100644
---- a/generated/openapi/domains.json
++++ b/generated/openapi/domains.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Domains API",
-- "version": "0.323.0",
-- "description": "Routes of OpenVibe.Domains as the OpenVibe contracts describe them (openvibe-contracts 0.323.0): each operation lists the capabilities it performs; a token for 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.324.0",
++ "description": "Routes of OpenVibe.Domains as the OpenVibe contracts describe them (openvibe-contracts 0.324.0): each operation lists the capabilities it performs; a token for 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 4e53d73b..2ba3f156 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.323.0",
-- "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.323.0): each operation lists the capabilities it performs; a token for 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.324.0",
++ "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.324.0): each operation lists the capabilities it performs; a token for 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 0ced6ae1..55c77834 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.323.0",
-- "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.323.0): each operation lists the capabilities it performs; a token for 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.324.0",
++ "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.324.0): each operation lists the capabilities it performs; a token for 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 961fe329..648ecc7b 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.323.0",
-- "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.323.0): each operation lists the capabilities it performs; a token for 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.324.0",
++ "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.324.0): each operation lists the capabilities it performs; a token for 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 7740c580..cff73c92 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.323.0",
-- "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.323.0): each operation lists the capabilities it performs; a token for 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.324.0",
++ "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.324.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/inventory.json b/generated/openapi/inventory.json
iindex b8930f18..cf90761f 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.323.0",
-- "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.323.0): each operation lists the capabilities it performs; a token for 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.324.0",
++ "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.324.0): each operation lists the capabilities it performs; a token for 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 a4d5aa2b..95949701 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.323.0",
-- "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.323.0): each operation lists the capabilities it performs; a token for 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.324.0",
++ "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.324.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/media-hub.json b/generated/openapi/media-hub.json
iindex 949896e0..5b51c0bb 100644
---- a/generated/openapi/media-hub.json
++++ b/generated/openapi/media-hub.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.MediaHub API",
-- "version": "0.323.0",
-- "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.323.0): each operation lists the capabilities it performs; a token for 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.324.0",
++ "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.324.0): each operation lists the capabilities it performs; a token for 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 60eff780..2169b4e2 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.323.0",
-- "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.323.0): each operation lists the capabilities it performs; a token for 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.324.0",
++ "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.324.0): each operation lists the capabilities it performs; a token for 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 d7ec8e2d..fa1028f8 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.323.0",
-- "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.323.0): each operation lists the capabilities it performs; a token for 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.324.0",
++ "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.324.0): each operation lists the capabilities it performs; a token for 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 d0585b5a..4c956ece 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.323.0",
-- "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.323.0): each operation lists the capabilities it performs; a token for 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.324.0",
++ "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.324.0): each operation lists the capabilities it performs; a token for 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 e9d91234..e9a8bbbc 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.323.0",
-- "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.323.0): each operation lists the capabilities it performs; a token for 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.324.0",
++ "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.324.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/play.json b/generated/openapi/play.json
iindex 6499eb3c..bcd82bf5 100644
---- a/generated/openapi/play.json
++++ b/generated/openapi/play.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Play API",
-- "version": "0.323.0",
-- "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.323.0): each operation lists the capabilities it performs; a token for 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.324.0",
++ "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.324.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/quest.json b/generated/openapi/quest.json
iindex 67c3b011..05759819 100644
---- a/generated/openapi/quest.json
++++ b/generated/openapi/quest.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Quest API",
-- "version": "0.323.0",
-- "description": "Routes of OpenVibe.Quest as the OpenVibe contracts describe them (openvibe-contracts 0.323.0): each operation lists the capabilities it performs; a token for 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.324.0",
++ "description": "Routes of OpenVibe.Quest as the OpenVibe contracts describe them (openvibe-contracts 0.324.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/report.json b/generated/openapi/report.json
iindex 475ce123..fb986dc3 100644
---- a/generated/openapi/report.json
++++ b/generated/openapi/report.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Report API",
-- "version": "0.323.0",
-- "description": "Routes of OpenVibe.Report as the OpenVibe contracts describe them (openvibe-contracts 0.323.0): each operation lists the capabilities it performs; a token for 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.324.0",
++ "description": "Routes of OpenVibe.Report as the OpenVibe contracts describe them (openvibe-contracts 0.324.0): each operation lists the capabilities it performs; a token for 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 e16520a8..ef609724 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.323.0",
-- "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.323.0): each operation lists the capabilities it performs; a token for 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.324.0",
++ "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.324.0): each operation lists the capabilities it performs; a token for 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 e9a5ab2a..4364f748 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.323.0",
-- "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.323.0): each operation lists the capabilities it performs; a token for 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.324.0",
++ "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.324.0): each operation lists the capabilities it performs; a token for 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 0200f7e4..3d50557f 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.323.0",
-- "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.323.0): each operation lists the capabilities it performs; a token for 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.324.0",
++ "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.324.0): each operation lists the capabilities it performs; a token for 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 b3838760..c5de159e 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.323.0",
-- "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.323.0): each operation lists the capabilities it performs; a token for 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.324.0",
++ "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.324.0): each operation lists the capabilities it performs; a token for 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 16a7606b..ca5af62c 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.323.0",
-- "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.323.0): each operation lists the capabilities it performs; a token for 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.324.0",
++ "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.324.0): each operation lists the capabilities it performs; a token for 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 c704cb68..ea52cb85 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.323.0",
-- "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.323.0): each operation lists the capabilities it performs; a token for 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.324.0",
++ "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.324.0): each operation lists the capabilities it performs; a token for 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"
@@@ -20,7 +20,7 @@
"post": {
"operationId": "post_api_v1_agent_approvals_id_decide",
"summary": "Ask to publish one of a person's own spaces, as their agent (OpenVibe.Actor) built it (plan 2026-10-22 §Z stage Z1).",
-- "description": "**space.build.publish** (first-party): Ask to publish one of a person's own spaces, as their agent (OpenVibe.Actor) built it (plan 2026-10-22 §Z stage Z1). POST /api/v1/spaces/:id/publish asks and answers { state: 'pending' } with the request the person answers in the Dock; Space never publishes without that answer, and the agent is told to wait. The person's answer reaches Space through POST /api/v1/agent/approvals/:id/decide.",
++ "description": "**space.build.publish** (first-party): Ask to publish one of a person's own spaces, as their agent (OpenVibe.Actor) built it (plan 2026-10-22 §Z stage Z1). POST /api/v1/builder/spaces/:id/publish asks and answers { state: 'pending' } with the request the person answers in the Dock; Space never publishes without that answer, and the agent is told to wait. The person's answer reaches Space through POST /api/v1/agent/approvals/:id/decide.",
"tags": [
"space.build"
],
@@@ -72,48 +72,35 @@
}
}
},
-- "/api/v1/deploys/{id}": {
-- "delete": {
-- "operationId": "delete_api_v1_deploys_id",
-- "summary": "Manage OpenVibe.Space 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": "**space.site.manage** (public): Manage OpenVibe.Space 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).",
++ "/api/v1/builder/spaces": {
++ "get": {
++ "operationId": "get_api_v1_builder_spaces",
++ "summary": "Read a person's own spaces and their source files, as their agent (OpenVibe.Actor) works on them (plan 2026-10-22 §Z stage Z1: Space's builder becomes a task of the person's one agent).",
++ "description": "**space.build.read** (first-party): Read a person's own spaces and their source files, as their agent (OpenVibe.Actor) works on them (plan 2026-10-22 §Z stage Z1: Space's builder becomes a task of the person's one agent). GET /api/v1/builder/spaces lists the person's spaces, GET /api/v1/builder/spaces/:id reads one, GET /api/v1/builder/spaces/:id/files reads its files, GET /api/v1/builder/spaces/:id/files/:path reads one of them, GET /api/v1/builder/spaces/:id/preview says where it can be seen. A first-party service names the person in X-OV-Subject; Space reads only that person's own spaces, and another person's space is the same 404 as one that does not exist.",
"tags": [
-- "space.site"
++ "space.build"
],
"x-openvibe-capabilities": [
-- "space.site.manage"
++ "space.build.read"
],
"x-openvibe-visibility": [
-- "public"
++ "first-party"
],
-- "x-openvibe-quota-class": "space-manage",
++ "x-openvibe-quota-class": "standard",
"security": [
{
"openvibeToken": [
-- "space.site.manage"
++ "space.build.read"
]
}
],
-- "x-openvibe-input": {
-- "$ref": "#/components/schemas/space.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/space.site-manage-result.v1"
++ "$ref": "#/components/schemas/space.build-list.v1"
}
}
}
@@@ -130,47 +117,44 @@
}
}
},
-- "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": "**space.deploy.create** (public): 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.",
++ "post": {
++ "operationId": "post_api_v1_builder_spaces",
++ "summary": "Make one of a person's own spaces, as their agent (OpenVibe.Actor) builds it (plan 2026-10-22 §Z stage Z1).",
++ "description": "**space.build.create** (first-party): Make one of a person's own spaces, as their agent (OpenVibe.Actor) builds it (plan 2026-10-22 §Z stage Z1). POST /api/v1/builder/spaces makes a new space of the person named in X-OV-Subject, from Space's blank template; the agent then fills its files with space.build.write.",
"tags": [
-- "space.deploy"
++ "space.build"
],
"x-openvibe-capabilities": [
-- "space.deploy.create"
++ "space.build.create"
],
"x-openvibe-visibility": [
-- "public"
++ "first-party"
],
-- "x-openvibe-quota-class": "space-deploy",
++ "x-openvibe-quota-class": "standard",
"security": [
{
"openvibeToken": [
-- "space.deploy.create"
++ "space.build.create"
]
}
],
-- "x-openvibe-input": {
-- "$ref": "#/components/schemas/space.deploy-create-request.v1"
-- },
-- "parameters": [
-- {
-- "name": "id",
-- "in": "path",
-- "required": true,
-- "schema": {
-- "type": "string"
++ "requestBody": {
++ "required": false,
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/space.build-create.v1"
++ }
}
}
-- ],
++ },
"responses": {
"2XX": {
"description": "Success",
"content": {
"application/json": {
"schema": {
-- "$ref": "#/components/schemas/space.deploy-create-result.v1"
++ "$ref": "#/components/schemas/space.build-list.v1"
}
}
}
@@@ -188,38 +172,28 @@
}
}
},
-- "/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": "**space.deploy.create** (public): 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.",
++ "/api/v1/builder/spaces/{id}": {
++ "get": {
++ "operationId": "get_api_v1_builder_spaces_id",
++ "summary": "Read a person's own spaces and their source files, as their agent (OpenVibe.Actor) works on them (plan 2026-10-22 §Z stage Z1: Space's builder becomes a task of the person's one agent).",
++ "description": "**space.build.read** (first-party): Read a person's own spaces and their source files, as their agent (OpenVibe.Actor) works on them (plan 2026-10-22 §Z stage Z1: Space's builder becomes a task of the person's one agent). GET /api/v1/builder/spaces lists the person's spaces, GET /api/v1/builder/spaces/:id reads one, GET /api/v1/builder/spaces/:id/files reads its files, GET /api/v1/builder/spaces/:id/files/:path reads one of them, GET /api/v1/builder/spaces/:id/preview says where it can be seen. A first-party service names the person in X-OV-Subject; Space reads only that person's own spaces, and another person's space is the same 404 as one that does not exist.",
"tags": [
-- "space.deploy"
++ "space.build"
],
"x-openvibe-capabilities": [
-- "space.deploy.create"
++ "space.build.read"
],
"x-openvibe-visibility": [
-- "public"
++ "first-party"
],
-- "x-openvibe-quota-class": "space-deploy",
++ "x-openvibe-quota-class": "standard",
"security": [
{
"openvibeToken": [
-- "space.deploy.create"
++ "space.build.read"
]
}
],
-- "requestBody": {
-- "required": false,
-- "content": {
-- "application/json": {
-- "schema": {
-- "$ref": "#/components/schemas/space.deploy-create-request.v1"
-- }
-- }
-- }
-- },
"parameters": [
{
"name": "id",
@@@ -236,7 +210,7 @@
"content": {
"application/json": {
"schema": {
-- "$ref": "#/components/schemas/space.deploy-create-result.v1"
++ "$ref": "#/components/schemas/space.build-list.v1"
}
}
}
@@@ -254,31 +228,28 @@
}
}
},
-- "/api/v1/deploys/{id}/log": {
++ "/api/v1/builder/spaces/{id}/files": {
"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": "**space.deploy.create** (public): 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.",
++ "operationId": "get_api_v1_builder_spaces_id_files",
++ "summary": "Read a person's own spaces and their source files, as their agent (OpenVibe.Actor) works on them (plan 2026-10-22 §Z stage Z1: Space's builder becomes a task of the person's one agent).",
++ "description": "**space.build.read** (first-party): Read a person's own spaces and their source files, as their agent (OpenVibe.Actor) works on them (plan 2026-10-22 §Z stage Z1: Space's builder becomes a task of the person's one agent). GET /api/v1/builder/spaces lists the person's spaces, GET /api/v1/builder/spaces/:id reads one, GET /api/v1/builder/spaces/:id/files reads its files, GET /api/v1/builder/spaces/:id/files/:path reads one of them, GET /api/v1/builder/spaces/:id/preview says where it can be seen. A first-party service names the person in X-OV-Subject; Space reads only that person's own spaces, and another person's space is the same 404 as one that does not exist.",
"tags": [
-- "space.deploy"
++ "space.build"
],
"x-openvibe-capabilities": [
-- "space.deploy.create"
++ "space.build.read"
],
"x-openvibe-visibility": [
-- "public"
++ "first-party"
],
-- "x-openvibe-quota-class": "space-deploy",
++ "x-openvibe-quota-class": "standard",
"security": [
{
"openvibeToken": [
-- "space.deploy.create"
++ "space.build.read"
]
}
],
-- "x-openvibe-input": {
-- "$ref": "#/components/schemas/space.deploy-create-request.v1"
-- },
"parameters": [
{
"name": "id",
@@@ -295,7 +266,7 @@
"content": {
"application/json": {
"schema": {
-- "$ref": "#/components/schemas/space.deploy-create-result.v1"
++ "$ref": "#/components/schemas/space.build-list.v1"
}
}
}
@@@ -311,32 +282,37 @@
}
}
}
-- }
-- },
-- "/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": "**space.domain.manage** (public): 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.",
++ },
++ "put": {
++ "operationId": "put_api_v1_builder_spaces_id_files",
++ "summary": "Write the files of one of a person's own spaces, as their agent (OpenVibe.Actor) builds it (plan 2026-10-22 §Z stage Z1).",
++ "description": "**space.build.write** (first-party): Write the files of one of a person's own spaces, as their agent (OpenVibe.Actor) builds it (plan 2026-10-22 §Z stage Z1). PUT /api/v1/builder/spaces/:id/files replaces the space's files with the ones in the body. Every write is audited like Space's own editor writes are, and the space's own limits (files, bytes) are the same ones.",
"tags": [
-- "space.domain"
++ "space.build"
],
"x-openvibe-capabilities": [
-- "space.domain.manage"
++ "space.build.write"
],
"x-openvibe-visibility": [
-- "public"
++ "first-party"
],
-- "x-openvibe-quota-class": "space-manage",
++ "x-openvibe-quota-class": "standard",
"security": [
{
"openvibeToken": [
-- "space.domain.manage"
++ "space.build.write"
]
}
],
-- "x-openvibe-input": {
-- "$ref": "#/components/schemas/space.domain-manage-request.v1"
++ "requestBody": {
++ "required": false,
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/space.build-files.v1"
++ }
++ }
++ }
},
"parameters": [
{
@@@ -354,7 +330,7 @@
"content": {
"application/json": {
"schema": {
-- "$ref": "#/components/schemas/space.domain-manage-result.v1"
++ "$ref": "#/components/schemas/space.build-files.v1"
}
}
}
@@@ -372,38 +348,28 @@
}
}
},
-- "/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": "**space.domain.manage** (public): 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.",
++ "/api/v1/builder/spaces/{id}/files/{path}": {
++ "get": {
++ "operationId": "get_api_v1_builder_spaces_id_files_path",
++ "summary": "Read a person's own spaces and their source files, as their agent (OpenVibe.Actor) works on them (plan 2026-10-22 §Z stage Z1: Space's builder becomes a task of the person's one agent).",
++ "description": "**space.build.read** (first-party): Read a person's own spaces and their source files, as their agent (OpenVibe.Actor) works on them (plan 2026-10-22 §Z stage Z1: Space's builder becomes a task of the person's one agent). GET /api/v1/builder/spaces lists the person's spaces, GET /api/v1/builder/spaces/:id reads one, GET /api/v1/builder/spaces/:id/files reads its files, GET /api/v1/builder/spaces/:id/files/:path reads one of them, GET /api/v1/builder/spaces/:id/preview says where it can be seen. A first-party service names the person in X-OV-Subject; Space reads only that person's own spaces, and another person's space is the same 404 as one that does not exist.",
"tags": [
-- "space.domain"
++ "space.build"
],
"x-openvibe-capabilities": [
-- "space.domain.manage"
++ "space.build.read"
],
"x-openvibe-visibility": [
-- "public"
++ "first-party"
],
-- "x-openvibe-quota-class": "space-manage",
++ "x-openvibe-quota-class": "standard",
"security": [
{
"openvibeToken": [
-- "space.domain.manage"
++ "space.build.read"
]
}
],
-- "requestBody": {
-- "required": false,
-- "content": {
-- "application/json": {
-- "schema": {
-- "$ref": "#/components/schemas/space.domain-manage-request.v1"
-- }
-- }
-- }
-- },
"parameters": [
{
"name": "id",
@@@ -412,6 +378,14 @@
"schema": {
"type": "string"
}
++ },
++ {
++ "name": "path",
++ "in": "path",
++ "required": true,
++ "schema": {
++ "type": "string"
++ }
}
],
"responses": {
@@@ -420,7 +394,7 @@
"content": {
"application/json": {
"schema": {
-- "$ref": "#/components/schemas/space.domain-manage-result.v1"
++ "$ref": "#/components/schemas/space.build-list.v1"
}
}
}
@@@ -438,38 +412,45 @@
}
}
},
-- "/api/v1/projects": {
++ "/api/v1/builder/spaces/{id}/preview": {
"get": {
-- "operationId": "get_api_v1_projects",
-- "summary": "Manage OpenVibe.Space 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": "**space.site.manage** (public): Manage OpenVibe.Space 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).",
++ "operationId": "get_api_v1_builder_spaces_id_preview",
++ "summary": "Read a person's own spaces and their source files, as their agent (OpenVibe.Actor) works on them (plan 2026-10-22 §Z stage Z1: Space's builder becomes a task of the person's one agent).",
++ "description": "**space.build.read** (first-party): Read a person's own spaces and their source files, as their agent (OpenVibe.Actor) works on them (plan 2026-10-22 §Z stage Z1: Space's builder becomes a task of the person's one agent). GET /api/v1/builder/spaces lists the person's spaces, GET /api/v1/builder/spaces/:id reads one, GET /api/v1/builder/spaces/:id/files reads its files, GET /api/v1/builder/spaces/:id/files/:path reads one of them, GET /api/v1/builder/spaces/:id/preview says where it can be seen. A first-party service names the person in X-OV-Subject; Space reads only that person's own spaces, and another person's space is the same 404 as one that does not exist.",
"tags": [
-- "space.site"
++ "space.build"
],
"x-openvibe-capabilities": [
-- "space.site.manage"
++ "space.build.read"
],
"x-openvibe-visibility": [
-- "public"
++ "first-party"
],
-- "x-openvibe-quota-class": "space-manage",
++ "x-openvibe-quota-class": "standard",
"security": [
{
"openvibeToken": [
-- "space.site.manage"
++ "space.build.read"
]
}
],
-- "x-openvibe-input": {
-- "$ref": "#/components/schemas/space.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/space.site-manage-result.v1"
++ "$ref": "#/components/schemas/space.build-list.v1"
}
}
}
@@@ -485,45 +466,47 @@
}
}
}
-- },
++ }
++ },
++ "/api/v1/builder/spaces/{id}/publish": {
"post": {
-- "operationId": "post_api_v1_projects",
-- "summary": "Manage OpenVibe.Space 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": "**space.site.manage** (public): Manage OpenVibe.Space 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).",
++ "operationId": "post_api_v1_builder_spaces_id_publish",
++ "summary": "Ask to publish one of a person's own spaces, as their agent (OpenVibe.Actor) built it (plan 2026-10-22 §Z stage Z1).",
++ "description": "**space.build.publish** (first-party): Ask to publish one of a person's own spaces, as their agent (OpenVibe.Actor) built it (plan 2026-10-22 §Z stage Z1). POST /api/v1/builder/spaces/:id/publish asks and answers { state: 'pending' } with the request the person answers in the Dock; Space never publishes without that answer, and the agent is told to wait. The person's answer reaches Space through POST /api/v1/agent/approvals/:id/decide.",
"tags": [
-- "space.site"
++ "space.build"
],
"x-openvibe-capabilities": [
-- "space.site.manage"
++ "space.build.publish"
],
"x-openvibe-visibility": [
-- "public"
++ "first-party"
],
-- "x-openvibe-quota-class": "space-manage",
++ "x-openvibe-quota-class": "standard",
"security": [
{
"openvibeToken": [
-- "space.site.manage"
++ "space.build.publish"
]
}
],
-- "requestBody": {
-- "required": false,
-- "content": {
-- "application/json": {
-- "schema": {
-- "$ref": "#/components/schemas/space.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/space.site-manage-result.v1"
++ "$ref": "#/components/schemas/space.build-publish.v1"
}
}
}
@@@ -541,9 +524,9 @@
}
}
},
-- "/api/v1/projects/{id}": {
++ "/api/v1/deploys/{id}": {
"delete": {
-- "operationId": "delete_api_v1_projects_id",
++ "operationId": "delete_api_v1_deploys_id",
"summary": "Manage OpenVibe.Space 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": "**space.site.manage** (public): Manage OpenVibe.Space 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": [
@@@ -600,28 +583,28 @@
}
},
"get": {
-- "operationId": "get_api_v1_projects_id",
-- "summary": "Manage OpenVibe.Space 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": "**space.site.manage** (public): Manage OpenVibe.Space 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).",
++ "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": "**space.deploy.create** (public): 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": [
-- "space.site"
++ "space.deploy"
],
"x-openvibe-capabilities": [
-- "space.site.manage"
++ "space.deploy.create"
],
"x-openvibe-visibility": [
"public"
],
-- "x-openvibe-quota-class": "space-manage",
++ "x-openvibe-quota-class": "space-deploy",
"security": [
{
"openvibeToken": [
-- "space.site.manage"
++ "space.deploy.create"
]
}
],
"x-openvibe-input": {
-- "$ref": "#/components/schemas/space.site-manage-request.v1"
++ "$ref": "#/components/schemas/space.deploy-create-request.v1"
},
"parameters": [
{
@@@ -639,7 +622,7 @@
"content": {
"application/json": {
"schema": {
-- "$ref": "#/components/schemas/space.site-manage-result.v1"
++ "$ref": "#/components/schemas/space.deploy-create-result.v1"
}
}
}
@@@ -657,30 +640,37 @@
}
}
},
-- "/api/v1/projects/{id}/members/{principal}": {
-- "delete": {
-- "operationId": "delete_api_v1_projects_id_members_principal",
-- "summary": "Manage OpenVibe.Space 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": "**space.site.manage** (public): Manage OpenVibe.Space 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).",
++ "/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": "**space.deploy.create** (public): 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": [
-- "space.site"
++ "space.deploy"
],
"x-openvibe-capabilities": [
-- "space.site.manage"
++ "space.deploy.create"
],
"x-openvibe-visibility": [
"public"
],
-- "x-openvibe-quota-class": "space-manage",
++ "x-openvibe-quota-class": "space-deploy",
"security": [
{
"openvibeToken": [
-- "space.site.manage"
++ "space.deploy.create"
]
}
],
-- "x-openvibe-input": {
-- "$ref": "#/components/schemas/space.site-manage-request.v1"
++ "requestBody": {
++ "required": false,
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/space.deploy-create-request.v1"
++ }
++ }
++ }
},
"parameters": [
{
@@@ -690,14 +680,6 @@
"schema": {
"type": "string"
}
-- },
-- {
-- "name": "principal",
-- "in": "path",
-- "required": true,
-- "schema": {
-- "type": "string"
-- }
}
],
"responses": {
@@@ -706,7 +688,7 @@
"content": {
"application/json": {
"schema": {
-- "$ref": "#/components/schemas/space.site-manage-result.v1"
++ "$ref": "#/components/schemas/space.deploy-create-result.v1"
}
}
}
@@@ -722,37 +704,32 @@
}
}
}
-- },
-- "put": {
-- "operationId": "put_api_v1_projects_id_members_principal",
-- "summary": "Manage OpenVibe.Space 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": "**space.site.manage** (public): Manage OpenVibe.Space 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).",
++ }
++ },
++ "/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": "**space.deploy.create** (public): 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": [
-- "space.site"
++ "space.deploy"
],
"x-openvibe-capabilities": [
-- "space.site.manage"
++ "space.deploy.create"
],
"x-openvibe-visibility": [
"public"
],
-- "x-openvibe-quota-class": "space-manage",
++ "x-openvibe-quota-class": "space-deploy",
"security": [
{
"openvibeToken": [
-- "space.site.manage"
++ "space.deploy.create"
]
}
],
-- "requestBody": {
-- "required": false,
-- "content": {
-- "application/json": {
-- "schema": {
-- "$ref": "#/components/schemas/space.site-manage-request.v1"
-- }
-- }
-- }
++ "x-openvibe-input": {
++ "$ref": "#/components/schemas/space.deploy-create-request.v1"
},
"parameters": [
{
@@@ -762,14 +739,6 @@
"schema": {
"type": "string"
}
-- },
-- {
-- "name": "principal",
-- "in": "path",
-- "required": true,
-- "schema": {
-- "type": "string"
-- }
}
],
"responses": {
@@@ -778,7 +747,7 @@
"content": {
"application/json": {
"schema": {
-- "$ref": "#/components/schemas/space.site-manage-result.v1"
++ "$ref": "#/components/schemas/space.deploy-create-result.v1"
}
}
}
@@@ -796,16 +765,16 @@
}
}
},
-- "/api/v1/projects/{id}/quota": {
-- "get": {
-- "operationId": "get_api_v1_projects_id_quota",
-- "summary": "Manage OpenVibe.Space 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": "**space.site.manage** (public): Manage OpenVibe.Space 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).",
++ "/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": "**space.domain.manage** (public): 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": [
-- "space.site"
++ "space.domain"
],
"x-openvibe-capabilities": [
-- "space.site.manage"
++ "space.domain.manage"
],
"x-openvibe-visibility": [
"public"
@@@ -814,12 +783,12 @@
"security": [
{
"openvibeToken": [
-- "space.site.manage"
++ "space.domain.manage"
]
}
],
"x-openvibe-input": {
-- "$ref": "#/components/schemas/space.site-manage-request.v1"
++ "$ref": "#/components/schemas/space.domain-manage-request.v1"
},
"parameters": [
{
@@@ -837,7 +806,7 @@
"content": {
"application/json": {
"schema": {
-- "$ref": "#/components/schemas/space.site-manage-result.v1"
++ "$ref": "#/components/schemas/space.domain-manage-result.v1"
}
}
}
@@@ -853,16 +822,18 @@
}
}
}
-- },
-- "put": {
-- "operationId": "put_api_v1_projects_id_quota",
-- "summary": "Manage OpenVibe.Space 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": "**space.site.manage** (public): Manage OpenVibe.Space 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).",
++ }
++ },
++ "/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": "**space.domain.manage** (public): 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": [
-- "space.site"
++ "space.domain"
],
"x-openvibe-capabilities": [
-- "space.site.manage"
++ "space.domain.manage"
],
"x-openvibe-visibility": [
"public"
@@@ -871,7 +842,7 @@
"security": [
{
"openvibeToken": [
-- "space.site.manage"
++ "space.domain.manage"
]
}
],
@@@ -880,7 +851,7 @@
"content": {
"application/json": {
"schema": {
-- "$ref": "#/components/schemas/space.site-manage-request.v1"
++ "$ref": "#/components/schemas/space.domain-manage-request.v1"
}
}
}
@@@ -901,7 +872,7 @@
"content": {
"application/json": {
"schema": {
-- "$ref": "#/components/schemas/space.site-manage-result.v1"
++ "$ref": "#/components/schemas/space.domain-manage-result.v1"
}
}
}
@@@ -919,9 +890,9 @@
}
}
},
-- "/api/v1/projects/{id}/sites": {
++ "/api/v1/projects": {
"get": {
-- "operationId": "get_api_v1_projects_id_sites",
++ "operationId": "get_api_v1_projects",
"summary": "Manage OpenVibe.Space 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": "**space.site.manage** (public): Manage OpenVibe.Space 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": [
@@@ -944,16 +915,6 @@
"x-openvibe-input": {
"$ref": "#/components/schemas/space.site-manage-request.v1"
},
-- "parameters": [
-- {
-- "name": "id",
-- "in": "path",
-- "required": true,
-- "schema": {
-- "type": "string"
-- }
-- }
-- ],
"responses": {
"2XX": {
"description": "Success",
@@@ -978,7 +939,7 @@
}
},
"post": {
-- "operationId": "post_api_v1_projects_id_sites",
++ "operationId": "post_api_v1_projects",
"summary": "Manage OpenVibe.Space 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": "**space.site.manage** (public): Manage OpenVibe.Space 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": [
@@@ -1008,16 +969,6 @@
}
}
},
-- "parameters": [
-- {
-- "name": "id",
-- "in": "path",
-- "required": true,
-- "schema": {
-- "type": "string"
-- }
-- }
-- ],
"responses": {
"2XX": {
"description": "Success",
@@@ -1042,9 +993,9 @@
}
}
},
-- "/api/v1/projects/{id}/takedown": {
++ "/api/v1/projects/{id}": {
"delete": {
-- "operationId": "delete_api_v1_projects_id_takedown",
++ "operationId": "delete_api_v1_projects_id",
"summary": "Manage OpenVibe.Space 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": "**space.site.manage** (public): Manage OpenVibe.Space 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": [
@@@ -1100,8 +1051,8 @@
}
}
},
-- "post": {
-- "operationId": "post_api_v1_projects_id_takedown",
++ "get": {
++ "operationId": "get_api_v1_projects_id",
"summary": "Manage OpenVibe.Space 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": "**space.site.manage** (public): Manage OpenVibe.Space 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": [
@@@ -1121,15 +1072,8 @@
]
}
],
-- "requestBody": {
-- "required": false,
-- "content": {
-- "application/json": {
-- "schema": {
-- "$ref": "#/components/schemas/space.site-manage-request.v1"
-- }
-- }
-- }
++ "x-openvibe-input": {
++ "$ref": "#/components/schemas/space.site-manage-request.v1"
},
"parameters": [
{
@@@ -1165,35 +1109,56 @@
}
}
},
-- "/api/v1/resources": {
-- "get": {
-- "operationId": "get_api_v1_resources",
-- "summary": "Read OpenVibe.Space'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/:o",
-- "description": "**space.resource.read** (first-party): Read OpenVibe.Space'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 space.site, id sit_<ULID>), the immutable deploys of those sites (kind space.deploy, id dpl_<ULID>) and their default and custom domains (kind space.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.",
++ "/api/v1/projects/{id}/members/{principal}": {
++ "delete": {
++ "operationId": "delete_api_v1_projects_id_members_principal",
++ "summary": "Manage OpenVibe.Space 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": "**space.site.manage** (public): Manage OpenVibe.Space 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": [
-- "space.resource"
++ "space.site"
],
"x-openvibe-capabilities": [
-- "space.resource.read"
++ "space.site.manage"
],
"x-openvibe-visibility": [
-- "first-party"
++ "public"
],
-- "x-openvibe-quota-class": "standard",
++ "x-openvibe-quota-class": "space-manage",
"security": [
{
"openvibeToken": [
-- "space.resource.read"
++ "space.site.manage"
]
}
],
++ "x-openvibe-input": {
++ "$ref": "#/components/schemas/space.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/common.resource-list-result.v1"
++ "$ref": "#/components/schemas/space.site-manage-result.v1"
}
}
}
@@@ -1209,35 +1174,51 @@
}
}
}
-- }
-- },
-- "/api/v1/resources/{ovrn}": {
-- "get": {
-- "operationId": "get_api_v1_resources_ovrn",
-- "summary": "Read OpenVibe.Space'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/:o",
-- "description": "**space.resource.read** (first-party): Read OpenVibe.Space'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 space.site, id sit_<ULID>), the immutable deploys of those sites (kind space.deploy, id dpl_<ULID>) and their default and custom domains (kind space.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.",
++ },
++ "put": {
++ "operationId": "put_api_v1_projects_id_members_principal",
++ "summary": "Manage OpenVibe.Space 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": "**space.site.manage** (public): Manage OpenVibe.Space 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": [
-- "space.resource"
++ "space.site"
],
"x-openvibe-capabilities": [
-- "space.resource.read"
++ "space.site.manage"
],
"x-openvibe-visibility": [
-- "first-party"
++ "public"
],
-- "x-openvibe-quota-class": "standard",
++ "x-openvibe-quota-class": "space-manage",
"security": [
{
"openvibeToken": [
-- "space.resource.read"
++ "space.site.manage"
]
}
],
-- "parameters": [
-- {
-- "name": "ovrn",
-- "in": "path",
-- "required": true,
++ "requestBody": {
++ "required": false,
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/space.site-manage-request.v1"
++ }
++ }
++ }
++ },
++ "parameters": [
++ {
++ "name": "id",
++ "in": "path",
++ "required": true,
++ "schema": {
++ "type": "string"
++ }
++ },
++ {
++ "name": "principal",
++ "in": "path",
++ "required": true,
"schema": {
"type": "string"
}
@@@ -1249,7 +1230,7 @@
"content": {
"application/json": {
"schema": {
-- "$ref": "#/components/schemas/common.resource-list-result.v1"
++ "$ref": "#/components/schemas/space.site-manage-result.v1"
}
}
}
@@@ -1267,45 +1248,48 @@
}
}
},
-- "/api/v1/resources/control": {
-- "post": {
-- "operationId": "post_api_v1_resources_control",
-- "summary": "Control a site, deploy or domain through OpenVibe.Space's control API (ADR-048, plan T13 step 10): POST /api/v1/resources/control takes one common.resource-control-request@1 naming a space.site, space",
-- "description": "**space.resource.control** (first-party): Control a site, deploy or domain through OpenVibe.Space's control API (ADR-048, plan T13 step 10): POST /api/v1/resources/control takes one common.resource-control-request@1 naming a space.site, space.deploy or space.domain by its OVRN, from a first-party service (OpenVibe.Services) acting for the person in on_behalf_of. Action: delete, exactly as the API's DELETE /api/v1/sites/:id, /deploys/:id and /domains/:id: a site stops serving at once and its deploys and domains go with it; the deploy a site is serving, a site's default domain, and anything of a site under a takedown are refused with Space's own reason. Any other action is refused unsupported. Space decides by its own project roles (deleting needs maintainer or owner of the project), so a person who is not a member is refused as not found, never confirmed to exist; and only inside the project the OVRN names. dry_run decides and explains without applying. The first answer per (caller, project, idempotency_key) is kept and returned for a repeat; the same key with another request is refused. Answers common.resource-control-result@1.",
++ "/api/v1/projects/{id}/quota": {
++ "get": {
++ "operationId": "get_api_v1_projects_id_quota",
++ "summary": "Manage OpenVibe.Space 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": "**space.site.manage** (public): Manage OpenVibe.Space 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": [
-- "space.resource"
++ "space.site"
],
"x-openvibe-capabilities": [
-- "space.resource.control"
++ "space.site.manage"
],
"x-openvibe-visibility": [
-- "first-party"
++ "public"
],
-- "x-openvibe-quota-class": "standard",
++ "x-openvibe-quota-class": "space-manage",
"security": [
{
"openvibeToken": [
-- "space.resource.control"
++ "space.site.manage"
]
}
],
-- "requestBody": {
-- "required": false,
-- "content": {
-- "application/json": {
-- "schema": {
-- "$ref": "#/components/schemas/common.resource-control-request.v1"
-- }
++ "x-openvibe-input": {
++ "$ref": "#/components/schemas/space.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/common.resource-control-result.v1"
++ "$ref": "#/components/schemas/space.site-manage-result.v1"
}
}
}
@@@ -1321,11 +1305,9 @@
}
}
}
-- }
-- },
-- "/api/v1/sites/{id}": {
-- "delete": {
-- "operationId": "delete_api_v1_sites_id",
++ },
++ "put": {
++ "operationId": "put_api_v1_projects_id_quota",
"summary": "Manage OpenVibe.Space 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": "**space.site.manage** (public): Manage OpenVibe.Space 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": [
@@@ -1345,8 +1327,15 @@
]
}
],
-- "x-openvibe-input": {
-- "$ref": "#/components/schemas/space.site-manage-request.v1"
++ "requestBody": {
++ "required": false,
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/space.site-manage-request.v1"
++ }
++ }
++ }
},
"parameters": [
{
@@@ -1380,9 +1369,11 @@
}
}
}
-- },
++ }
++ },
++ "/api/v1/projects/{id}/sites": {
"get": {
-- "operationId": "get_api_v1_sites_id",
++ "operationId": "get_api_v1_projects_id_sites",
"summary": "Manage OpenVibe.Space 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": "**space.site.manage** (public): Manage OpenVibe.Space 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": [
@@@ -1437,18 +1428,16 @@
}
}
}
-- }
-- },
-- "/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": "**space.site.config** (public): 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.",
++ },
++ "post": {
++ "operationId": "post_api_v1_projects_id_sites",
++ "summary": "Manage OpenVibe.Space 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": "**space.site.manage** (public): Manage OpenVibe.Space 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": [
"space.site"
],
"x-openvibe-capabilities": [
-- "space.site.config"
++ "space.site.manage"
],
"x-openvibe-visibility": [
"public"
@@@ -1457,12 +1446,19 @@
"security": [
{
"openvibeToken": [
-- "space.site.config"
++ "space.site.manage"
]
}
],
-- "x-openvibe-input": {
-- "$ref": "#/components/schemas/space.site-config-request.v1"
++ "requestBody": {
++ "required": false,
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/space.site-manage-request.v1"
++ }
++ }
++ }
},
"parameters": [
{
@@@ -1472,57 +1468,6 @@
"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": {
@@@ -1531,7 +1476,7 @@
"content": {
"application/json": {
"schema": {
-- "$ref": "#/components/schemas/space.site-config-result.v1"
++ "$ref": "#/components/schemas/space.site-manage-result.v1"
}
}
}
@@@ -1547,16 +1492,18 @@
}
}
}
-- },
-- "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": "**space.site.config** (public): 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.",
++ }
++ },
++ "/api/v1/projects/{id}/takedown": {
++ "delete": {
++ "operationId": "delete_api_v1_projects_id_takedown",
++ "summary": "Manage OpenVibe.Space 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": "**space.site.manage** (public): Manage OpenVibe.Space 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": [
"space.site"
],
"x-openvibe-capabilities": [
-- "space.site.config"
++ "space.site.manage"
],
"x-openvibe-visibility": [
"public"
@@@ -1565,12 +1512,12 @@
"security": [
{
"openvibeToken": [
-- "space.site.config"
++ "space.site.manage"
]
}
],
"x-openvibe-input": {
-- "$ref": "#/components/schemas/space.site-config-request.v1"
++ "$ref": "#/components/schemas/space.site-manage-request.v1"
},
"parameters": [
{
@@@ -1580,57 +1527,6 @@
"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": {
@@@ -1639,7 +1535,7 @@
"content": {
"application/json": {
"schema": {
-- "$ref": "#/components/schemas/space.site-config-result.v1"
++ "$ref": "#/components/schemas/space.site-manage-result.v1"
}
}
}
@@@ -1656,15 +1552,15 @@
}
}
},
-- "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": "**space.site.config** (public): 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.",
++ "post": {
++ "operationId": "post_api_v1_projects_id_takedown",
++ "summary": "Manage OpenVibe.Space 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": "**space.site.manage** (public): Manage OpenVibe.Space 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": [
"space.site"
],
"x-openvibe-capabilities": [
-- "space.site.config"
++ "space.site.manage"
],
"x-openvibe-visibility": [
"public"
@@@ -1673,7 +1569,7 @@
"security": [
{
"openvibeToken": [
-- "space.site.config"
++ "space.site.manage"
]
}
],
@@@ -1682,7 +1578,7 @@
"content": {
"application/json": {
"schema": {
-- "$ref": "#/components/schemas/space.site-config-request.v1"
++ "$ref": "#/components/schemas/space.site-manage-request.v1"
}
}
}
@@@ -1703,7 +1599,7 @@
"content": {
"application/json": {
"schema": {
-- "$ref": "#/components/schemas/space.site-config-result.v1"
++ "$ref": "#/components/schemas/space.site-manage-result.v1"
}
}
}
@@@ -1721,48 +1617,35 @@
}
}
},
-- "/api/v1/sites/{id}/deploys": {
++ "/api/v1/resources": {
"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": "**space.deploy.create** (public): 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.",
++ "operationId": "get_api_v1_resources",
++ "summary": "Read OpenVibe.Space'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/:o",
++ "description": "**space.resource.read** (first-party): Read OpenVibe.Space'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 space.site, id sit_<ULID>), the immutable deploys of those sites (kind space.deploy, id dpl_<ULID>) and their default and custom domains (kind space.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": [
-- "space.deploy"
++ "space.resource"
],
"x-openvibe-capabilities": [
-- "space.deploy.create"
++ "space.resource.read"
],
"x-openvibe-visibility": [
-- "public"
++ "first-party"
],
-- "x-openvibe-quota-class": "space-deploy",
++ "x-openvibe-quota-class": "standard",
"security": [
{
"openvibeToken": [
-- "space.deploy.create"
++ "space.resource.read"
]
}
],
-- "x-openvibe-input": {
-- "$ref": "#/components/schemas/space.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/space.deploy-create-result.v1"
++ "$ref": "#/components/schemas/common.resource-list-result.v1"
}
}
}
@@@ -1778,41 +1661,33 @@
}
}
}
-- },
-- "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": "**space.deploy.create** (public): 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.",
++ }
++ },
++ "/api/v1/resources/{ovrn}": {
++ "get": {
++ "operationId": "get_api_v1_resources_ovrn",
++ "summary": "Read OpenVibe.Space'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/:o",
++ "description": "**space.resource.read** (first-party): Read OpenVibe.Space'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 space.site, id sit_<ULID>), the immutable deploys of those sites (kind space.deploy, id dpl_<ULID>) and their default and custom domains (kind space.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": [
-- "space.deploy"
++ "space.resource"
],
"x-openvibe-capabilities": [
-- "space.deploy.create"
++ "space.resource.read"
],
"x-openvibe-visibility": [
-- "public"
++ "first-party"
],
-- "x-openvibe-quota-class": "space-deploy",
++ "x-openvibe-quota-class": "standard",
"security": [
{
"openvibeToken": [
-- "space.deploy.create"
++ "space.resource.read"
]
}
],
-- "requestBody": {
-- "required": false,
-- "content": {
-- "application/json": {
-- "schema": {
-- "$ref": "#/components/schemas/space.deploy-create-request.v1"
-- }
-- }
-- }
-- },
"parameters": [
{
-- "name": "id",
++ "name": "ovrn",
"in": "path",
"required": true,
"schema": {
@@@ -1826,7 +1701,7 @@
"content": {
"application/json": {
"schema": {
-- "$ref": "#/components/schemas/space.deploy-create-result.v1"
++ "$ref": "#/components/schemas/common.resource-list-result.v1"
}
}
}
@@@ -1844,48 +1719,45 @@
}
}
},
-- "/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": "**space.domain.manage** (public): 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.",
++ "/api/v1/resources/control": {
++ "post": {
++ "operationId": "post_api_v1_resources_control",
++ "summary": "Control a site, deploy or domain through OpenVibe.Space's control API (ADR-048, plan T13 step 10): POST /api/v1/resources/control takes one common.resource-control-request@1 naming a space.site, space",
++ "description": "**space.resource.control** (first-party): Control a site, deploy or domain through OpenVibe.Space's control API (ADR-048, plan T13 step 10): POST /api/v1/resources/control takes one common.resource-control-request@1 naming a space.site, space.deploy or space.domain by its OVRN, from a first-party service (OpenVibe.Services) acting for the person in on_behalf_of. Action: delete, exactly as the API's DELETE /api/v1/sites/:id, /deploys/:id and /domains/:id: a site stops serving at once and its deploys and domains go with it; the deploy a site is serving, a site's default domain, and anything of a site under a takedown are refused with Space's own reason. Any other action is refused unsupported. Space decides by its own project roles (deleting needs maintainer or owner of the project), so a person who is not a member is refused as not found, never confirmed to exist; and only inside the project the OVRN names. dry_run decides and explains without applying. The first answer per (caller, project, idempotency_key) is kept and returned for a repeat; the same key with another request is refused. Answers common.resource-control-result@1.",
"tags": [
-- "space.domain"
++ "space.resource"
],
"x-openvibe-capabilities": [
-- "space.domain.manage"
++ "space.resource.control"
],
"x-openvibe-visibility": [
-- "public"
++ "first-party"
],
-- "x-openvibe-quota-class": "space-manage",
++ "x-openvibe-quota-class": "standard",
"security": [
{
"openvibeToken": [
-- "space.domain.manage"
++ "space.resource.control"
]
}
],
-- "x-openvibe-input": {
-- "$ref": "#/components/schemas/space.domain-manage-request.v1"
-- },
-- "parameters": [
-- {
-- "name": "id",
-- "in": "path",
-- "required": true,
-- "schema": {
-- "type": "string"
++ "requestBody": {
++ "required": false,
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/common.resource-control-request.v1"
++ }
}
}
-- ],
++ },
"responses": {
"2XX": {
"description": "Success",
"content": {
"application/json": {
"schema": {
-- "$ref": "#/components/schemas/space.domain-manage-result.v1"
++ "$ref": "#/components/schemas/common.resource-control-result.v1"
}
}
}
@@@ -1898,19 +1770,21 @@
"$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": "**space.domain.manage** (public): 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.",
++ }
++ }
++ }
++ }
++ },
++ "/api/v1/sites/{id}": {
++ "delete": {
++ "operationId": "delete_api_v1_sites_id",
++ "summary": "Manage OpenVibe.Space 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": "**space.site.manage** (public): Manage OpenVibe.Space 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": [
-- "space.domain"
++ "space.site"
],
"x-openvibe-capabilities": [
-- "space.domain.manage"
++ "space.site.manage"
],
"x-openvibe-visibility": [
"public"
@@@ -1919,19 +1793,12 @@
"security": [
{
"openvibeToken": [
-- "space.domain.manage"
++ "space.site.manage"
]
}
],
-- "requestBody": {
-- "required": false,
-- "content": {
-- "application/json": {
-- "schema": {
-- "$ref": "#/components/schemas/space.domain-manage-request.v1"
-- }
-- }
-- }
++ "x-openvibe-input": {
++ "$ref": "#/components/schemas/space.site-manage-request.v1"
},
"parameters": [
{
@@@ -1949,7 +1816,7 @@
"content": {
"application/json": {
"schema": {
-- "$ref": "#/components/schemas/space.domain-manage-result.v1"
++ "$ref": "#/components/schemas/space.site-manage-result.v1"
}
}
}
@@@ -1965,39 +1832,30 @@
}
}
}
-- }
-- },
-- "/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": "**space.deploy.create** (public): 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.",
++ },
++ "get": {
++ "operationId": "get_api_v1_sites_id",
++ "summary": "Manage OpenVibe.Space 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": "**space.site.manage** (public): Manage OpenVibe.Space 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": [
-- "space.deploy"
++ "space.site"
],
"x-openvibe-capabilities": [
-- "space.deploy.create"
++ "space.site.manage"
],
"x-openvibe-visibility": [
"public"
],
-- "x-openvibe-quota-class": "space-deploy",
++ "x-openvibe-quota-class": "space-manage",
"security": [
{
"openvibeToken": [
-- "space.deploy.create"
++ "space.site.manage"
]
}
],
-- "requestBody": {
-- "required": false,
-- "content": {
-- "application/json": {
-- "schema": {
-- "$ref": "#/components/schemas/space.deploy-create-request.v1"
-- }
-- }
-- }
++ "x-openvibe-input": {
++ "$ref": "#/components/schemas/space.site-manage-request.v1"
},
"parameters": [
{
@@@ -2015,7 +1873,7 @@
"content": {
"application/json": {
"schema": {
-- "$ref": "#/components/schemas/space.deploy-create-result.v1"
++ "$ref": "#/components/schemas/space.site-manage-result.v1"
}
}
}
@@@ -2033,16 +1891,16 @@
}
}
},
-- "/api/v1/sites/{id}/source": {
++ "/api/v1/sites/{id}/config": {
"delete": {
-- "operationId": "delete_api_v1_sites_id_source",
-- "summary": "Manage OpenVibe.Space 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": "**space.site.manage** (public): Manage OpenVibe.Space 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).",
++ "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": "**space.site.config** (public): 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": [
"space.site"
],
"x-openvibe-capabilities": [
-- "space.site.manage"
++ "space.site.config"
],
"x-openvibe-visibility": [
"public"
@@@ -2051,12 +1909,12 @@
"security": [
{
"openvibeToken": [
-- "space.site.manage"
++ "space.site.config"
]
}
],
"x-openvibe-input": {
-- "$ref": "#/components/schemas/space.site-manage-request.v1"
++ "$ref": "#/components/schemas/space.site-config-request.v1"
},
"parameters": [
{
@@@ -2066,6 +1924,57 @@
"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": {
@@@ -2074,7 +1983,7 @@
"content": {
"application/json": {
"schema": {
-- "$ref": "#/components/schemas/space.site-manage-result.v1"
++ "$ref": "#/components/schemas/space.site-config-result.v1"
}
}
}
@@@ -2092,14 +2001,14 @@
}
},
"get": {
-- "operationId": "get_api_v1_sites_id_source",
-- "summary": "Manage OpenVibe.Space 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": "**space.site.manage** (public): Manage OpenVibe.Space 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).",
++ "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": "**space.site.config** (public): 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": [
"space.site"
],
"x-openvibe-capabilities": [
-- "space.site.manage"
++ "space.site.config"
],
"x-openvibe-visibility": [
"public"
@@@ -2108,12 +2017,12 @@
"security": [
{
"openvibeToken": [
-- "space.site.manage"
++ "space.site.config"
]
}
],
"x-openvibe-input": {
-- "$ref": "#/components/schemas/space.site-manage-request.v1"
++ "$ref": "#/components/schemas/space.site-config-request.v1"
},
"parameters": [
{
@@@ -2123,6 +2032,57 @@
"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": {
@@@ -2131,7 +2091,7 @@
"content": {
"application/json": {
"schema": {
-- "$ref": "#/components/schemas/space.site-manage-result.v1"
++ "$ref": "#/components/schemas/space.site-config-result.v1"
}
}
}
@@@ -2149,14 +2109,14 @@
}
},
"put": {
-- "operationId": "put_api_v1_sites_id_source",
-- "summary": "Manage OpenVibe.Space 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": "**space.site.manage** (public): Manage OpenVibe.Space 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).",
++ "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": "**space.site.config** (public): 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": [
"space.site"
],
"x-openvibe-capabilities": [
-- "space.site.manage"
++ "space.site.config"
],
"x-openvibe-visibility": [
"public"
@@@ -2165,7 +2125,7 @@
"security": [
{
"openvibeToken": [
-- "space.site.manage"
++ "space.site.config"
]
}
],
@@@ -2174,7 +2134,7 @@
"content": {
"application/json": {
"schema": {
-- "$ref": "#/components/schemas/space.site-manage-request.v1"
++ "$ref": "#/components/schemas/space.site-config-request.v1"
}
}
}
@@@ -2195,7 +2155,7 @@
"content": {
"application/json": {
"schema": {
-- "$ref": "#/components/schemas/space.site-manage-result.v1"
++ "$ref": "#/components/schemas/space.site-config-result.v1"
}
}
}
@@@ -2213,9 +2173,9 @@
}
}
},
-- "/api/v1/sites/{id}/source/deploys": {
-- "post": {
-- "operationId": "post_api_v1_sites_id_source_deploys",
++ "/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": "**space.deploy.create** (public): 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": [
@@@ -2235,15 +2195,8 @@
]
}
],
-- "requestBody": {
-- "required": false,
-- "content": {
-- "application/json": {
-- "schema": {
-- "$ref": "#/components/schemas/space.deploy-create-request.v1"
-- }
-- }
-- }
++ "x-openvibe-input": {
++ "$ref": "#/components/schemas/space.deploy-create-request.v1"
},
"parameters": [
{
@@@ -2277,32 +2230,37 @@
}
}
}
-- }
-- },
-- "/api/v1/sites/{id}/takedown": {
-- "delete": {
-- "operationId": "delete_api_v1_sites_id_takedown",
-- "summary": "Manage OpenVibe.Space 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": "**space.site.manage** (public): Manage OpenVibe.Space 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).",
++ },
++ "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": "**space.deploy.create** (public): 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": [
-- "space.site"
++ "space.deploy"
],
"x-openvibe-capabilities": [
-- "space.site.manage"
++ "space.deploy.create"
],
"x-openvibe-visibility": [
"public"
],
-- "x-openvibe-quota-class": "space-manage",
++ "x-openvibe-quota-class": "space-deploy",
"security": [
{
"openvibeToken": [
-- "space.site.manage"
++ "space.deploy.create"
]
}
],
-- "x-openvibe-input": {
-- "$ref": "#/components/schemas/space.site-manage-request.v1"
++ "requestBody": {
++ "required": false,
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/space.deploy-create-request.v1"
++ }
++ }
++ }
},
"parameters": [
{
@@@ -2320,7 +2278,7 @@
"content": {
"application/json": {
"schema": {
-- "$ref": "#/components/schemas/space.site-manage-result.v1"
++ "$ref": "#/components/schemas/space.deploy-create-result.v1"
}
}
}
@@@ -2336,16 +2294,18 @@
}
}
}
-- },
-- "post": {
-- "operationId": "post_api_v1_sites_id_takedown",
-- "summary": "Manage OpenVibe.Space 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": "**space.site.manage** (public): Manage OpenVibe.Space 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).",
++ }
++ },
++ "/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": "**space.domain.manage** (public): 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": [
-- "space.site"
++ "space.domain"
],
"x-openvibe-capabilities": [
-- "space.site.manage"
++ "space.domain.manage"
],
"x-openvibe-visibility": [
"public"
@@@ -2354,19 +2314,12 @@
"security": [
{
"openvibeToken": [
-- "space.site.manage"
++ "space.domain.manage"
]
}
],
-- "requestBody": {
-- "required": false,
-- "content": {
-- "application/json": {
-- "schema": {
-- "$ref": "#/components/schemas/space.site-manage-request.v1"
-- }
-- }
-- }
++ "x-openvibe-input": {
++ "$ref": "#/components/schemas/space.domain-manage-request.v1"
},
"parameters": [
{
@@@ -2384,7 +2337,7 @@
"content": {
"application/json": {
"schema": {
-- "$ref": "#/components/schemas/space.site-manage-result.v1"
++ "$ref": "#/components/schemas/space.domain-manage-result.v1"
}
}
}
@@@ -2400,37 +2353,55 @@
}
}
}
-- }
-- },
-- "/api/v1/spaces": {
-- "get": {
-- "operationId": "get_api_v1_spaces",
-- "summary": "Read a person's own spaces and their source files, as their agent (OpenVibe.Actor) works on them (plan 2026-10-22 §Z stage Z1: Space's builder becomes a task of the person's one agent).",
-- "description": "**space.build.read** (first-party): Read a person's own spaces and their source files, as their agent (OpenVibe.Actor) works on them (plan 2026-10-22 §Z stage Z1: Space's builder becomes a task of the person's one agent). GET /api/v1/spaces lists the person's spaces, GET /api/v1/spaces/:id reads one, GET /api/v1/spaces/:id/files reads its files, GET /api/v1/spaces/:id/files/:path reads one of them, GET /api/v1/spaces/:id/preview says where it can be seen. A first-party service names the person in X-OV-Subject; Space reads only that person's own spaces, and another person's space is the same 404 as one that does not exist.",
++ },
++ "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": "**space.domain.manage** (public): 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": [
-- "space.build"
++ "space.domain"
],
"x-openvibe-capabilities": [
-- "space.build.read"
++ "space.domain.manage"
],
"x-openvibe-visibility": [
-- "first-party"
++ "public"
],
-- "x-openvibe-quota-class": "standard",
++ "x-openvibe-quota-class": "space-manage",
"security": [
{
"openvibeToken": [
-- "space.build.read"
++ "space.domain.manage"
]
}
],
++ "requestBody": {
++ "required": false,
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/space.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/space.build-list.v1"
++ "$ref": "#/components/schemas/space.domain-manage-result.v1"
}
}
}
@@@ -2446,25 +2417,27 @@
}
}
}
-- },
++ }
++ },
++ "/api/v1/sites/{id}/rollback": {
"post": {
-- "operationId": "post_api_v1_spaces",
-- "summary": "Make one of a person's own spaces, as their agent (OpenVibe.Actor) builds it (plan 2026-10-22 §Z stage Z1).",
-- "description": "**space.build.create** (first-party): Make one of a person's own spaces, as their agent (OpenVibe.Actor) builds it (plan 2026-10-22 §Z stage Z1). POST /api/v1/spaces makes a new space of the person named in X-OV-Subject, from Space's blank template; the agent then fills its files with space.build.write.",
++ "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": "**space.deploy.create** (public): 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": [
-- "space.build"
++ "space.deploy"
],
"x-openvibe-capabilities": [
-- "space.build.create"
++ "space.deploy.create"
],
"x-openvibe-visibility": [
-- "first-party"
++ "public"
],
-- "x-openvibe-quota-class": "standard",
++ "x-openvibe-quota-class": "space-deploy",
"security": [
{
"openvibeToken": [
-- "space.build.create"
++ "space.deploy.create"
]
}
],
@@@ -2473,18 +2446,28 @@
"content": {
"application/json": {
"schema": {
-- "$ref": "#/components/schemas/space.build-create.v1"
++ "$ref": "#/components/schemas/space.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/space.build-list.v1"
++ "$ref": "#/components/schemas/space.deploy-create-result.v1"
}
}
}
@@@ -2502,28 +2485,31 @@
}
}
},
-- "/api/v1/spaces/{id}": {
-- "get": {
-- "operationId": "get_api_v1_spaces_id",
-- "summary": "Read a person's own spaces and their source files, as their agent (OpenVibe.Actor) works on them (plan 2026-10-22 §Z stage Z1: Space's builder becomes a task of the person's one agent).",
-- "description": "**space.build.read** (first-party): Read a person's own spaces and their source files, as their agent (OpenVibe.Actor) works on them (plan 2026-10-22 §Z stage Z1: Space's builder becomes a task of the person's one agent). GET /api/v1/spaces lists the person's spaces, GET /api/v1/spaces/:id reads one, GET /api/v1/spaces/:id/files reads its files, GET /api/v1/spaces/:id/files/:path reads one of them, GET /api/v1/spaces/:id/preview says where it can be seen. A first-party service names the person in X-OV-Subject; Space reads only that person's own spaces, and another person's space is the same 404 as one that does not exist.",
++ "/api/v1/sites/{id}/source": {
++ "delete": {
++ "operationId": "delete_api_v1_sites_id_source",
++ "summary": "Manage OpenVibe.Space 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": "**space.site.manage** (public): Manage OpenVibe.Space 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": [
-- "space.build"
++ "space.site"
],
"x-openvibe-capabilities": [
-- "space.build.read"
++ "space.site.manage"
],
"x-openvibe-visibility": [
-- "first-party"
++ "public"
],
-- "x-openvibe-quota-class": "standard",
++ "x-openvibe-quota-class": "space-manage",
"security": [
{
"openvibeToken": [
-- "space.build.read"
++ "space.site.manage"
]
}
],
++ "x-openvibe-input": {
++ "$ref": "#/components/schemas/space.site-manage-request.v1"
++ },
"parameters": [
{
"name": "id",
@@@ -2540,7 +2526,7 @@
"content": {
"application/json": {
"schema": {
-- "$ref": "#/components/schemas/space.build-list.v1"
++ "$ref": "#/components/schemas/space.site-manage-result.v1"
}
}
}
@@@ -2556,30 +2542,31 @@
}
}
}
-- }
-- },
-- "/api/v1/spaces/{id}/files": {
++ },
"get": {
-- "operationId": "get_api_v1_spaces_id_files",
-- "summary": "Read a person's own spaces and their source files, as their agent (OpenVibe.Actor) works on them (plan 2026-10-22 §Z stage Z1: Space's builder becomes a task of the person's one agent).",
-- "description": "**space.build.read** (first-party): Read a person's own spaces and their source files, as their agent (OpenVibe.Actor) works on them (plan 2026-10-22 §Z stage Z1: Space's builder becomes a task of the person's one agent). GET /api/v1/spaces lists the person's spaces, GET /api/v1/spaces/:id reads one, GET /api/v1/spaces/:id/files reads its files, GET /api/v1/spaces/:id/files/:path reads one of them, GET /api/v1/spaces/:id/preview says where it can be seen. A first-party service names the person in X-OV-Subject; Space reads only that person's own spaces, and another person's space is the same 404 as one that does not exist.",
++ "operationId": "get_api_v1_sites_id_source",
++ "summary": "Manage OpenVibe.Space 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": "**space.site.manage** (public): Manage OpenVibe.Space 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": [
-- "space.build"
++ "space.site"
],
"x-openvibe-capabilities": [
-- "space.build.read"
++ "space.site.manage"
],
"x-openvibe-visibility": [
-- "first-party"
++ "public"
],
-- "x-openvibe-quota-class": "standard",
++ "x-openvibe-quota-class": "space-manage",
"security": [
{
"openvibeToken": [
-- "space.build.read"
++ "space.site.manage"
]
}
],
++ "x-openvibe-input": {
++ "$ref": "#/components/schemas/space.site-manage-request.v1"
++ },
"parameters": [
{
"name": "id",
@@@ -2596,7 +2583,7 @@
"content": {
"application/json": {
"schema": {
-- "$ref": "#/components/schemas/space.build-list.v1"
++ "$ref": "#/components/schemas/space.site-manage-result.v1"
}
}
}
@@@ -2614,23 +2601,23 @@
}
},
"put": {
-- "operationId": "put_api_v1_spaces_id_files",
-- "summary": "Write the files of one of a person's own spaces, as their agent (OpenVibe.Actor) builds it (plan 2026-10-22 §Z stage Z1).",
-- "description": "**space.build.write** (first-party): Write the files of one of a person's own spaces, as their agent (OpenVibe.Actor) builds it (plan 2026-10-22 §Z stage Z1). PUT /api/v1/spaces/:id/files replaces the space's files with the ones in the body. Every write is audited like Space's own editor writes are, and the space's own limits (files, bytes) are the same ones.",
++ "operationId": "put_api_v1_sites_id_source",
++ "summary": "Manage OpenVibe.Space 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": "**space.site.manage** (public): Manage OpenVibe.Space 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": [
-- "space.build"
++ "space.site"
],
"x-openvibe-capabilities": [
-- "space.build.write"
++ "space.site.manage"
],
"x-openvibe-visibility": [
-- "first-party"
++ "public"
],
-- "x-openvibe-quota-class": "standard",
++ "x-openvibe-quota-class": "space-manage",
"security": [
{
"openvibeToken": [
-- "space.build.write"
++ "space.site.manage"
]
}
],
@@@ -2639,7 +2626,7 @@
"content": {
"application/json": {
"schema": {
-- "$ref": "#/components/schemas/space.build-files.v1"
++ "$ref": "#/components/schemas/space.site-manage-request.v1"
}
}
}
@@@ -2660,7 +2647,7 @@
"content": {
"application/json": {
"schema": {
-- "$ref": "#/components/schemas/space.build-files.v1"
++ "$ref": "#/components/schemas/space.site-manage-result.v1"
}
}
}
@@@ -2678,28 +2665,38 @@
}
}
},
-- "/api/v1/spaces/{id}/files/{path}": {
-- "get": {
-- "operationId": "get_api_v1_spaces_id_files_path",
-- "summary": "Read a person's own spaces and their source files, as their agent (OpenVibe.Actor) works on them (plan 2026-10-22 §Z stage Z1: Space's builder becomes a task of the person's one agent).",
-- "description": "**space.build.read** (first-party): Read a person's own spaces and their source files, as their agent (OpenVibe.Actor) works on them (plan 2026-10-22 §Z stage Z1: Space's builder becomes a task of the person's one agent). GET /api/v1/spaces lists the person's spaces, GET /api/v1/spaces/:id reads one, GET /api/v1/spaces/:id/files reads its files, GET /api/v1/spaces/:id/files/:path reads one of them, GET /api/v1/spaces/:id/preview says where it can be seen. A first-party service names the person in X-OV-Subject; Space reads only that person's own spaces, and another person's space is the same 404 as one that does not exist.",
++ "/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": "**space.deploy.create** (public): 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": [
-- "space.build"
++ "space.deploy"
],
"x-openvibe-capabilities": [
-- "space.build.read"
++ "space.deploy.create"
],
"x-openvibe-visibility": [
-- "first-party"
++ "public"
],
-- "x-openvibe-quota-class": "standard",
++ "x-openvibe-quota-class": "space-deploy",
"security": [
{
"openvibeToken": [
-- "space.build.read"
++ "space.deploy.create"
]
}
],
++ "requestBody": {
++ "required": false,
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/space.deploy-create-request.v1"
++ }
++ }
++ }
++ },
"parameters": [
{
"name": "id",
@@@ -2708,14 +2705,6 @@
"schema": {
"type": "string"
}
-- },
-- {
-- "name": "path",
-- "in": "path",
-- "required": true,
-- "schema": {
-- "type": "string"
-- }
}
],
"responses": {
@@@ -2724,7 +2713,7 @@
"content": {
"application/json": {
"schema": {
-- "$ref": "#/components/schemas/space.build-list.v1"
++ "$ref": "#/components/schemas/space.deploy-create-result.v1"
}
}
}
@@@ -2742,28 +2731,31 @@
}
}
},
-- "/api/v1/spaces/{id}/preview": {
-- "get": {
-- "operationId": "get_api_v1_spaces_id_preview",
-- "summary": "Read a person's own spaces and their source files, as their agent (OpenVibe.Actor) works on them (plan 2026-10-22 §Z stage Z1: Space's builder becomes a task of the person's one agent).",
-- "description": "**space.build.read** (first-party): Read a person's own spaces and their source files, as their agent (OpenVibe.Actor) works on them (plan 2026-10-22 §Z stage Z1: Space's builder becomes a task of the person's one agent). GET /api/v1/spaces lists the person's spaces, GET /api/v1/spaces/:id reads one, GET /api/v1/spaces/:id/files reads its files, GET /api/v1/spaces/:id/files/:path reads one of them, GET /api/v1/spaces/:id/preview says where it can be seen. A first-party service names the person in X-OV-Subject; Space reads only that person's own spaces, and another person's space is the same 404 as one that does not exist.",
++ "/api/v1/sites/{id}/takedown": {
++ "delete": {
++ "operationId": "delete_api_v1_sites_id_takedown",
++ "summary": "Manage OpenVibe.Space 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": "**space.site.manage** (public): Manage OpenVibe.Space 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": [
-- "space.build"
++ "space.site"
],
"x-openvibe-capabilities": [
-- "space.build.read"
++ "space.site.manage"
],
"x-openvibe-visibility": [
-- "first-party"
++ "public"
],
-- "x-openvibe-quota-class": "standard",
++ "x-openvibe-quota-class": "space-manage",
"security": [
{
"openvibeToken": [
-- "space.build.read"
++ "space.site.manage"
]
}
],
++ "x-openvibe-input": {
++ "$ref": "#/components/schemas/space.site-manage-request.v1"
++ },
"parameters": [
{
"name": "id",
@@@ -2780,7 +2772,7 @@
"content": {
"application/json": {
"schema": {
-- "$ref": "#/components/schemas/space.build-list.v1"
++ "$ref": "#/components/schemas/space.site-manage-result.v1"
}
}
}
@@@ -2796,30 +2788,38 @@
}
}
}
-- }
-- },
-- "/api/v1/spaces/{id}/publish": {
++ },
"post": {
-- "operationId": "post_api_v1_spaces_id_publish",
-- "summary": "Ask to publish one of a person's own spaces, as their agent (OpenVibe.Actor) built it (plan 2026-10-22 §Z stage Z1).",
-- "description": "**space.build.publish** (first-party): Ask to publish one of a person's own spaces, as their agent (OpenVibe.Actor) built it (plan 2026-10-22 §Z stage Z1). POST /api/v1/spaces/:id/publish asks and answers { state: 'pending' } with the request the person answers in the Dock; Space never publishes without that answer, and the agent is told to wait. The person's answer reaches Space through POST /api/v1/agent/approvals/:id/decide.",
++ "operationId": "post_api_v1_sites_id_takedown",
++ "summary": "Manage OpenVibe.Space 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": "**space.site.manage** (public): Manage OpenVibe.Space 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": [
-- "space.build"
++ "space.site"
],
"x-openvibe-capabilities": [
-- "space.build.publish"
++ "space.site.manage"
],
"x-openvibe-visibility": [
-- "first-party"
++ "public"
],
-- "x-openvibe-quota-class": "standard",
++ "x-openvibe-quota-class": "space-manage",
"security": [
{
"openvibeToken": [
-- "space.build.publish"
++ "space.site.manage"
]
}
],
++ "requestBody": {
++ "required": false,
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/space.site-manage-request.v1"
++ }
++ }
++ }
++ },
"parameters": [
{
"name": "id",
@@@ -2836,7 +2836,7 @@
"content": {
"application/json": {
"schema": {
-- "$ref": "#/components/schemas/space.build-publish.v1"
++ "$ref": "#/components/schemas/space.site-manage-result.v1"
}
}
}
ddiff --git a/generated/openapi/tips.json b/generated/openapi/tips.json
iindex 5e3369e4..97c941a5 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.323.0",
-- "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.323.0): each operation lists the capabilities it performs; a token for 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.324.0",
++ "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.324.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/today.json b/generated/openapi/today.json
iindex d1fde467..f6d94eeb 100644
---- a/generated/openapi/today.json
++++ b/generated/openapi/today.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Today API",
-- "version": "0.323.0",
-- "description": "Routes of OpenVibe.Today as the OpenVibe contracts describe them (openvibe-contracts 0.323.0): each operation lists the capabilities it performs; a token for 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.324.0",
++ "description": "Routes of OpenVibe.Today as the OpenVibe contracts describe them (openvibe-contracts 0.324.0): each operation lists the capabilities it performs; a token for 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 e7b0ccf0..7d8de38b 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.323.0",
-- "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.323.0): each operation lists the capabilities it performs; a token for 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.324.0",
++ "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.324.0): each operation lists the capabilities it performs; a token for 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 12e64c98..5725ecea 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.323.0",
-- "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.323.0): each operation lists the capabilities it performs; a token for 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.324.0",
++ "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.324.0): each operation lists the capabilities it performs; a token for 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 8b04c615..84ed7e9e 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.323.0",
-- "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.323.0): each operation lists the capabilities it performs; a token for 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.324.0",
++ "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.324.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/vision.json b/generated/openapi/vision.json
iindex 956fba0a..5363a518 100644
---- a/generated/openapi/vision.json
++++ b/generated/openapi/vision.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Vision API",
-- "version": "0.323.0",
-- "description": "Routes of OpenVibe.Vision as the OpenVibe contracts describe them (openvibe-contracts 0.323.0): each operation lists the capabilities it performs; a token for 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.324.0",
++ "description": "Routes of OpenVibe.Vision as the OpenVibe contracts describe them (openvibe-contracts 0.324.0): each operation lists the capabilities it performs; a token for 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 1a60f79c..37f20f48 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.323.0",
-- "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.323.0): each operation lists the capabilities it performs; a token for 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.324.0",
++ "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.324.0): each operation lists the capabilities it performs; a token for 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 b9eb97a2..870f93d7 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.323.0",
-- "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.323.0): each operation lists the capabilities it performs; a token for 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.324.0",
++ "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.324.0): each operation lists the capabilities it performs; a token for 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 301c2a1f..e04abc41 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.323.0",
-- "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.323.0): each operation lists the capabilities it performs; a token for 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.324.0",
++ "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.324.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/zone.json b/generated/openapi/zone.json
iindex 0047758f..50d1010d 100644
---- a/generated/openapi/zone.json
++++ b/generated/openapi/zone.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Zone API",
-- "version": "0.323.0",
-- "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.323.0): each operation lists the capabilities it performs; a token for 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.324.0",
++ "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.324.0): each operation lists the capabilities it performs; a token for 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/space.build.create.json b/manifests/capabilities/space.build.create.json
iindex 9c3ea467..2136f0e5 100644
---- a/manifests/capabilities/space.build.create.json
++++ b/manifests/capabilities/space.build.create.json
@@@ -4,7 +4,7 @@
"owner": "space",
"status": "active",
"visibility": "first-party",
-- "description": "Make one of a person's own spaces, as their agent (OpenVibe.Actor) builds it (plan 2026-10-22 §Z stage Z1). POST /api/v1/spaces makes a new space of the person named in X-OV-Subject, from Space's blank template; the agent then fills its files with space.build.write.",
++ "description": "Make one of a person's own spaces, as their agent (OpenVibe.Actor) builds it (plan 2026-10-22 §Z stage Z1). POST /api/v1/builder/spaces makes a new space of the person named in X-OV-Subject, from Space's blank template; the agent then fills its files with space.build.write.",
"permissions": [
"spaces:write"
],
@@@ -14,7 +14,7 @@
"quotaClass": "standard",
"events": [],
"implementedBy": [
-- "POST /api/v1/spaces"
++ "POST /api/v1/builder/spaces"
],
"inputSchema": "space.build-create@1",
"outputSchema": "space.build-list@1"
ddiff --git a/manifests/capabilities/space.build.publish.json b/manifests/capabilities/space.build.publish.json
iindex 6896e122..238e5648 100644
---- a/manifests/capabilities/space.build.publish.json
++++ b/manifests/capabilities/space.build.publish.json
@@@ -5,7 +5,7 @@
"status": "active",
"visibility": "first-party",
"sensitive": true,
-- "description": "Ask to publish one of a person's own spaces, as their agent (OpenVibe.Actor) built it (plan 2026-10-22 §Z stage Z1). POST /api/v1/spaces/:id/publish asks and answers { state: 'pending' } with the request the person answers in the Dock; Space never publishes without that answer, and the agent is told to wait. The person's answer reaches Space through POST /api/v1/agent/approvals/:id/decide.",
++ "description": "Ask to publish one of a person's own spaces, as their agent (OpenVibe.Actor) built it (plan 2026-10-22 §Z stage Z1). POST /api/v1/builder/spaces/:id/publish asks and answers { state: 'pending' } with the request the person answers in the Dock; Space never publishes without that answer, and the agent is told to wait. The person's answer reaches Space through POST /api/v1/agent/approvals/:id/decide.",
"permissions": [
"spaces:publish"
],
@@@ -15,7 +15,7 @@
"quotaClass": "standard",
"events": [],
"implementedBy": [
-- "POST /api/v1/spaces/:id/publish",
++ "POST /api/v1/builder/spaces/:id/publish",
"POST /api/v1/agent/approvals/:id/decide"
],
"inputSchema": "common.no-body@1",
ddiff --git a/manifests/capabilities/space.build.read.json b/manifests/capabilities/space.build.read.json
iindex 419727a3..aa93e6f9 100644
---- a/manifests/capabilities/space.build.read.json
++++ b/manifests/capabilities/space.build.read.json
@@@ -4,7 +4,7 @@
"owner": "space",
"status": "active",
"visibility": "first-party",
-- "description": "Read a person's own spaces and their source files, as their agent (OpenVibe.Actor) works on them (plan 2026-10-22 §Z stage Z1: Space's builder becomes a task of the person's one agent). GET /api/v1/spaces lists the person's spaces, GET /api/v1/spaces/:id reads one, GET /api/v1/spaces/:id/files reads its files, GET /api/v1/spaces/:id/files/:path reads one of them, GET /api/v1/spaces/:id/preview says where it can be seen. A first-party service names the person in X-OV-Subject; Space reads only that person's own spaces, and another person's space is the same 404 as one that does not exist.",
++ "description": "Read a person's own spaces and their source files, as their agent (OpenVibe.Actor) works on them (plan 2026-10-22 §Z stage Z1: Space's builder becomes a task of the person's one agent). GET /api/v1/builder/spaces lists the person's spaces, GET /api/v1/builder/spaces/:id reads one, GET /api/v1/builder/spaces/:id/files reads its files, GET /api/v1/builder/spaces/:id/files/:path reads one of them, GET /api/v1/builder/spaces/:id/preview says where it can be seen. A first-party service names the person in X-OV-Subject; Space reads only that person's own spaces, and another person's space is the same 404 as one that does not exist.",
"permissions": [
"spaces:read"
],
@@@ -14,11 +14,11 @@
"quotaClass": "standard",
"events": [],
"implementedBy": [
-- "GET /api/v1/spaces",
-- "GET /api/v1/spaces/:id",
-- "GET /api/v1/spaces/:id/files",
-- "GET /api/v1/spaces/:id/files/:path",
-- "GET /api/v1/spaces/:id/preview"
++ "GET /api/v1/builder/spaces",
++ "GET /api/v1/builder/spaces/:id",
++ "GET /api/v1/builder/spaces/:id/files",
++ "GET /api/v1/builder/spaces/:id/files/:path",
++ "GET /api/v1/builder/spaces/:id/preview"
],
"inputSchema": "common.no-body@1",
"outputSchema": "space.build-list@1"
ddiff --git a/manifests/capabilities/space.build.write.json b/manifests/capabilities/space.build.write.json
iindex 7a4ee0a9..bbdd1f69 100644
---- a/manifests/capabilities/space.build.write.json
++++ b/manifests/capabilities/space.build.write.json
@@@ -4,7 +4,7 @@
"owner": "space",
"status": "active",
"visibility": "first-party",
-- "description": "Write the files of one of a person's own spaces, as their agent (OpenVibe.Actor) builds it (plan 2026-10-22 §Z stage Z1). PUT /api/v1/spaces/:id/files replaces the space's files with the ones in the body. Every write is audited like Space's own editor writes are, and the space's own limits (files, bytes) are the same ones.",
++ "description": "Write the files of one of a person's own spaces, as their agent (OpenVibe.Actor) builds it (plan 2026-10-22 §Z stage Z1). PUT /api/v1/builder/spaces/:id/files replaces the space's files with the ones in the body. Every write is audited like Space's own editor writes are, and the space's own limits (files, bytes) are the same ones.",
"permissions": [
"spaces:write"
],
@@@ -14,7 +14,7 @@
"quotaClass": "standard",
"events": [],
"implementedBy": [
-- "PUT /api/v1/spaces/:id/files"
++ "PUT /api/v1/builder/spaces/:id/files"
],
"inputSchema": "space.build-files@1",
"outputSchema": "space.build-files@1"
ddiff --git a/package.json b/package.json
iindex dcb9a0a2..d7ca4cd1 100644
---- a/package.json
++++ b/package.json
@@@ -1,6 +1,6 @@
{
"name": "openvibe-contracts",
-- "version": "0.323.0",
++ "version": "0.324.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",