openvibers/openvibe.contracts Commits
Space's builder as the person's one agent: the builder API's contracts (0.321.0) (#331)
Changes
@@@ -1,5 +1,11 @@# Changelog++## 0.321.0 — 2026-11-07++++- Space's builder becomes a task of the person's one agent (plan 2026-10-22 §Z, stage Z1). Add the contracts of Space's builder API: `space.build-space@1` (one of a person's own spaces: its id, slug, name, description, whether it is published and where, and when it changed), `space.build-list@1` (`{ spaces }` or `{ space }`), `space.build-files@1` (the space's files, each a path and its whole content), `space.build-create@1` (the body of a request for a new space), `space.build-preview@1` (where the space can be seen now, its file paths, and whether it is live) and `space.build-publish@1` (`pending`, `published` or `declined`, with the request the person answers in the Dock).++- Add the capabilities `space.build.read` (list and read the person's own spaces and their files), `space.build.create` (make a new space), `space.build.write` (write the files of one of them) and `space.build.publish` (ask to publish; the person answers before anything goes live). A first-party service names the person in `X-OV-Subject`, and only that person's own spaces are in reach.++- Additive: nothing that exists today changes shape.++## 0.320.0 — 2026-11-07- `frame.menu-card@1` items gain an optional `image`: `src` (https on the publishing site's own origin or an `openvibe.*` host, at most 400 characters), optional `w` and `h` (whole pixels, 16–1920) and an optional `alt` of at most 120 characters. Network keeps an image whose `src` passes the same host rule as the item's `url`, drops one from anywhere else, and passes it through in `GET /api/frame` so the Frame menu and Network's `/my` can draw a thumbnail.@@@ -7767,6 +7767,60 @@"compatibility": "backward","status": "active"},++ {++ "id": "space.build-space",++ "version": "1.0.0",++ "owner": "space",++ "schema": "space/build-space.v1.json",++ "visibility": "first-party",++ "compatibility": "backward",++ "status": "active"++ },++ {++ "id": "space.build-list",++ "version": "1.0.0",++ "owner": "space",++ "schema": "space/build-list.v1.json",++ "visibility": "first-party",++ "compatibility": "backward",++ "status": "active"++ },++ {++ "id": "space.build-files",++ "version": "1.0.0",++ "owner": "space",++ "schema": "space/build-files.v1.json",++ "visibility": "first-party",++ "compatibility": "backward",++ "status": "active"++ },++ {++ "id": "space.build-create",++ "version": "1.0.0",++ "owner": "space",++ "schema": "space/build-create.v1.json",++ "visibility": "first-party",++ "compatibility": "backward",++ "status": "active"++ },++ {++ "id": "space.build-preview",++ "version": "1.0.0",++ "owner": "space",++ "schema": "space/build-preview.v1.json",++ "visibility": "first-party",++ "compatibility": "backward",++ "status": "active"++ },++ {++ "id": "space.build-publish",++ "version": "1.0.0",++ "owner": "space",++ "schema": "space/build-publish.v1.json",++ "visibility": "first-party",++ "compatibility": "backward",++ "status": "active"++ },{"id": "space.deploy-create-request","version": "1.0.0",nnew file mode 100644@@@ -0,0 +1,20 @@++{++ "$schema": "https://json-schema.org/draft/2020-12/schema",++ "$id": "https://openvibe.network/contracts/space/build-create.v1.json",++ "title": "SpaceBuildCreate",++ "description": "space.build-create@1: the body of POST /api/v1/spaces, the agent asking Space for a new space of its own (OpenVibe.Space's builder API; plan 2026-10-22 §Z stage Z1). It answers space.build-list@1 ({ space }). The name and the description are what the space shows; the space is made from Space's blank template and the agent fills its files.",++ "type": "object",++ "additionalProperties": false,++ "properties": {++ "name": {++ "type": "string",++ "maxLength": 40,++ "description": "The space's name."++ },++ "description": {++ "type": "string",++ "maxLength": 400,++ "description": "What the space does, in a line."++ }++ }++}nnew file mode 100644@@@ -0,0 +1,38 @@++{++ "$schema": "https://json-schema.org/draft/2020-12/schema",++ "$id": "https://openvibe.network/contracts/space/build-files.v1.json",++ "title": "SpaceBuildFiles",++ "description": "space.build-files@1: the source files of one of a person's spaces, as their agent sees them (OpenVibe.Space's builder API; plan 2026-10-22 §Z stage Z1). GET /api/v1/spaces/:id/files answers { files }: every file of the space, its path and its whole content. The same shape is the body of PUT /api/v1/spaces/:id/files (space.build-write@1): the files to write, which replace the space's files as a whole.",++ "type": "object",++ "additionalProperties": false,++ "required": [++ "files"++ ],++ "properties": {++ "files": {++ "type": "array",++ "maxItems": 20,++ "items": {++ "type": "object",++ "additionalProperties": false,++ "required": [++ "path",++ "content"++ ],++ "properties": {++ "path": {++ "type": "string",++ "maxLength": 80,++ "pattern": "^[A-Za-z0-9][A-Za-z0-9._-]*(/[A-Za-z0-9][A-Za-z0-9._-]*){0,3}$",++ "description": "The file's path inside the space: letters, digits, \".\", \"-\", \"_\", up to four folders."++ },++ "content": {++ "type": "string",++ "maxLength": 200000,++ "description": "The file's whole content."++ }++ }++ }++ }++ }++}nnew file mode 100644@@@ -0,0 +1,35 @@++{++ "$schema": "https://json-schema.org/draft/2020-12/schema",++ "$id": "https://openvibe.network/contracts/space/build-list.v1.json",++ "title": "SpaceBuildList",++ "description": "space.build-list@1: the spaces of one person, as their agent sees them (OpenVibe.Space's builder API; plan 2026-10-22 §Z stage Z1). GET /api/v1/spaces answers { spaces }; GET /api/v1/spaces/:id answers { space }.",++ "anyOf": [++ {++ "type": "object",++ "required": [++ "spaces"++ ],++ "additionalProperties": false,++ "properties": {++ "spaces": {++ "type": "array",++ "items": {++ "$ref": "build-space.v1.json"++ }++ }++ }++ },++ {++ "type": "object",++ "required": [++ "space"++ ],++ "additionalProperties": false,++ "properties": {++ "space": {++ "$ref": "build-space.v1.json"++ }++ }++ }++ ]++}nnew file mode 100644@@@ -0,0 +1,31 @@++{++ "$schema": "https://json-schema.org/draft/2020-12/schema",++ "$id": "https://openvibe.network/contracts/space/build-preview.v1.json",++ "title": "SpaceBuildPreview",++ "description": "space.build-preview@1: where a person's space can be seen right now, as their agent sees it (OpenVibe.Space's builder API; plan 2026-10-22 §Z stage Z1). GET /api/v1/spaces/:id/preview answers { url, files, published }: the address to open (the editor with its live preview while the space is a draft, its own address once it is published), the paths of the files it is made of, and whether it is live.",++ "type": "object",++ "additionalProperties": false,++ "required": [++ "url",++ "files",++ "published"++ ],++ "properties": {++ "url": {++ "type": "string",++ "format": "uri",++ "description": "Where the space can be seen now."++ },++ "files": {++ "type": "array",++ "items": {++ "type": "string",++ "maxLength": 80++ },++ "description": "The paths of the files the space is made of."++ },++ "published": {++ "type": "boolean"++ }++ }++}nnew file mode 100644@@@ -0,0 +1,45 @@++{++ "$schema": "https://json-schema.org/draft/2020-12/schema",++ "$id": "https://openvibe.network/contracts/space/build-publish.v1.json",++ "title": "SpaceBuildPublish",++ "description": "space.build-publish@1: what happened when a person's agent asked to publish one of their spaces (OpenVibe.Space's builder API; plan 2026-10-22 §Z stage Z1). POST /api/v1/spaces/:id/publish asks to publish and answers { state: 'pending' } with the approval the person answers in the Dock; it never publishes without that answer. When the person approves, Space publishes and the step is { state: 'published', url }; when they decline, { state: 'declined' }.",++ "type": "object",++ "additionalProperties": false,++ "required": [++ "state"++ ],++ "properties": {++ "state": {++ "enum": [++ "pending",++ "published",++ "declined"++ ],++ "description": "pending: the person must answer first. published: it is live at url. declined: the person said no."++ },++ "url": {++ "type": [++ "string",++ "null"++ ],++ "format": "uri",++ "description": "Where it lives once it is published."++ },++ "approval_id": {++ "type": [++ "string",++ "null"++ ],++ "maxLength": 80,++ "description": "The request the person answers in the Dock (its id)."++ },++ "reason": {++ "type": [++ "string",++ "null"++ ],++ "maxLength": 240,++ "description": "Why it was refused, in one line a person can act on."++ }++ }++}nnew file mode 100644@@@ -0,0 +1,49 @@++{++ "$schema": "https://json-schema.org/draft/2020-12/schema",++ "$id": "https://openvibe.network/contracts/space/build-space.v1.json",++ "title": "SpaceBuildSpace",++ "description": "space.build-space@1: one of a person's own spaces, as their agent sees it while it builds (OpenVibe.Space's builder API; plan 2026-10-22 §Z stage Z1). The id, the slug it publishes under, its name and description, whether it is published and where, and when it last changed. Nothing about anyone else's space is ever in this shape.",++ "type": "object",++ "additionalProperties": false,++ "required": [++ "id",++ "slug",++ "name",++ "published",++ "url"++ ],++ "properties": {++ "id": {++ "type": "string",++ "pattern": "^spc_[0-9A-HJKMNP-TV-Z]{26}$",++ "description": "The space's id."++ },++ "slug": {++ "type": "string",++ "pattern": "^[a-z0-9](?:[a-z0-9]|-(?=[a-z0-9])){2,39}$",++ "description": "The name it publishes under (<slug>.openvibe.website)."++ },++ "name": {++ "type": "string",++ "maxLength": 40++ },++ "description": {++ "type": "string",++ "maxLength": 400++ },++ "published": {++ "type": "boolean",++ "description": "True while it is live at its own address."++ },++ "url": {++ "type": "string",++ "format": "uri",++ "description": "Where it lives: its own address once published, the editor while it is a draft."++ },++ "updated_at": {++ "type": "string",++ "format": "date-time",++ "description": "When it last changed."++ }++ }++}nnew file mode 100644@@@ -0,0 +1,3 @@++{++ "name": "A name that is far longer than forty characters are allowed to be"++}nnew file mode 100644@@@ -0,0 +1,4 @@++{++ "name": "My Podcast",++ "description": "A place for my episodes."++}nnew file mode 100644@@@ -0,0 +1,5 @@++{++ "files": [++ { "path": "../secrets.txt", "content": "no" }++ ]++}nnew file mode 100644@@@ -0,0 +1,6 @@++{++ "files": [++ { "path": "index.html", "content": "<!doctype html><title>My Podcast</title>" },++ { "path": "style.css", "content": "body { font: 16px system-ui; }" }++ ]++}nnew file mode 100644@@@ -0,0 +1,4 @@++{++ "spaces": [],++ "other": 1++}nnew file mode 100644@@@ -0,0 +1,13 @@++{++ "spaces": [++ {++ "id": "spc_01JAD2C3D4E5F6G7H8J9K0MNPQ",++ "slug": "my-podcast",++ "name": "My Podcast",++ "description": "",++ "published": false,++ "url": "https://openvibe.space/spaces/my-podcast/edit",++ "updated_at": "2026-11-07T09:30:00.000Z"++ }++ ]++}nnew file mode 100644@@@ -0,0 +1,9 @@++{++ "space": {++ "id": "spc_01JAD2C3D4E5F6G7H8J9K0MNPQ",++ "slug": "my-podcast",++ "name": "My Podcast",++ "published": false,++ "url": "https://openvibe.space/spaces/my-podcast/edit"++ }++}nnew file mode 100644@@@ -0,0 +1,5 @@++{++ "url": "https://openvibe.space/spaces/my-podcast/edit",++ "files": [],++ "published": "yes"++}nnew file mode 100644@@@ -0,0 +1,5 @@++{++ "url": "https://openvibe.space/spaces/my-podcast/edit",++ "files": ["index.html", "style.css"],++ "published": false++}nnew file mode 100644@@@ -0,0 +1,3 @@++{++ "state": "maybe"++}nnew file mode 100644@@@ -0,0 +1,6 @@++{++ "state": "pending",++ "url": null,++ "approval_id": "apr_01JAD2C3D4E5F6G7H8J9K0MNPQ",++ "reason": null++}nnew file mode 100644@@@ -0,0 +1,7 @@++{++ "id": "space-1",++ "slug": "my-podcast",++ "name": "My Podcast",++ "published": false,++ "url": "https://my-podcast.openvibe.website"++}nnew file mode 100644@@@ -0,0 +1,9 @@++{++ "id": "spc_01JAD2C3D4E5F6G7H8J9K0MNPQ",++ "slug": "my-podcast",++ "name": "My Podcast",++ "description": "A place for my episodes.",++ "published": true,++ "url": "https://my-podcast.openvibe.website",++ "updated_at": "2026-11-07T09:30:00.000Z"++}@@@ -87331,6 +87331,254 @@]}},++ "space.build-space": {++ "version": "1.0.0",++ "owner": "space",++ "status": "active",++ "schema": {++ "$schema": "https://json-schema.org/draft/2020-12/schema",++ "$id": "https://openvibe.network/contracts/space/build-space.v1.json",++ "title": "SpaceBuildSpace",++ "description": "space.build-space@1: one of a person's own spaces, as their agent sees it while it builds (OpenVibe.Space's builder API; plan 2026-10-22 §Z stage Z1). The id, the slug it publishes under, its name and description, whether it is published and where, and when it last changed. Nothing about anyone else's space is ever in this shape.",++ "type": "object",++ "additionalProperties": false,++ "required": [++ "id",++ "slug",++ "name",++ "published",++ "url"++ ],++ "properties": {++ "id": {++ "type": "string",++ "pattern": "^spc_[0-9A-HJKMNP-TV-Z]{26}$",++ "description": "The space's id."++ },++ "slug": {++ "type": "string",++ "pattern": "^[a-z0-9](?:[a-z0-9]|-(?=[a-z0-9])){2,39}$",++ "description": "The name it publishes under (<slug>.openvibe.website)."++ },++ "name": {++ "type": "string",++ "maxLength": 40++ },++ "description": {++ "type": "string",++ "maxLength": 400++ },++ "published": {++ "type": "boolean",++ "description": "True while it is live at its own address."++ },++ "url": {++ "type": "string",++ "format": "uri",++ "description": "Where it lives: its own address once published, the editor while it is a draft."++ },++ "updated_at": {++ "type": "string",++ "format": "date-time",++ "description": "When it last changed."++ }++ }++ }++ },++ "space.build-list": {++ "version": "1.0.0",++ "owner": "space",++ "status": "active",++ "schema": {++ "$schema": "https://json-schema.org/draft/2020-12/schema",++ "$id": "https://openvibe.network/contracts/space/build-list.v1.json",++ "title": "SpaceBuildList",++ "description": "space.build-list@1: the spaces of one person, as their agent sees them (OpenVibe.Space's builder API; plan 2026-10-22 §Z stage Z1). GET /api/v1/spaces answers { spaces }; GET /api/v1/spaces/:id answers { space }.",++ "anyOf": [++ {++ "type": "object",++ "required": [++ "spaces"++ ],++ "additionalProperties": false,++ "properties": {++ "spaces": {++ "type": "array",++ "items": {++ "$ref": "build-space.v1.json"++ }++ }++ }++ },++ {++ "type": "object",++ "required": [++ "space"++ ],++ "additionalProperties": false,++ "properties": {++ "space": {++ "$ref": "build-space.v1.json"++ }++ }++ }++ ]++ }++ },++ "space.build-files": {++ "version": "1.0.0",++ "owner": "space",++ "status": "active",++ "schema": {++ "$schema": "https://json-schema.org/draft/2020-12/schema",++ "$id": "https://openvibe.network/contracts/space/build-files.v1.json",++ "title": "SpaceBuildFiles",++ "description": "space.build-files@1: the source files of one of a person's spaces, as their agent sees them (OpenVibe.Space's builder API; plan 2026-10-22 §Z stage Z1). GET /api/v1/spaces/:id/files answers { files }: every file of the space, its path and its whole content. The same shape is the body of PUT /api/v1/spaces/:id/files (space.build-write@1): the files to write, which replace the space's files as a whole.",++ "type": "object",++ "additionalProperties": false,++ "required": [++ "files"++ ],++ "properties": {++ "files": {++ "type": "array",++ "maxItems": 20,++ "items": {++ "type": "object",++ "additionalProperties": false,++ "required": [++ "path",++ "content"++ ],++ "properties": {++ "path": {++ "type": "string",++ "maxLength": 80,++ "pattern": "^[A-Za-z0-9][A-Za-z0-9._-]*(/[A-Za-z0-9][A-Za-z0-9._-]*){0,3}$",++ "description": "The file's path inside the space: letters, digits, \".\", \"-\", \"_\", up to four folders."++ },++ "content": {++ "type": "string",++ "maxLength": 200000,++ "description": "The file's whole content."++ }++ }++ }++ }++ }++ }++ },++ "space.build-create": {++ "version": "1.0.0",++ "owner": "space",++ "status": "active",++ "schema": {++ "$schema": "https://json-schema.org/draft/2020-12/schema",++ "$id": "https://openvibe.network/contracts/space/build-create.v1.json",++ "title": "SpaceBuildCreate",++ "description": "space.build-create@1: the body of POST /api/v1/spaces, the agent asking Space for a new space of its own (OpenVibe.Space's builder API; plan 2026-10-22 §Z stage Z1). It answers space.build-list@1 ({ space }). The name and the description are what the space shows; the space is made from Space's blank template and the agent fills its files.",++ "type": "object",++ "additionalProperties": false,++ "properties": {++ "name": {++ "type": "string",++ "maxLength": 40,++ "description": "The space's name."++ },++ "description": {++ "type": "string",++ "maxLength": 400,++ "description": "What the space does, in a line."++ }++ }++ }++ },++ "space.build-preview": {++ "version": "1.0.0",++ "owner": "space",++ "status": "active",++ "schema": {++ "$schema": "https://json-schema.org/draft/2020-12/schema",++ "$id": "https://openvibe.network/contracts/space/build-preview.v1.json",++ "title": "SpaceBuildPreview",++ "description": "space.build-preview@1: where a person's space can be seen right now, as their agent sees it (OpenVibe.Space's builder API; plan 2026-10-22 §Z stage Z1). GET /api/v1/spaces/:id/preview answers { url, files, published }: the address to open (the editor with its live preview while the space is a draft, its own address once it is published), the paths of the files it is made of, and whether it is live.",++ "type": "object",++ "additionalProperties": false,++ "required": [++ "url",++ "files",++ "published"++ ],++ "properties": {++ "url": {++ "type": "string",++ "format": "uri",++ "description": "Where the space can be seen now."++ },++ "files": {++ "type": "array",++ "items": {++ "type": "string",++ "maxLength": 80++ },++ "description": "The paths of the files the space is made of."++ },++ "published": {++ "type": "boolean"++ }++ }++ }++ },++ "space.build-publish": {++ "version": "1.0.0",++ "owner": "space",++ "status": "active",++ "schema": {++ "$schema": "https://json-schema.org/draft/2020-12/schema",++ "$id": "https://openvibe.network/contracts/space/build-publish.v1.json",++ "title": "SpaceBuildPublish",++ "description": "space.build-publish@1: what happened when a person's agent asked to publish one of their spaces (OpenVibe.Space's builder API; plan 2026-10-22 §Z stage Z1). POST /api/v1/spaces/:id/publish asks to publish and answers { state: 'pending' } with the approval the person answers in the Dock; it never publishes without that answer. When the person approves, Space publishes and the step is { state: 'published', url }; when they decline, { state: 'declined' }.",++ "type": "object",++ "additionalProperties": false,++ "required": [++ "state"++ ],++ "properties": {++ "state": {++ "enum": [++ "pending",++ "published",++ "declined"++ ],++ "description": "pending: the person must answer first. published: it is live at url. declined: the person said no."++ },++ "url": {++ "type": [++ "string",++ "null"++ ],++ "format": "uri",++ "description": "Where it lives once it is published."++ },++ "approval_id": {++ "type": [++ "string",++ "null"++ ],++ "maxLength": 80,++ "description": "The request the person answers in the Dock (its id)."++ },++ "reason": {++ "type": [++ "string",++ "null"++ ],++ "maxLength": 240,++ "description": "Why it was refused, in one line a person can act on."++ }++ }++ }++ },"space.deploy-create-request": {"version": "1.0.0","owner": "space",@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Actor API",-- "version": "0.320.0",-- "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.320.0): each operation lists the capabilities it performs; a token for 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.321.0",++ "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for 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"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.AI API",-- "version": "0.320.0",-- "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.320.0): each operation lists the capabilities it performs; a token for 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.321.0",++ "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for 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"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Bench API",-- "version": "0.320.0",-- "description": "Routes of OpenVibe.Bench as the OpenVibe contracts describe them (openvibe-contracts 0.320.0): each operation lists the capabilities it performs; a token for 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.321.0",++ "description": "Routes of OpenVibe.Bench as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for 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"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Billing API",-- "version": "0.320.0",-- "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.320.0): each operation lists the capabilities it performs; a token for 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.321.0",++ "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for 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"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Blog API",-- "version": "0.320.0",-- "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.320.0): each operation lists the capabilities it performs; a token for 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.321.0",++ "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for 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"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Bot API",-- "version": "0.320.0",-- "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.320.0): each operation lists the capabilities it performs; a token for 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.321.0",++ "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for 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"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Chat API",-- "version": "0.320.0",-- "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.320.0): each operation lists the capabilities it performs; a token for 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.321.0",++ "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for 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"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Codes API",-- "version": "0.320.0",-- "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.320.0): each operation lists the capabilities it performs; a token for 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.321.0",++ "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for 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"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Community API",-- "version": "0.320.0",-- "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.320.0): each operation lists the capabilities it performs; a token for 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.321.0",++ "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for 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"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe Connect API",-- "version": "0.320.0",-- "description": "Routes of OpenVibe Connect as the OpenVibe contracts describe them (openvibe-contracts 0.320.0): each operation lists the capabilities it performs; a token for 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.321.0",++ "description": "Routes of OpenVibe Connect as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for 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"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Coupons API",-- "version": "0.320.0",-- "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.320.0): each operation lists the capabilities it performs; a token for 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.321.0",++ "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for 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"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Deals API",-- "version": "0.320.0",-- "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.320.0): each operation lists the capabilities it performs; a token for 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.321.0",++ "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for 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"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Design API",-- "version": "0.320.0",-- "description": "Routes of OpenVibe.Design as the OpenVibe contracts describe them (openvibe-contracts 0.320.0): each operation lists the capabilities it performs; a token for 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.321.0",++ "description": "Routes of OpenVibe.Design as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for 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"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Domains API",-- "version": "0.320.0",-- "description": "Routes of OpenVibe.Domains as the OpenVibe contracts describe them (openvibe-contracts 0.320.0): each operation lists the capabilities it performs; a token for 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.321.0",++ "description": "Routes of OpenVibe.Domains as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for 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"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Events API",-- "version": "0.320.0",-- "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.320.0): each operation lists the capabilities it performs; a token for 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.321.0",++ "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for 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"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Food API",-- "version": "0.320.0",-- "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.320.0): each operation lists the capabilities it performs; a token for 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.321.0",++ "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for 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"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Games API",-- "version": "0.320.0",-- "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.320.0): each operation lists the capabilities it performs; a token for 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.321.0",++ "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for 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"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Host API",-- "version": "0.320.0",-- "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.320.0): each operation lists the capabilities it performs; a token for 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.321.0",++ "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for 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"@@@ -236,8 +236,8 @@"service": "space","name": "OpenVibe.Space","origin": "https://openvibe.space",-- "operations": 37,-- "capabilities": 6++ "operations": 44,++ "capabilities": 10},{"service": "tips",@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Inventory API",-- "version": "0.320.0",-- "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.320.0): each operation lists the capabilities it performs; a token for 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.321.0",++ "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for 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"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Live API",-- "version": "0.320.0",-- "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.320.0): each operation lists the capabilities it performs; a token for 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.321.0",++ "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for 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"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.MediaHub API",-- "version": "0.320.0",-- "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.320.0): each operation lists the capabilities it performs; a token for 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.321.0",++ "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for 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"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Media API",-- "version": "0.320.0",-- "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.320.0): each operation lists the capabilities it performs; a token for 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.321.0",++ "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for 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"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Network API",-- "version": "0.320.0",-- "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.320.0): each operation lists the capabilities it performs; a token for 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.321.0",++ "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for 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"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.News API",-- "version": "0.320.0",-- "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.320.0): each operation lists the capabilities it performs; a token for 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.321.0",++ "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for 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"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenRestream API",-- "version": "0.320.0",-- "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.320.0): each operation lists the capabilities it performs; a token for 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.321.0",++ "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for 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"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Play API",-- "version": "0.320.0",-- "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.320.0): each operation lists the capabilities it performs; a token for 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.321.0",++ "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for 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"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Quest API",-- "version": "0.320.0",-- "description": "Routes of OpenVibe.Quest as the OpenVibe contracts describe them (openvibe-contracts 0.320.0): each operation lists the capabilities it performs; a token for 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.321.0",++ "description": "Routes of OpenVibe.Quest as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for 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"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Report API",-- "version": "0.320.0",-- "description": "Routes of OpenVibe.Report as the OpenVibe contracts describe them (openvibe-contracts 0.320.0): each operation lists the capabilities it performs; a token for 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.321.0",++ "description": "Routes of OpenVibe.Report as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for 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"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Reviews API",-- "version": "0.320.0",-- "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.320.0): each operation lists the capabilities it performs; a token for 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.321.0",++ "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for 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"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Run API",-- "version": "0.320.0",-- "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.320.0): each operation lists the capabilities it performs; a token for 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.321.0",++ "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for 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"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Search API",-- "version": "0.320.0",-- "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.320.0): each operation lists the capabilities it performs; a token for 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.321.0",++ "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for 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"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Services API",-- "version": "0.320.0",-- "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.320.0): each operation lists the capabilities it performs; a token for 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.321.0",++ "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for 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"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Sources API",-- "version": "0.320.0",-- "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.320.0): each operation lists the capabilities it performs; a token for 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.321.0",++ "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for 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"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Space API",-- "version": "0.320.0",-- "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.320.0): each operation lists the capabilities it performs; a token for 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.321.0",++ "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for 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"@@@ -2345,6 +2345,394 @@}}}++ },++ "/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/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.build"++ ],++ "x-openvibe-capabilities": [++ "space.build.read"++ ],++ "x-openvibe-visibility": [++ "first-party"++ ],++ "x-openvibe-quota-class": "standard",++ "security": [++ {++ "openvibeToken": [++ "space.build.read"++ ]++ }++ ],++ "responses": {++ "2XX": {++ "description": "Success",++ "content": {++ "application/json": {++ "schema": {++ "$ref": "#/components/schemas/space.build-list.v1"++ }++ }++ }++ },++ "default": {++ "description": "An error (RFC 9457 problem details)",++ "content": {++ "application/problem+json": {++ "schema": {++ "$ref": "#/components/schemas/errors.problem.v1"++ }++ }++ }++ }++ }++ },++ "post": {++ "operationId": "post_api_v1_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.",++ "tags": [++ "space.build"++ ],++ "x-openvibe-capabilities": [++ "space.build.create"++ ],++ "x-openvibe-visibility": [++ "first-party"++ ],++ "x-openvibe-quota-class": "standard",++ "security": [++ {++ "openvibeToken": [++ "space.build.create"++ ]++ }++ ],++ "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.build-list.v1"++ }++ }++ }++ },++ "default": {++ "description": "An error (RFC 9457 problem details)",++ "content": {++ "application/problem+json": {++ "schema": {++ "$ref": "#/components/schemas/errors.problem.v1"++ }++ }++ }++ }++ }++ }++ },++ "/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/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.build"++ ],++ "x-openvibe-capabilities": [++ "space.build.read"++ ],++ "x-openvibe-visibility": [++ "first-party"++ ],++ "x-openvibe-quota-class": "standard",++ "security": [++ {++ "openvibeToken": [++ "space.build.read"++ ]++ }++ ],++ "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"++ }++ }++ }++ },++ "default": {++ "description": "An error (RFC 9457 problem details)",++ "content": {++ "application/problem+json": {++ "schema": {++ "$ref": "#/components/schemas/errors.problem.v1"++ }++ }++ }++ }++ }++ }++ },++ "/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/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.build"++ ],++ "x-openvibe-capabilities": [++ "space.build.read"++ ],++ "x-openvibe-visibility": [++ "first-party"++ ],++ "x-openvibe-quota-class": "standard",++ "security": [++ {++ "openvibeToken": [++ "space.build.read"++ ]++ }++ ],++ "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"++ }++ }++ }++ },++ "default": {++ "description": "An error (RFC 9457 problem details)",++ "content": {++ "application/problem+json": {++ "schema": {++ "$ref": "#/components/schemas/errors.problem.v1"++ }++ }++ }++ }++ }++ },++ "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.",++ "tags": [++ "space.build"++ ],++ "x-openvibe-capabilities": [++ "space.build.write"++ ],++ "x-openvibe-visibility": [++ "first-party"++ ],++ "x-openvibe-quota-class": "standard",++ "security": [++ {++ "openvibeToken": [++ "space.build.write"++ ]++ }++ ],++ "requestBody": {++ "required": false,++ "content": {++ "application/json": {++ "schema": {++ "$ref": "#/components/schemas/space.build-files.v1"++ }++ }++ }++ },++ "parameters": [++ {++ "name": "id",++ "in": "path",++ "required": true,++ "schema": {++ "type": "string"++ }++ }++ ],++ "responses": {++ "2XX": {++ "description": "Success",++ "content": {++ "application/json": {++ "schema": {++ "$ref": "#/components/schemas/space.build-files.v1"++ }++ }++ }++ },++ "default": {++ "description": "An error (RFC 9457 problem details)",++ "content": {++ "application/problem+json": {++ "schema": {++ "$ref": "#/components/schemas/errors.problem.v1"++ }++ }++ }++ }++ }++ }++ },++ "/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/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.build"++ ],++ "x-openvibe-capabilities": [++ "space.build.read"++ ],++ "x-openvibe-visibility": [++ "first-party"++ ],++ "x-openvibe-quota-class": "standard",++ "security": [++ {++ "openvibeToken": [++ "space.build.read"++ ]++ }++ ],++ "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"++ }++ }++ }++ },++ "default": {++ "description": "An error (RFC 9457 problem details)",++ "content": {++ "application/problem+json": {++ "schema": {++ "$ref": "#/components/schemas/errors.problem.v1"++ }++ }++ }++ }++ }++ }++ },++ "/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.",++ "tags": [++ "space.build"++ ],++ "x-openvibe-capabilities": [++ "space.build.publish"++ ],++ "x-openvibe-visibility": [++ "first-party"++ ],++ "x-openvibe-quota-class": "standard",++ "security": [++ {++ "openvibeToken": [++ "space.build.publish"++ ]++ }++ ],++ "parameters": [++ {++ "name": "id",++ "in": "path",++ "required": true,++ "schema": {++ "type": "string"++ }++ }++ ],++ "responses": {++ "2XX": {++ "description": "Success",++ "content": {++ "application/json": {++ "schema": {++ "$ref": "#/components/schemas/space.build-publish.v1"++ }++ }++ }++ },++ "default": {++ "description": "An error (RFC 9457 problem details)",++ "content": {++ "application/problem+json": {++ "schema": {++ "$ref": "#/components/schemas/errors.problem.v1"++ }++ }++ }++ }++ }++ }}},"components": {@@@ -2814,6 +3202,183 @@}]},++ "space.build-create.v1": {++ "title": "SpaceBuildCreate",++ "description": "space.build-create@1: the body of POST /api/v1/spaces, the agent asking Space for a new space of its own (OpenVibe.Space's builder API; plan 2026-10-22 §Z stage Z1). It answers space.build-list@1 ({ space }). The name and the description are what the space shows; the space is made from Space's blank template and the agent fills its files.",++ "type": "object",++ "additionalProperties": false,++ "properties": {++ "name": {++ "type": "string",++ "maxLength": 40,++ "description": "The space's name."++ },++ "description": {++ "type": "string",++ "maxLength": 400,++ "description": "What the space does, in a line."++ }++ }++ },++ "space.build-files.v1": {++ "title": "SpaceBuildFiles",++ "description": "space.build-files@1: the source files of one of a person's spaces, as their agent sees them (OpenVibe.Space's builder API; plan 2026-10-22 §Z stage Z1). GET /api/v1/spaces/:id/files answers { files }: every file of the space, its path and its whole content. The same shape is the body of PUT /api/v1/spaces/:id/files (space.build-write@1): the files to write, which replace the space's files as a whole.",++ "type": "object",++ "additionalProperties": false,++ "required": [++ "files"++ ],++ "properties": {++ "files": {++ "type": "array",++ "maxItems": 20,++ "items": {++ "type": "object",++ "additionalProperties": false,++ "required": [++ "path",++ "content"++ ],++ "properties": {++ "path": {++ "type": "string",++ "maxLength": 80,++ "pattern": "^[A-Za-z0-9][A-Za-z0-9._-]*(/[A-Za-z0-9][A-Za-z0-9._-]*){0,3}$",++ "description": "The file's path inside the space: letters, digits, \".\", \"-\", \"_\", up to four folders."++ },++ "content": {++ "type": "string",++ "maxLength": 200000,++ "description": "The file's whole content."++ }++ }++ }++ }++ }++ },++ "space.build-list.v1": {++ "title": "SpaceBuildList",++ "description": "space.build-list@1: the spaces of one person, as their agent sees them (OpenVibe.Space's builder API; plan 2026-10-22 §Z stage Z1). GET /api/v1/spaces answers { spaces }; GET /api/v1/spaces/:id answers { space }.",++ "anyOf": [++ {++ "type": "object",++ "required": [++ "spaces"++ ],++ "additionalProperties": false,++ "properties": {++ "spaces": {++ "type": "array",++ "items": {++ "$ref": "#/components/schemas/space.build-space.v1"++ }++ }++ }++ },++ {++ "type": "object",++ "required": [++ "space"++ ],++ "additionalProperties": false,++ "properties": {++ "space": {++ "$ref": "#/components/schemas/space.build-space.v1"++ }++ }++ }++ ]++ },++ "space.build-publish.v1": {++ "title": "SpaceBuildPublish",++ "description": "space.build-publish@1: what happened when a person's agent asked to publish one of their spaces (OpenVibe.Space's builder API; plan 2026-10-22 §Z stage Z1). POST /api/v1/spaces/:id/publish asks to publish and answers { state: 'pending' } with the approval the person answers in the Dock; it never publishes without that answer. When the person approves, Space publishes and the step is { state: 'published', url }; when they decline, { state: 'declined' }.",++ "type": "object",++ "additionalProperties": false,++ "required": [++ "state"++ ],++ "properties": {++ "state": {++ "enum": [++ "pending",++ "published",++ "declined"++ ],++ "description": "pending: the person must answer first. published: it is live at url. declined: the person said no."++ },++ "url": {++ "type": [++ "string",++ "null"++ ],++ "format": "uri",++ "description": "Where it lives once it is published."++ },++ "approval_id": {++ "type": [++ "string",++ "null"++ ],++ "maxLength": 80,++ "description": "The request the person answers in the Dock (its id)."++ },++ "reason": {++ "type": [++ "string",++ "null"++ ],++ "maxLength": 240,++ "description": "Why it was refused, in one line a person can act on."++ }++ }++ },++ "space.build-space.v1": {++ "title": "SpaceBuildSpace",++ "description": "space.build-space@1: one of a person's own spaces, as their agent sees it while it builds (OpenVibe.Space's builder API; plan 2026-10-22 §Z stage Z1). The id, the slug it publishes under, its name and description, whether it is published and where, and when it last changed. Nothing about anyone else's space is ever in this shape.",++ "type": "object",++ "additionalProperties": false,++ "required": [++ "id",++ "slug",++ "name",++ "published",++ "url"++ ],++ "properties": {++ "id": {++ "type": "string",++ "pattern": "^spc_[0-9A-HJKMNP-TV-Z]{26}$",++ "description": "The space's id."++ },++ "slug": {++ "type": "string",++ "pattern": "^[a-z0-9](?:[a-z0-9]|-(?=[a-z0-9])){2,39}$",++ "description": "The name it publishes under (<slug>.openvibe.website)."++ },++ "name": {++ "type": "string",++ "maxLength": 40++ },++ "description": {++ "type": "string",++ "maxLength": 400++ },++ "published": {++ "type": "boolean",++ "description": "True while it is live at its own address."++ },++ "url": {++ "type": "string",++ "format": "uri",++ "description": "Where it lives: its own address once published, the editor while it is a draft."++ },++ "updated_at": {++ "type": "string",++ "format": "date-time",++ "description": "When it last changed."++ }++ }++ },"space.deploy-create-request.v1": {"title": "SpaceDeployCreateRequest","description": "space.deploy-create-request@1: bodies of space.deploy.create on OpenVibe.Space (a deployer or above of the project; an app principal added as deployer can deploy from CI). POST /api/v1/sites/:id/deploys uploads a deploy: the raw body is a tar or tar.gz archive (Content-Type application/gzip, application/x-gzip, application/x-tar or application/octet-stream), or multipart/form-data with archive=<one archive> or files=<file>… (each part's filename is its path); optional fields activate=1, root=<subdirectory to deploy> and strip=folder (removes a shared first segment) also work as query parameters. It is validated (path traversal, links, special and hidden files, server-side code, file types, sizes and quotas) and never executed; a refusal is a problem whose extra carries the failed deploy_id and its log (413 upload.too_large, quota.storage; 422 validation codes; 429 quota.deploys_per_day; 403 site.taken_down; 503 upload.busy; 507 storage.host_full). POST /api/v1/deploys/:id/activate { expected_active? } and POST /api/v1/sites/:id/rollback { deploy_id?, expected_active? } switch the site's pointer in one step (rollback without deploy_id goes to the deploy active before; 409 deploy.not_ready, site.active_changed when expected_active is stale, deploy.no_previous). GET /api/v1/sites/:id/deploys, /deploys/:id and /deploys/:id/log take no body.",@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Tips API",-- "version": "0.320.0",-- "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.320.0): each operation lists the capabilities it performs; a token for 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.321.0",++ "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for 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"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Today API",-- "version": "0.320.0",-- "description": "Routes of OpenVibe.Today as the OpenVibe contracts describe them (openvibe-contracts 0.320.0): each operation lists the capabilities it performs; a token for 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.321.0",++ "description": "Routes of OpenVibe.Today as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for 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"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Tools API",-- "version": "0.320.0",-- "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.320.0): each operation lists the capabilities it performs; a token for 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.321.0",++ "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for 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"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Trade API",-- "version": "0.320.0",-- "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.320.0): each operation lists the capabilities it performs; a token for 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.321.0",++ "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for 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"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.VIP API",-- "version": "0.320.0",-- "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.320.0): each operation lists the capabilities it performs; a token for 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.321.0",++ "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for 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"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Vision API",-- "version": "0.320.0",-- "description": "Routes of OpenVibe.Vision as the OpenVibe contracts describe them (openvibe-contracts 0.320.0): each operation lists the capabilities it performs; a token for 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.321.0",++ "description": "Routes of OpenVibe.Vision as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for 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"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Watch API",-- "version": "0.320.0",-- "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.320.0): each operation lists the capabilities it performs; a token for 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.321.0",++ "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for 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"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Wiki API",-- "version": "0.320.0",-- "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.320.0): each operation lists the capabilities it performs; a token for 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.321.0",++ "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for 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"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Work API",-- "version": "0.320.0",-- "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.320.0): each operation lists the capabilities it performs; a token for 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.321.0",++ "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for 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"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Zone API",-- "version": "0.320.0",-- "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.320.0): each operation lists the capabilities it performs; a token for 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.321.0",++ "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for 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"@@@ -269471,6 +269471,2253 @@ export type FoodRecipeResult =];};++/** [email protected] (owner: space) */++/**++ * space.build-space@1: one of a person's own spaces, as their agent sees it while it builds (OpenVibe.Space's builder API; plan 2026-10-22 §Z stage Z1). The id, the slug it publishes under, its name and description, whether it is published and where, and when it last changed. Nothing about anyone else's space is ever in this shape.++ */++export interface SpaceBuildSpace {++ /**++ * The space's id.++ */++ id: string;++ /**++ * The name it publishes under (<slug>.openvibe.website).++ */++ slug: string;++ name: string;++ description?: string;++ /**++ * True while it is live at its own address.++ */++ published: boolean;++ /**++ * Where it lives: its own address once published, the editor while it is a draft.++ */++ url: string;++ /**++ * When it last changed.++ */++ updated_at?: string;++}++++/** [email protected] (owner: space) */++/**++ * space.build-list@1: the spaces of one person, as their agent sees them (OpenVibe.Space's builder API; plan 2026-10-22 §Z stage Z1). GET /api/v1/spaces answers { spaces }; GET /api/v1/spaces/:id answers { space }.++ */++export type SpaceBuildList =++ | {++ spaces: SpaceBuildSpace[];++ }++ | {++ space: SpaceBuildSpace;++ };++++/** [email protected] (owner: space) */++/**++ * space.build-files@1: the source files of one of a person's spaces, as their agent sees them (OpenVibe.Space's builder API; plan 2026-10-22 §Z stage Z1). GET /api/v1/spaces/:id/files answers { files }: every file of the space, its path and its whole content. The same shape is the body of PUT /api/v1/spaces/:id/files (space.build-write@1): the files to write, which replace the space's files as a whole.++ */++export interface SpaceBuildFiles {++ /**++ * @maxItems 20++ */++ files:++ | []++ | [++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ }++ ]++ | [++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ }++ ]++ | [++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ }++ ]++ | [++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ }++ ]++ | [++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ }++ ]++ | [++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ }++ ]++ | [++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ }++ ]++ | [++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ }++ ]++ | [++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ }++ ]++ | [++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ }++ ]++ | [++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ }++ ]++ | [++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ }++ ]++ | [++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ }++ ]++ | [++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ }++ ]++ | [++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ }++ ]++ | [++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ }++ ]++ | [++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ }++ ]++ | [++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ }++ ]++ | [++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ }++ ]++ | [++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ },++ {++ /**++ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.++ */++ path: string;++ /**++ * The file's whole content.++ */++ content: string;++ }++ ];++}++++/** [email protected] (owner: space) */++/**++ * space.build-create@1: the body of POST /api/v1/spaces, the agent asking Space for a new space of its own (OpenVibe.Space's builder API; plan 2026-10-22 §Z stage Z1). It answers space.build-list@1 ({ space }). The name and the description are what the space shows; the space is made from Space's blank template and the agent fills its files.++ */++export interface SpaceBuildCreate {++ /**++ * The space's name.++ */++ name?: string;++ /**++ * What the space does, in a line.++ */++ description?: string;++}++++/** [email protected] (owner: space) */++/**++ * space.build-preview@1: where a person's space can be seen right now, as their agent sees it (OpenVibe.Space's builder API; plan 2026-10-22 §Z stage Z1). GET /api/v1/spaces/:id/preview answers { url, files, published }: the address to open (the editor with its live preview while the space is a draft, its own address once it is published), the paths of the files it is made of, and whether it is live.++ */++export interface SpaceBuildPreview {++ /**++ * Where the space can be seen now.++ */++ url: string;++ /**++ * The paths of the files the space is made of.++ */++ files: string[];++ published: boolean;++}++++/** [email protected] (owner: space) */++/**++ * space.build-publish@1: what happened when a person's agent asked to publish one of their spaces (OpenVibe.Space's builder API; plan 2026-10-22 §Z stage Z1). POST /api/v1/spaces/:id/publish asks to publish and answers { state: 'pending' } with the approval the person answers in the Dock; it never publishes without that answer. When the person approves, Space publishes and the step is { state: 'published', url }; when they decline, { state: 'declined' }.++ */++export interface SpaceBuildPublish {++ /**++ * pending: the person must answer first. published: it is live at url. declined: the person said no.++ */++ state: "pending" | "published" | "declined";++ /**++ * Where it lives once it is published.++ */++ url?: string | null;++ /**++ * The request the person answers in the Dock (its id).++ */++ approval_id?: string | null;++ /**++ * Why it was refused, in one line a person can act on.++ */++ reason?: string | null;++}++/** [email protected] (owner: space) *//*** space.deploy-create-request@1: bodies of space.deploy.create on OpenVibe.Space (a deployer or above of the project; an app principal added as deployer can deploy from CI). POST /api/v1/sites/:id/deploys uploads a deploy: the raw body is a tar or tar.gz archive (Content-Type application/gzip, application/x-gzip, application/x-tar or application/octet-stream), or multipart/form-data with archive=<one archive> or files=<file>… (each part's filename is its path); optional fields activate=1, root=<subdirectory to deploy> and strip=folder (removes a shared first segment) also work as query parameters. It is validated (path traversal, links, special and hidden files, server-side code, file types, sizes and quotas) and never executed; a refusal is a problem whose extra carries the failed deploy_id and its log (413 upload.too_large, quota.storage; 422 validation codes; 429 quota.deploys_per_day; 403 site.taken_down; 503 upload.busy; 507 storage.host_full). POST /api/v1/deploys/:id/activate { expected_active? } and POST /api/v1/sites/:id/rollback { deploy_id?, expected_active? } switch the site's pointer in one step (rollback without deploy_id goes to the deploy active before; 409 deploy.not_ready, site.active_changed when expected_active is stale, deploy.no_previous). GET /api/v1/sites/:id/deploys, /deploys/:id and /deploys/:id/log take no body.nnew file mode 100644@@@ -0,0 +1,21 @@++{++ "id": "space.build.create",++ "version": "1.0",++ "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.",++ "permissions": [++ "spaces:write"++ ],++ "resourceConstraints": [++ "owner"++ ],++ "quotaClass": "standard",++ "events": [],++ "implementedBy": [++ "POST /api/v1/spaces"++ ],++ "inputSchema": "space.build-create@1",++ "outputSchema": "space.build-list@1"++}nnew file mode 100644@@@ -0,0 +1,22 @@++{++ "id": "space.build.publish",++ "version": "1.0",++ "owner": "space",++ "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.",++ "permissions": [++ "spaces:publish"++ ],++ "resourceConstraints": [++ "owner"++ ],++ "quotaClass": "standard",++ "events": [],++ "implementedBy": [++ "POST /api/v1/spaces/:id/publish"++ ],++ "inputSchema": "common.no-body@1",++ "outputSchema": "space.build-publish@1"++}nnew file mode 100644@@@ -0,0 +1,24 @@++{++ "id": "space.build.read",++ "version": "1.0",++ "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/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"++ ],++ "resourceConstraints": [++ "owner"++ ],++ "quotaClass": "standard",++ "events": [],++ "implementedBy": [++ "GET /api/v1/spaces",++ "GET /api/v1/spaces/:id",++ "GET /api/v1/spaces/:id/files",++ "GET /api/v1/spaces/:id/preview"++ ],++ "inputSchema": "common.no-body@1",++ "outputSchema": "space.build-list@1"++}nnew file mode 100644@@@ -0,0 +1,21 @@++{++ "id": "space.build.write",++ "version": "1.0",++ "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.",++ "permissions": [++ "spaces:write"++ ],++ "resourceConstraints": [++ "owner"++ ],++ "quotaClass": "standard",++ "events": [],++ "implementedBy": [++ "PUT /api/v1/spaces/:id/files"++ ],++ "inputSchema": "space.build-files@1",++ "outputSchema": "space.build-files@1"++}@@@ -71,7 +71,11 @@"space.domain.manage","space.site.config","space.resource.read",-- "space.resource.control"++ "space.resource.control",++ "space.build.read",++ "space.build.create",++ "space.build.write",++ "space.build.publish"],"eventsProduced": ["space.deploy.created",@@@ -1,6 +1,6 @@{"name": "openvibe-contracts",-- "version": "0.320.0",++ "version": "0.321.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",
@@ -1,5 +1,11 @@
@@ -1,5 +1,11 @@
# Changelog
# Changelog
+## 0.321.0 — 2026-11-07
+
+- Space's builder becomes a task of the person's one agent (plan 2026-10-22 §Z, stage Z1). Add the contracts of Space's builder API: `space.build-space@1` (one of a person's own spaces: its id, slug, name, description, whether it is published and where, and when it changed), `space.build-list@1` (`{ spaces }` or `{ space }`), `space.build-files@1` (the space's files, each a path and its whole content), `space.build-create@1` (the body of a request for a new space), `space.build-preview@1` (where the space can be seen now, its file paths, and whether it is live) and `space.build-publish@1` (`pending`, `published` or `declined`, with the request the person answers in the Dock).
+- Add the capabilities `space.build.read` (list and read the person's own spaces and their files), `space.build.create` (make a new space), `space.build.write` (write the files of one of them) and `space.build.publish` (ask to publish; the person answers before anything goes live). A first-party service names the person in `X-OV-Subject`, and only that person's own spaces are in reach.
+- Additive: nothing that exists today changes shape.
+
## 0.320.0 — 2026-11-07
## 0.320.0 — 2026-11-07
- `frame.menu-card@1` items gain an optional `image`: `src` (https on the publishing site's own origin or an `openvibe.*` host, at most 400 characters), optional `w` and `h` (whole pixels, 16–1920) and an optional `alt` of at most 120 characters. Network keeps an image whose `src` passes the same host rule as the item's `url`, drops one from anywhere else, and passes it through in `GET /api/frame` so the Frame menu and Network's `/my` can draw a thumbnail.
- `frame.menu-card@1` items gain an optional `image`: `src` (https on the publishing site's own origin or an `openvibe.*` host, at most 400 characters), optional `w` and `h` (whole pixels, 16–1920) and an optional `alt` of at most 120 characters. Network keeps an image whose `src` passes the same host rule as the item's `url`, drops one from anywhere else, and passes it through in `GET /api/frame` so the Frame menu and Network's `/my` can draw a thumbnail.
@@ -7767,6 +7767,60 @@
@@ -7767,6 +7767,60 @@
"compatibility": "backward",
"compatibility": "backward",
"status": "active"
"status": "active"
},
},
+ {
+ "id": "space.build-space",
+ "version": "1.0.0",
+ "owner": "space",
+ "schema": "space/build-space.v1.json",
+ "visibility": "first-party",
+ "compatibility": "backward",
+ "status": "active"
+ },
+ {
+ "id": "space.build-list",
+ "version": "1.0.0",
+ "owner": "space",
+ "schema": "space/build-list.v1.json",
+ "visibility": "first-party",
+ "compatibility": "backward",
+ "status": "active"
+ },
+ {
+ "id": "space.build-files",
+ "version": "1.0.0",
+ "owner": "space",
+ "schema": "space/build-files.v1.json",
+ "visibility": "first-party",
+ "compatibility": "backward",
+ "status": "active"
+ },
+ {
+ "id": "space.build-create",
+ "version": "1.0.0",
+ "owner": "space",
+ "schema": "space/build-create.v1.json",
+ "visibility": "first-party",
+ "compatibility": "backward",
+ "status": "active"
+ },
+ {
+ "id": "space.build-preview",
+ "version": "1.0.0",
+ "owner": "space",
+ "schema": "space/build-preview.v1.json",
+ "visibility": "first-party",
+ "compatibility": "backward",
+ "status": "active"
+ },
+ {
+ "id": "space.build-publish",
+ "version": "1.0.0",
+ "owner": "space",
+ "schema": "space/build-publish.v1.json",
+ "visibility": "first-party",
+ "compatibility": "backward",
+ "status": "active"
+ },
{
{
"id": "space.deploy-create-request",
"id": "space.deploy-create-request",
"version": "1.0.0",
"version": "1.0.0",
new file mode 100644
new file mode 100644
@@ -0,0 +1,20 @@
@@ -0,0 +1,20 @@
+{
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "https://openvibe.network/contracts/space/build-create.v1.json",
+ "title": "SpaceBuildCreate",
+ "description": "space.build-create@1: the body of POST /api/v1/spaces, the agent asking Space for a new space of its own (OpenVibe.Space's builder API; plan 2026-10-22 §Z stage Z1). It answers space.build-list@1 ({ space }). The name and the description are what the space shows; the space is made from Space's blank template and the agent fills its files.",
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "name": {
+ "type": "string",
+ "maxLength": 40,
+ "description": "The space's name."
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 400,
+ "description": "What the space does, in a line."
+ }
+ }
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,38 @@
@@ -0,0 +1,38 @@
+{
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "https://openvibe.network/contracts/space/build-files.v1.json",
+ "title": "SpaceBuildFiles",
+ "description": "space.build-files@1: the source files of one of a person's spaces, as their agent sees them (OpenVibe.Space's builder API; plan 2026-10-22 §Z stage Z1). GET /api/v1/spaces/:id/files answers { files }: every file of the space, its path and its whole content. The same shape is the body of PUT /api/v1/spaces/:id/files (space.build-write@1): the files to write, which replace the space's files as a whole.",
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "files"
+ ],
+ "properties": {
+ "files": {
+ "type": "array",
+ "maxItems": 20,
+ "items": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "path",
+ "content"
+ ],
+ "properties": {
+ "path": {
+ "type": "string",
+ "maxLength": 80,
+ "pattern": "^[A-Za-z0-9][A-Za-z0-9._-]*(/[A-Za-z0-9][A-Za-z0-9._-]*){0,3}$",
+ "description": "The file's path inside the space: letters, digits, \".\", \"-\", \"_\", up to four folders."
+ },
+ "content": {
+ "type": "string",
+ "maxLength": 200000,
+ "description": "The file's whole content."
+ }
+ }
+ }
+ }
+ }
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,35 @@
@@ -0,0 +1,35 @@
+{
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "https://openvibe.network/contracts/space/build-list.v1.json",
+ "title": "SpaceBuildList",
+ "description": "space.build-list@1: the spaces of one person, as their agent sees them (OpenVibe.Space's builder API; plan 2026-10-22 §Z stage Z1). GET /api/v1/spaces answers { spaces }; GET /api/v1/spaces/:id answers { space }.",
+ "anyOf": [
+ {
+ "type": "object",
+ "required": [
+ "spaces"
+ ],
+ "additionalProperties": false,
+ "properties": {
+ "spaces": {
+ "type": "array",
+ "items": {
+ "$ref": "build-space.v1.json"
+ }
+ }
+ }
+ },
+ {
+ "type": "object",
+ "required": [
+ "space"
+ ],
+ "additionalProperties": false,
+ "properties": {
+ "space": {
+ "$ref": "build-space.v1.json"
+ }
+ }
+ }
+ ]
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,31 @@
@@ -0,0 +1,31 @@
+{
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "https://openvibe.network/contracts/space/build-preview.v1.json",
+ "title": "SpaceBuildPreview",
+ "description": "space.build-preview@1: where a person's space can be seen right now, as their agent sees it (OpenVibe.Space's builder API; plan 2026-10-22 §Z stage Z1). GET /api/v1/spaces/:id/preview answers { url, files, published }: the address to open (the editor with its live preview while the space is a draft, its own address once it is published), the paths of the files it is made of, and whether it is live.",
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "url",
+ "files",
+ "published"
+ ],
+ "properties": {
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "description": "Where the space can be seen now."
+ },
+ "files": {
+ "type": "array",
+ "items": {
+ "type": "string",
+ "maxLength": 80
+ },
+ "description": "The paths of the files the space is made of."
+ },
+ "published": {
+ "type": "boolean"
+ }
+ }
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,45 @@
@@ -0,0 +1,45 @@
+{
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "https://openvibe.network/contracts/space/build-publish.v1.json",
+ "title": "SpaceBuildPublish",
+ "description": "space.build-publish@1: what happened when a person's agent asked to publish one of their spaces (OpenVibe.Space's builder API; plan 2026-10-22 §Z stage Z1). POST /api/v1/spaces/:id/publish asks to publish and answers { state: 'pending' } with the approval the person answers in the Dock; it never publishes without that answer. When the person approves, Space publishes and the step is { state: 'published', url }; when they decline, { state: 'declined' }.",
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "state"
+ ],
+ "properties": {
+ "state": {
+ "enum": [
+ "pending",
+ "published",
+ "declined"
+ ],
+ "description": "pending: the person must answer first. published: it is live at url. declined: the person said no."
+ },
+ "url": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "format": "uri",
+ "description": "Where it lives once it is published."
+ },
+ "approval_id": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "maxLength": 80,
+ "description": "The request the person answers in the Dock (its id)."
+ },
+ "reason": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "maxLength": 240,
+ "description": "Why it was refused, in one line a person can act on."
+ }
+ }
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,49 @@
@@ -0,0 +1,49 @@
+{
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "https://openvibe.network/contracts/space/build-space.v1.json",
+ "title": "SpaceBuildSpace",
+ "description": "space.build-space@1: one of a person's own spaces, as their agent sees it while it builds (OpenVibe.Space's builder API; plan 2026-10-22 §Z stage Z1). The id, the slug it publishes under, its name and description, whether it is published and where, and when it last changed. Nothing about anyone else's space is ever in this shape.",
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "id",
+ "slug",
+ "name",
+ "published",
+ "url"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "pattern": "^spc_[0-9A-HJKMNP-TV-Z]{26}$",
+ "description": "The space's id."
+ },
+ "slug": {
+ "type": "string",
+ "pattern": "^[a-z0-9](?:[a-z0-9]|-(?=[a-z0-9])){2,39}$",
+ "description": "The name it publishes under (<slug>.openvibe.website)."
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 40
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 400
+ },
+ "published": {
+ "type": "boolean",
+ "description": "True while it is live at its own address."
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "description": "Where it lives: its own address once published, the editor while it is a draft."
+ },
+ "updated_at": {
+ "type": "string",
+ "format": "date-time",
+ "description": "When it last changed."
+ }
+ }
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,3 @@
@@ -0,0 +1,3 @@
+{
+ "name": "A name that is far longer than forty characters are allowed to be"
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,4 @@
@@ -0,0 +1,4 @@
+{
+ "name": "My Podcast",
+ "description": "A place for my episodes."
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,5 @@
@@ -0,0 +1,5 @@
+{
+ "files": [
+ { "path": "../secrets.txt", "content": "no" }
+ ]
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,6 @@
@@ -0,0 +1,6 @@
+{
+ "files": [
+ { "path": "index.html", "content": "<!doctype html><title>My Podcast</title>" },
+ { "path": "style.css", "content": "body { font: 16px system-ui; }" }
+ ]
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,4 @@
@@ -0,0 +1,4 @@
+{
+ "spaces": [],
+ "other": 1
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,13 @@
@@ -0,0 +1,13 @@
+{
+ "spaces": [
+ {
+ "id": "spc_01JAD2C3D4E5F6G7H8J9K0MNPQ",
+ "slug": "my-podcast",
+ "name": "My Podcast",
+ "description": "",
+ "published": false,
+ "url": "https://openvibe.space/spaces/my-podcast/edit",
+ "updated_at": "2026-11-07T09:30:00.000Z"
+ }
+ ]
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,9 @@
@@ -0,0 +1,9 @@
+{
+ "space": {
+ "id": "spc_01JAD2C3D4E5F6G7H8J9K0MNPQ",
+ "slug": "my-podcast",
+ "name": "My Podcast",
+ "published": false,
+ "url": "https://openvibe.space/spaces/my-podcast/edit"
+ }
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,5 @@
@@ -0,0 +1,5 @@
+{
+ "url": "https://openvibe.space/spaces/my-podcast/edit",
+ "files": [],
+ "published": "yes"
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,5 @@
@@ -0,0 +1,5 @@
+{
+ "url": "https://openvibe.space/spaces/my-podcast/edit",
+ "files": ["index.html", "style.css"],
+ "published": false
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,3 @@
@@ -0,0 +1,3 @@
+{
+ "state": "maybe"
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,6 @@
@@ -0,0 +1,6 @@
+{
+ "state": "pending",
+ "url": null,
+ "approval_id": "apr_01JAD2C3D4E5F6G7H8J9K0MNPQ",
+ "reason": null
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,7 @@
@@ -0,0 +1,7 @@
+{
+ "id": "space-1",
+ "slug": "my-podcast",
+ "name": "My Podcast",
+ "published": false,
+ "url": "https://my-podcast.openvibe.website"
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,9 @@
@@ -0,0 +1,9 @@
+{
+ "id": "spc_01JAD2C3D4E5F6G7H8J9K0MNPQ",
+ "slug": "my-podcast",
+ "name": "My Podcast",
+ "description": "A place for my episodes.",
+ "published": true,
+ "url": "https://my-podcast.openvibe.website",
+ "updated_at": "2026-11-07T09:30:00.000Z"
+}
@@ -87331,6 +87331,254 @@
@@ -87331,6 +87331,254 @@
]
]
}
}
},
},
+ "space.build-space": {
+ "version": "1.0.0",
+ "owner": "space",
+ "status": "active",
+ "schema": {
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "https://openvibe.network/contracts/space/build-space.v1.json",
+ "title": "SpaceBuildSpace",
+ "description": "space.build-space@1: one of a person's own spaces, as their agent sees it while it builds (OpenVibe.Space's builder API; plan 2026-10-22 §Z stage Z1). The id, the slug it publishes under, its name and description, whether it is published and where, and when it last changed. Nothing about anyone else's space is ever in this shape.",
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "id",
+ "slug",
+ "name",
+ "published",
+ "url"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "pattern": "^spc_[0-9A-HJKMNP-TV-Z]{26}$",
+ "description": "The space's id."
+ },
+ "slug": {
+ "type": "string",
+ "pattern": "^[a-z0-9](?:[a-z0-9]|-(?=[a-z0-9])){2,39}$",
+ "description": "The name it publishes under (<slug>.openvibe.website)."
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 40
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 400
+ },
+ "published": {
+ "type": "boolean",
+ "description": "True while it is live at its own address."
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "description": "Where it lives: its own address once published, the editor while it is a draft."
+ },
+ "updated_at": {
+ "type": "string",
+ "format": "date-time",
+ "description": "When it last changed."
+ }
+ }
+ }
+ },
+ "space.build-list": {
+ "version": "1.0.0",
+ "owner": "space",
+ "status": "active",
+ "schema": {
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "https://openvibe.network/contracts/space/build-list.v1.json",
+ "title": "SpaceBuildList",
+ "description": "space.build-list@1: the spaces of one person, as their agent sees them (OpenVibe.Space's builder API; plan 2026-10-22 §Z stage Z1). GET /api/v1/spaces answers { spaces }; GET /api/v1/spaces/:id answers { space }.",
+ "anyOf": [
+ {
+ "type": "object",
+ "required": [
+ "spaces"
+ ],
+ "additionalProperties": false,
+ "properties": {
+ "spaces": {
+ "type": "array",
+ "items": {
+ "$ref": "build-space.v1.json"
+ }
+ }
+ }
+ },
+ {
+ "type": "object",
+ "required": [
+ "space"
+ ],
+ "additionalProperties": false,
+ "properties": {
+ "space": {
+ "$ref": "build-space.v1.json"
+ }
+ }
+ }
+ ]
+ }
+ },
+ "space.build-files": {
+ "version": "1.0.0",
+ "owner": "space",
+ "status": "active",
+ "schema": {
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "https://openvibe.network/contracts/space/build-files.v1.json",
+ "title": "SpaceBuildFiles",
+ "description": "space.build-files@1: the source files of one of a person's spaces, as their agent sees them (OpenVibe.Space's builder API; plan 2026-10-22 §Z stage Z1). GET /api/v1/spaces/:id/files answers { files }: every file of the space, its path and its whole content. The same shape is the body of PUT /api/v1/spaces/:id/files (space.build-write@1): the files to write, which replace the space's files as a whole.",
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "files"
+ ],
+ "properties": {
+ "files": {
+ "type": "array",
+ "maxItems": 20,
+ "items": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "path",
+ "content"
+ ],
+ "properties": {
+ "path": {
+ "type": "string",
+ "maxLength": 80,
+ "pattern": "^[A-Za-z0-9][A-Za-z0-9._-]*(/[A-Za-z0-9][A-Za-z0-9._-]*){0,3}$",
+ "description": "The file's path inside the space: letters, digits, \".\", \"-\", \"_\", up to four folders."
+ },
+ "content": {
+ "type": "string",
+ "maxLength": 200000,
+ "description": "The file's whole content."
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "space.build-create": {
+ "version": "1.0.0",
+ "owner": "space",
+ "status": "active",
+ "schema": {
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "https://openvibe.network/contracts/space/build-create.v1.json",
+ "title": "SpaceBuildCreate",
+ "description": "space.build-create@1: the body of POST /api/v1/spaces, the agent asking Space for a new space of its own (OpenVibe.Space's builder API; plan 2026-10-22 §Z stage Z1). It answers space.build-list@1 ({ space }). The name and the description are what the space shows; the space is made from Space's blank template and the agent fills its files.",
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "name": {
+ "type": "string",
+ "maxLength": 40,
+ "description": "The space's name."
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 400,
+ "description": "What the space does, in a line."
+ }
+ }
+ }
+ },
+ "space.build-preview": {
+ "version": "1.0.0",
+ "owner": "space",
+ "status": "active",
+ "schema": {
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "https://openvibe.network/contracts/space/build-preview.v1.json",
+ "title": "SpaceBuildPreview",
+ "description": "space.build-preview@1: where a person's space can be seen right now, as their agent sees it (OpenVibe.Space's builder API; plan 2026-10-22 §Z stage Z1). GET /api/v1/spaces/:id/preview answers { url, files, published }: the address to open (the editor with its live preview while the space is a draft, its own address once it is published), the paths of the files it is made of, and whether it is live.",
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "url",
+ "files",
+ "published"
+ ],
+ "properties": {
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "description": "Where the space can be seen now."
+ },
+ "files": {
+ "type": "array",
+ "items": {
+ "type": "string",
+ "maxLength": 80
+ },
+ "description": "The paths of the files the space is made of."
+ },
+ "published": {
+ "type": "boolean"
+ }
+ }
+ }
+ },
+ "space.build-publish": {
+ "version": "1.0.0",
+ "owner": "space",
+ "status": "active",
+ "schema": {
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "https://openvibe.network/contracts/space/build-publish.v1.json",
+ "title": "SpaceBuildPublish",
+ "description": "space.build-publish@1: what happened when a person's agent asked to publish one of their spaces (OpenVibe.Space's builder API; plan 2026-10-22 §Z stage Z1). POST /api/v1/spaces/:id/publish asks to publish and answers { state: 'pending' } with the approval the person answers in the Dock; it never publishes without that answer. When the person approves, Space publishes and the step is { state: 'published', url }; when they decline, { state: 'declined' }.",
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "state"
+ ],
+ "properties": {
+ "state": {
+ "enum": [
+ "pending",
+ "published",
+ "declined"
+ ],
+ "description": "pending: the person must answer first. published: it is live at url. declined: the person said no."
+ },
+ "url": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "format": "uri",
+ "description": "Where it lives once it is published."
+ },
+ "approval_id": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "maxLength": 80,
+ "description": "The request the person answers in the Dock (its id)."
+ },
+ "reason": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "maxLength": 240,
+ "description": "Why it was refused, in one line a person can act on."
+ }
+ }
+ }
+ },
"space.deploy-create-request": {
"space.deploy-create-request": {
"version": "1.0.0",
"version": "1.0.0",
"owner": "space",
"owner": "space",
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Actor API",
"title": "OpenVibe.Actor API",
- "version": "0.320.0",
- "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.320.0): each operation lists the capabilities it performs; a token for 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.321.0",
+ "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for 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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.AI API",
"title": "OpenVibe.AI API",
- "version": "0.320.0",
- "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.320.0): each operation lists the capabilities it performs; a token for 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.321.0",
+ "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for 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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Bench API",
"title": "OpenVibe.Bench API",
- "version": "0.320.0",
- "description": "Routes of OpenVibe.Bench as the OpenVibe contracts describe them (openvibe-contracts 0.320.0): each operation lists the capabilities it performs; a token for 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.321.0",
+ "description": "Routes of OpenVibe.Bench as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for 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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Billing API",
"title": "OpenVibe.Billing API",
- "version": "0.320.0",
- "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.320.0): each operation lists the capabilities it performs; a token for 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.321.0",
+ "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for 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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Blog API",
"title": "OpenVibe.Blog API",
- "version": "0.320.0",
- "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.320.0): each operation lists the capabilities it performs; a token for 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.321.0",
+ "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for 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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Bot API",
"title": "OpenVibe.Bot API",
- "version": "0.320.0",
- "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.320.0): each operation lists the capabilities it performs; a token for 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.321.0",
+ "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for 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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Chat API",
"title": "OpenVibe.Chat API",
- "version": "0.320.0",
- "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.320.0): each operation lists the capabilities it performs; a token for 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.321.0",
+ "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for 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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Codes API",
"title": "OpenVibe.Codes API",
- "version": "0.320.0",
- "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.320.0): each operation lists the capabilities it performs; a token for 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.321.0",
+ "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for 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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Community API",
"title": "OpenVibe.Community API",
- "version": "0.320.0",
- "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.320.0): each operation lists the capabilities it performs; a token for 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.321.0",
+ "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for 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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe Connect API",
"title": "OpenVibe Connect API",
- "version": "0.320.0",
- "description": "Routes of OpenVibe Connect as the OpenVibe contracts describe them (openvibe-contracts 0.320.0): each operation lists the capabilities it performs; a token for 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.321.0",
+ "description": "Routes of OpenVibe Connect as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for 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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Coupons API",
"title": "OpenVibe.Coupons API",
- "version": "0.320.0",
- "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.320.0): each operation lists the capabilities it performs; a token for 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.321.0",
+ "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for 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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Deals API",
"title": "OpenVibe.Deals API",
- "version": "0.320.0",
- "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.320.0): each operation lists the capabilities it performs; a token for 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.321.0",
+ "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for 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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Design API",
"title": "OpenVibe.Design API",
- "version": "0.320.0",
- "description": "Routes of OpenVibe.Design as the OpenVibe contracts describe them (openvibe-contracts 0.320.0): each operation lists the capabilities it performs; a token for 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.321.0",
+ "description": "Routes of OpenVibe.Design as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for 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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Domains API",
"title": "OpenVibe.Domains API",
- "version": "0.320.0",
- "description": "Routes of OpenVibe.Domains as the OpenVibe contracts describe them (openvibe-contracts 0.320.0): each operation lists the capabilities it performs; a token for 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.321.0",
+ "description": "Routes of OpenVibe.Domains as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for 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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Events API",
"title": "OpenVibe.Events API",
- "version": "0.320.0",
- "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.320.0): each operation lists the capabilities it performs; a token for 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.321.0",
+ "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for 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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Food API",
"title": "OpenVibe.Food API",
- "version": "0.320.0",
- "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.320.0): each operation lists the capabilities it performs; a token for 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.321.0",
+ "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for 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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Games API",
"title": "OpenVibe.Games API",
- "version": "0.320.0",
- "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.320.0): each operation lists the capabilities it performs; a token for 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.321.0",
+ "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for 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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Host API",
"title": "OpenVibe.Host API",
- "version": "0.320.0",
- "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.320.0): each operation lists the capabilities it performs; a token for 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.321.0",
+ "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for 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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -236,8 +236,8 @@
@@ -236,8 +236,8 @@
"service": "space",
"service": "space",
"name": "OpenVibe.Space",
"name": "OpenVibe.Space",
"origin": "https://openvibe.space",
"origin": "https://openvibe.space",
- "operations": 37,
- "capabilities": 6
+ "operations": 44,
+ "capabilities": 10
},
},
{
{
"service": "tips",
"service": "tips",
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Inventory API",
"title": "OpenVibe.Inventory API",
- "version": "0.320.0",
- "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.320.0): each operation lists the capabilities it performs; a token for 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.321.0",
+ "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for 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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Live API",
"title": "OpenVibe.Live API",
- "version": "0.320.0",
- "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.320.0): each operation lists the capabilities it performs; a token for 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.321.0",
+ "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for 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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.MediaHub API",
"title": "OpenVibe.MediaHub API",
- "version": "0.320.0",
- "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.320.0): each operation lists the capabilities it performs; a token for 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.321.0",
+ "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for 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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Media API",
"title": "OpenVibe.Media API",
- "version": "0.320.0",
- "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.320.0): each operation lists the capabilities it performs; a token for 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.321.0",
+ "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for 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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Network API",
"title": "OpenVibe.Network API",
- "version": "0.320.0",
- "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.320.0): each operation lists the capabilities it performs; a token for 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.321.0",
+ "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for 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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.News API",
"title": "OpenVibe.News API",
- "version": "0.320.0",
- "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.320.0): each operation lists the capabilities it performs; a token for 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.321.0",
+ "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for 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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenRestream API",
"title": "OpenRestream API",
- "version": "0.320.0",
- "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.320.0): each operation lists the capabilities it performs; a token for 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.321.0",
+ "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for 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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Play API",
"title": "OpenVibe.Play API",
- "version": "0.320.0",
- "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.320.0): each operation lists the capabilities it performs; a token for 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.321.0",
+ "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for 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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Quest API",
"title": "OpenVibe.Quest API",
- "version": "0.320.0",
- "description": "Routes of OpenVibe.Quest as the OpenVibe contracts describe them (openvibe-contracts 0.320.0): each operation lists the capabilities it performs; a token for 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.321.0",
+ "description": "Routes of OpenVibe.Quest as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for 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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Report API",
"title": "OpenVibe.Report API",
- "version": "0.320.0",
- "description": "Routes of OpenVibe.Report as the OpenVibe contracts describe them (openvibe-contracts 0.320.0): each operation lists the capabilities it performs; a token for 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.321.0",
+ "description": "Routes of OpenVibe.Report as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for 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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Reviews API",
"title": "OpenVibe.Reviews API",
- "version": "0.320.0",
- "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.320.0): each operation lists the capabilities it performs; a token for 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.321.0",
+ "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for 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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Run API",
"title": "OpenVibe.Run API",
- "version": "0.320.0",
- "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.320.0): each operation lists the capabilities it performs; a token for 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.321.0",
+ "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for 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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Search API",
"title": "OpenVibe.Search API",
- "version": "0.320.0",
- "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.320.0): each operation lists the capabilities it performs; a token for 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.321.0",
+ "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for 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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Services API",
"title": "OpenVibe.Services API",
- "version": "0.320.0",
- "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.320.0): each operation lists the capabilities it performs; a token for 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.321.0",
+ "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for 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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Sources API",
"title": "OpenVibe.Sources API",
- "version": "0.320.0",
- "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.320.0): each operation lists the capabilities it performs; a token for 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.321.0",
+ "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for 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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Space API",
"title": "OpenVibe.Space API",
- "version": "0.320.0",
- "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.320.0): each operation lists the capabilities it performs; a token for 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.321.0",
+ "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for 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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -2345,6 +2345,394 @@
@@ -2345,6 +2345,394 @@
}
}
}
}
}
}
+ },
+ "/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/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.build"
+ ],
+ "x-openvibe-capabilities": [
+ "space.build.read"
+ ],
+ "x-openvibe-visibility": [
+ "first-party"
+ ],
+ "x-openvibe-quota-class": "standard",
+ "security": [
+ {
+ "openvibeToken": [
+ "space.build.read"
+ ]
+ }
+ ],
+ "responses": {
+ "2XX": {
+ "description": "Success",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/space.build-list.v1"
+ }
+ }
+ }
+ },
+ "default": {
+ "description": "An error (RFC 9457 problem details)",
+ "content": {
+ "application/problem+json": {
+ "schema": {
+ "$ref": "#/components/schemas/errors.problem.v1"
+ }
+ }
+ }
+ }
+ }
+ },
+ "post": {
+ "operationId": "post_api_v1_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.",
+ "tags": [
+ "space.build"
+ ],
+ "x-openvibe-capabilities": [
+ "space.build.create"
+ ],
+ "x-openvibe-visibility": [
+ "first-party"
+ ],
+ "x-openvibe-quota-class": "standard",
+ "security": [
+ {
+ "openvibeToken": [
+ "space.build.create"
+ ]
+ }
+ ],
+ "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.build-list.v1"
+ }
+ }
+ }
+ },
+ "default": {
+ "description": "An error (RFC 9457 problem details)",
+ "content": {
+ "application/problem+json": {
+ "schema": {
+ "$ref": "#/components/schemas/errors.problem.v1"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/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/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.build"
+ ],
+ "x-openvibe-capabilities": [
+ "space.build.read"
+ ],
+ "x-openvibe-visibility": [
+ "first-party"
+ ],
+ "x-openvibe-quota-class": "standard",
+ "security": [
+ {
+ "openvibeToken": [
+ "space.build.read"
+ ]
+ }
+ ],
+ "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"
+ }
+ }
+ }
+ },
+ "default": {
+ "description": "An error (RFC 9457 problem details)",
+ "content": {
+ "application/problem+json": {
+ "schema": {
+ "$ref": "#/components/schemas/errors.problem.v1"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/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/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.build"
+ ],
+ "x-openvibe-capabilities": [
+ "space.build.read"
+ ],
+ "x-openvibe-visibility": [
+ "first-party"
+ ],
+ "x-openvibe-quota-class": "standard",
+ "security": [
+ {
+ "openvibeToken": [
+ "space.build.read"
+ ]
+ }
+ ],
+ "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"
+ }
+ }
+ }
+ },
+ "default": {
+ "description": "An error (RFC 9457 problem details)",
+ "content": {
+ "application/problem+json": {
+ "schema": {
+ "$ref": "#/components/schemas/errors.problem.v1"
+ }
+ }
+ }
+ }
+ }
+ },
+ "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.",
+ "tags": [
+ "space.build"
+ ],
+ "x-openvibe-capabilities": [
+ "space.build.write"
+ ],
+ "x-openvibe-visibility": [
+ "first-party"
+ ],
+ "x-openvibe-quota-class": "standard",
+ "security": [
+ {
+ "openvibeToken": [
+ "space.build.write"
+ ]
+ }
+ ],
+ "requestBody": {
+ "required": false,
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/space.build-files.v1"
+ }
+ }
+ }
+ },
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "2XX": {
+ "description": "Success",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/space.build-files.v1"
+ }
+ }
+ }
+ },
+ "default": {
+ "description": "An error (RFC 9457 problem details)",
+ "content": {
+ "application/problem+json": {
+ "schema": {
+ "$ref": "#/components/schemas/errors.problem.v1"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/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/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.build"
+ ],
+ "x-openvibe-capabilities": [
+ "space.build.read"
+ ],
+ "x-openvibe-visibility": [
+ "first-party"
+ ],
+ "x-openvibe-quota-class": "standard",
+ "security": [
+ {
+ "openvibeToken": [
+ "space.build.read"
+ ]
+ }
+ ],
+ "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"
+ }
+ }
+ }
+ },
+ "default": {
+ "description": "An error (RFC 9457 problem details)",
+ "content": {
+ "application/problem+json": {
+ "schema": {
+ "$ref": "#/components/schemas/errors.problem.v1"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/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.",
+ "tags": [
+ "space.build"
+ ],
+ "x-openvibe-capabilities": [
+ "space.build.publish"
+ ],
+ "x-openvibe-visibility": [
+ "first-party"
+ ],
+ "x-openvibe-quota-class": "standard",
+ "security": [
+ {
+ "openvibeToken": [
+ "space.build.publish"
+ ]
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "2XX": {
+ "description": "Success",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/space.build-publish.v1"
+ }
+ }
+ }
+ },
+ "default": {
+ "description": "An error (RFC 9457 problem details)",
+ "content": {
+ "application/problem+json": {
+ "schema": {
+ "$ref": "#/components/schemas/errors.problem.v1"
+ }
+ }
+ }
+ }
+ }
+ }
}
}
},
},
"components": {
"components": {
@@ -2814,6 +3202,183 @@
@@ -2814,6 +3202,183 @@
}
}
]
]
},
},
+ "space.build-create.v1": {
+ "title": "SpaceBuildCreate",
+ "description": "space.build-create@1: the body of POST /api/v1/spaces, the agent asking Space for a new space of its own (OpenVibe.Space's builder API; plan 2026-10-22 §Z stage Z1). It answers space.build-list@1 ({ space }). The name and the description are what the space shows; the space is made from Space's blank template and the agent fills its files.",
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "name": {
+ "type": "string",
+ "maxLength": 40,
+ "description": "The space's name."
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 400,
+ "description": "What the space does, in a line."
+ }
+ }
+ },
+ "space.build-files.v1": {
+ "title": "SpaceBuildFiles",
+ "description": "space.build-files@1: the source files of one of a person's spaces, as their agent sees them (OpenVibe.Space's builder API; plan 2026-10-22 §Z stage Z1). GET /api/v1/spaces/:id/files answers { files }: every file of the space, its path and its whole content. The same shape is the body of PUT /api/v1/spaces/:id/files (space.build-write@1): the files to write, which replace the space's files as a whole.",
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "files"
+ ],
+ "properties": {
+ "files": {
+ "type": "array",
+ "maxItems": 20,
+ "items": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "path",
+ "content"
+ ],
+ "properties": {
+ "path": {
+ "type": "string",
+ "maxLength": 80,
+ "pattern": "^[A-Za-z0-9][A-Za-z0-9._-]*(/[A-Za-z0-9][A-Za-z0-9._-]*){0,3}$",
+ "description": "The file's path inside the space: letters, digits, \".\", \"-\", \"_\", up to four folders."
+ },
+ "content": {
+ "type": "string",
+ "maxLength": 200000,
+ "description": "The file's whole content."
+ }
+ }
+ }
+ }
+ }
+ },
+ "space.build-list.v1": {
+ "title": "SpaceBuildList",
+ "description": "space.build-list@1: the spaces of one person, as their agent sees them (OpenVibe.Space's builder API; plan 2026-10-22 §Z stage Z1). GET /api/v1/spaces answers { spaces }; GET /api/v1/spaces/:id answers { space }.",
+ "anyOf": [
+ {
+ "type": "object",
+ "required": [
+ "spaces"
+ ],
+ "additionalProperties": false,
+ "properties": {
+ "spaces": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/space.build-space.v1"
+ }
+ }
+ }
+ },
+ {
+ "type": "object",
+ "required": [
+ "space"
+ ],
+ "additionalProperties": false,
+ "properties": {
+ "space": {
+ "$ref": "#/components/schemas/space.build-space.v1"
+ }
+ }
+ }
+ ]
+ },
+ "space.build-publish.v1": {
+ "title": "SpaceBuildPublish",
+ "description": "space.build-publish@1: what happened when a person's agent asked to publish one of their spaces (OpenVibe.Space's builder API; plan 2026-10-22 §Z stage Z1). POST /api/v1/spaces/:id/publish asks to publish and answers { state: 'pending' } with the approval the person answers in the Dock; it never publishes without that answer. When the person approves, Space publishes and the step is { state: 'published', url }; when they decline, { state: 'declined' }.",
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "state"
+ ],
+ "properties": {
+ "state": {
+ "enum": [
+ "pending",
+ "published",
+ "declined"
+ ],
+ "description": "pending: the person must answer first. published: it is live at url. declined: the person said no."
+ },
+ "url": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "format": "uri",
+ "description": "Where it lives once it is published."
+ },
+ "approval_id": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "maxLength": 80,
+ "description": "The request the person answers in the Dock (its id)."
+ },
+ "reason": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "maxLength": 240,
+ "description": "Why it was refused, in one line a person can act on."
+ }
+ }
+ },
+ "space.build-space.v1": {
+ "title": "SpaceBuildSpace",
+ "description": "space.build-space@1: one of a person's own spaces, as their agent sees it while it builds (OpenVibe.Space's builder API; plan 2026-10-22 §Z stage Z1). The id, the slug it publishes under, its name and description, whether it is published and where, and when it last changed. Nothing about anyone else's space is ever in this shape.",
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "id",
+ "slug",
+ "name",
+ "published",
+ "url"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "pattern": "^spc_[0-9A-HJKMNP-TV-Z]{26}$",
+ "description": "The space's id."
+ },
+ "slug": {
+ "type": "string",
+ "pattern": "^[a-z0-9](?:[a-z0-9]|-(?=[a-z0-9])){2,39}$",
+ "description": "The name it publishes under (<slug>.openvibe.website)."
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 40
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 400
+ },
+ "published": {
+ "type": "boolean",
+ "description": "True while it is live at its own address."
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "description": "Where it lives: its own address once published, the editor while it is a draft."
+ },
+ "updated_at": {
+ "type": "string",
+ "format": "date-time",
+ "description": "When it last changed."
+ }
+ }
+ },
"space.deploy-create-request.v1": {
"space.deploy-create-request.v1": {
"title": "SpaceDeployCreateRequest",
"title": "SpaceDeployCreateRequest",
"description": "space.deploy-create-request@1: bodies of space.deploy.create on OpenVibe.Space (a deployer or above of the project; an app principal added as deployer can deploy from CI). POST /api/v1/sites/:id/deploys uploads a deploy: the raw body is a tar or tar.gz archive (Content-Type application/gzip, application/x-gzip, application/x-tar or application/octet-stream), or multipart/form-data with archive=<one archive> or files=<file>… (each part's filename is its path); optional fields activate=1, root=<subdirectory to deploy> and strip=folder (removes a shared first segment) also work as query parameters. It is validated (path traversal, links, special and hidden files, server-side code, file types, sizes and quotas) and never executed; a refusal is a problem whose extra carries the failed deploy_id and its log (413 upload.too_large, quota.storage; 422 validation codes; 429 quota.deploys_per_day; 403 site.taken_down; 503 upload.busy; 507 storage.host_full). POST /api/v1/deploys/:id/activate { expected_active? } and POST /api/v1/sites/:id/rollback { deploy_id?, expected_active? } switch the site's pointer in one step (rollback without deploy_id goes to the deploy active before; 409 deploy.not_ready, site.active_changed when expected_active is stale, deploy.no_previous). GET /api/v1/sites/:id/deploys, /deploys/:id and /deploys/:id/log take no body.",
"description": "space.deploy-create-request@1: bodies of space.deploy.create on OpenVibe.Space (a deployer or above of the project; an app principal added as deployer can deploy from CI). POST /api/v1/sites/:id/deploys uploads a deploy: the raw body is a tar or tar.gz archive (Content-Type application/gzip, application/x-gzip, application/x-tar or application/octet-stream), or multipart/form-data with archive=<one archive> or files=<file>… (each part's filename is its path); optional fields activate=1, root=<subdirectory to deploy> and strip=folder (removes a shared first segment) also work as query parameters. It is validated (path traversal, links, special and hidden files, server-side code, file types, sizes and quotas) and never executed; a refusal is a problem whose extra carries the failed deploy_id and its log (413 upload.too_large, quota.storage; 422 validation codes; 429 quota.deploys_per_day; 403 site.taken_down; 503 upload.busy; 507 storage.host_full). POST /api/v1/deploys/:id/activate { expected_active? } and POST /api/v1/sites/:id/rollback { deploy_id?, expected_active? } switch the site's pointer in one step (rollback without deploy_id goes to the deploy active before; 409 deploy.not_ready, site.active_changed when expected_active is stale, deploy.no_previous). GET /api/v1/sites/:id/deploys, /deploys/:id and /deploys/:id/log take no body.",
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Tips API",
"title": "OpenVibe.Tips API",
- "version": "0.320.0",
- "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.320.0): each operation lists the capabilities it performs; a token for 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.321.0",
+ "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for 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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Today API",
"title": "OpenVibe.Today API",
- "version": "0.320.0",
- "description": "Routes of OpenVibe.Today as the OpenVibe contracts describe them (openvibe-contracts 0.320.0): each operation lists the capabilities it performs; a token for 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.321.0",
+ "description": "Routes of OpenVibe.Today as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for 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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Tools API",
"title": "OpenVibe.Tools API",
- "version": "0.320.0",
- "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.320.0): each operation lists the capabilities it performs; a token for 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.321.0",
+ "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for 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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Trade API",
"title": "OpenVibe.Trade API",
- "version": "0.320.0",
- "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.320.0): each operation lists the capabilities it performs; a token for 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.321.0",
+ "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for 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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.VIP API",
"title": "OpenVibe.VIP API",
- "version": "0.320.0",
- "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.320.0): each operation lists the capabilities it performs; a token for 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.321.0",
+ "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for 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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Vision API",
"title": "OpenVibe.Vision API",
- "version": "0.320.0",
- "description": "Routes of OpenVibe.Vision as the OpenVibe contracts describe them (openvibe-contracts 0.320.0): each operation lists the capabilities it performs; a token for 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.321.0",
+ "description": "Routes of OpenVibe.Vision as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for 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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Watch API",
"title": "OpenVibe.Watch API",
- "version": "0.320.0",
- "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.320.0): each operation lists the capabilities it performs; a token for 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.321.0",
+ "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for 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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Wiki API",
"title": "OpenVibe.Wiki API",
- "version": "0.320.0",
- "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.320.0): each operation lists the capabilities it performs; a token for 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.321.0",
+ "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for 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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Work API",
"title": "OpenVibe.Work API",
- "version": "0.320.0",
- "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.320.0): each operation lists the capabilities it performs; a token for 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.321.0",
+ "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for 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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Zone API",
"title": "OpenVibe.Zone API",
- "version": "0.320.0",
- "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.320.0): each operation lists the capabilities it performs; a token for 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.321.0",
+ "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.321.0): each operation lists the capabilities it performs; a token for 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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -269471,6 +269471,2253 @@ export type FoodRecipeResult =
@@ -269471,6 +269471,2253 @@ export type FoodRecipeResult =
];
];
};
};
+/** [email protected] (owner: space) */
+/**
+ * space.build-space@1: one of a person's own spaces, as their agent sees it while it builds (OpenVibe.Space's builder API; plan 2026-10-22 §Z stage Z1). The id, the slug it publishes under, its name and description, whether it is published and where, and when it last changed. Nothing about anyone else's space is ever in this shape.
+ */
+export interface SpaceBuildSpace {
+ /**
+ * The space's id.
+ */
+ id: string;
+ /**
+ * The name it publishes under (<slug>.openvibe.website).
+ */
+ slug: string;
+ name: string;
+ description?: string;
+ /**
+ * True while it is live at its own address.
+ */
+ published: boolean;
+ /**
+ * Where it lives: its own address once published, the editor while it is a draft.
+ */
+ url: string;
+ /**
+ * When it last changed.
+ */
+ updated_at?: string;
+}
+
+/** [email protected] (owner: space) */
+/**
+ * space.build-list@1: the spaces of one person, as their agent sees them (OpenVibe.Space's builder API; plan 2026-10-22 §Z stage Z1). GET /api/v1/spaces answers { spaces }; GET /api/v1/spaces/:id answers { space }.
+ */
+export type SpaceBuildList =
+ | {
+ spaces: SpaceBuildSpace[];
+ }
+ | {
+ space: SpaceBuildSpace;
+ };
+
+/** [email protected] (owner: space) */
+/**
+ * space.build-files@1: the source files of one of a person's spaces, as their agent sees them (OpenVibe.Space's builder API; plan 2026-10-22 §Z stage Z1). GET /api/v1/spaces/:id/files answers { files }: every file of the space, its path and its whole content. The same shape is the body of PUT /api/v1/spaces/:id/files (space.build-write@1): the files to write, which replace the space's files as a whole.
+ */
+export interface SpaceBuildFiles {
+ /**
+ * @maxItems 20
+ */
+ files:
+ | []
+ | [
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ }
+ ]
+ | [
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ }
+ ]
+ | [
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ }
+ ]
+ | [
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ }
+ ]
+ | [
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ }
+ ]
+ | [
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ }
+ ]
+ | [
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ }
+ ]
+ | [
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ }
+ ]
+ | [
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ }
+ ]
+ | [
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ }
+ ]
+ | [
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ }
+ ]
+ | [
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ }
+ ]
+ | [
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ }
+ ]
+ | [
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ }
+ ]
+ | [
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ }
+ ]
+ | [
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ }
+ ]
+ | [
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ }
+ ]
+ | [
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ }
+ ]
+ | [
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ }
+ ]
+ | [
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ },
+ {
+ /**
+ * The file's path inside the space: letters, digits, ".", "-", "_", up to four folders.
+ */
+ path: string;
+ /**
+ * The file's whole content.
+ */
+ content: string;
+ }
+ ];
+}
+
+/** [email protected] (owner: space) */
+/**
+ * space.build-create@1: the body of POST /api/v1/spaces, the agent asking Space for a new space of its own (OpenVibe.Space's builder API; plan 2026-10-22 §Z stage Z1). It answers space.build-list@1 ({ space }). The name and the description are what the space shows; the space is made from Space's blank template and the agent fills its files.
+ */
+export interface SpaceBuildCreate {
+ /**
+ * The space's name.
+ */
+ name?: string;
+ /**
+ * What the space does, in a line.
+ */
+ description?: string;
+}
+
+/** [email protected] (owner: space) */
+/**
+ * space.build-preview@1: where a person's space can be seen right now, as their agent sees it (OpenVibe.Space's builder API; plan 2026-10-22 §Z stage Z1). GET /api/v1/spaces/:id/preview answers { url, files, published }: the address to open (the editor with its live preview while the space is a draft, its own address once it is published), the paths of the files it is made of, and whether it is live.
+ */
+export interface SpaceBuildPreview {
+ /**
+ * Where the space can be seen now.
+ */
+ url: string;
+ /**
+ * The paths of the files the space is made of.
+ */
+ files: string[];
+ published: boolean;
+}
+
+/** [email protected] (owner: space) */
+/**
+ * space.build-publish@1: what happened when a person's agent asked to publish one of their spaces (OpenVibe.Space's builder API; plan 2026-10-22 §Z stage Z1). POST /api/v1/spaces/:id/publish asks to publish and answers { state: 'pending' } with the approval the person answers in the Dock; it never publishes without that answer. When the person approves, Space publishes and the step is { state: 'published', url }; when they decline, { state: 'declined' }.
+ */
+export interface SpaceBuildPublish {
+ /**
+ * pending: the person must answer first. published: it is live at url. declined: the person said no.
+ */
+ state: "pending" | "published" | "declined";
+ /**
+ * Where it lives once it is published.
+ */
+ url?: string | null;
+ /**
+ * The request the person answers in the Dock (its id).
+ */
+ approval_id?: string | null;
+ /**
+ * Why it was refused, in one line a person can act on.
+ */
+ reason?: string | null;
+}
+
/** [email protected] (owner: space) */
/** [email protected] (owner: space) */
/**
/**
* space.deploy-create-request@1: bodies of space.deploy.create on OpenVibe.Space (a deployer or above of the project; an app principal added as deployer can deploy from CI). POST /api/v1/sites/:id/deploys uploads a deploy: the raw body is a tar or tar.gz archive (Content-Type application/gzip, application/x-gzip, application/x-tar or application/octet-stream), or multipart/form-data with archive=<one archive> or files=<file>… (each part's filename is its path); optional fields activate=1, root=<subdirectory to deploy> and strip=folder (removes a shared first segment) also work as query parameters. It is validated (path traversal, links, special and hidden files, server-side code, file types, sizes and quotas) and never executed; a refusal is a problem whose extra carries the failed deploy_id and its log (413 upload.too_large, quota.storage; 422 validation codes; 429 quota.deploys_per_day; 403 site.taken_down; 503 upload.busy; 507 storage.host_full). POST /api/v1/deploys/:id/activate { expected_active? } and POST /api/v1/sites/:id/rollback { deploy_id?, expected_active? } switch the site's pointer in one step (rollback without deploy_id goes to the deploy active before; 409 deploy.not_ready, site.active_changed when expected_active is stale, deploy.no_previous). GET /api/v1/sites/:id/deploys, /deploys/:id and /deploys/:id/log take no body.
* space.deploy-create-request@1: bodies of space.deploy.create on OpenVibe.Space (a deployer or above of the project; an app principal added as deployer can deploy from CI). POST /api/v1/sites/:id/deploys uploads a deploy: the raw body is a tar or tar.gz archive (Content-Type application/gzip, application/x-gzip, application/x-tar or application/octet-stream), or multipart/form-data with archive=<one archive> or files=<file>… (each part's filename is its path); optional fields activate=1, root=<subdirectory to deploy> and strip=folder (removes a shared first segment) also work as query parameters. It is validated (path traversal, links, special and hidden files, server-side code, file types, sizes and quotas) and never executed; a refusal is a problem whose extra carries the failed deploy_id and its log (413 upload.too_large, quota.storage; 422 validation codes; 429 quota.deploys_per_day; 403 site.taken_down; 503 upload.busy; 507 storage.host_full). POST /api/v1/deploys/:id/activate { expected_active? } and POST /api/v1/sites/:id/rollback { deploy_id?, expected_active? } switch the site's pointer in one step (rollback without deploy_id goes to the deploy active before; 409 deploy.not_ready, site.active_changed when expected_active is stale, deploy.no_previous). GET /api/v1/sites/:id/deploys, /deploys/:id and /deploys/:id/log take no body.
new file mode 100644
new file mode 100644
@@ -0,0 +1,21 @@
@@ -0,0 +1,21 @@
+{
+ "id": "space.build.create",
+ "version": "1.0",
+ "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.",
+ "permissions": [
+ "spaces:write"
+ ],
+ "resourceConstraints": [
+ "owner"
+ ],
+ "quotaClass": "standard",
+ "events": [],
+ "implementedBy": [
+ "POST /api/v1/spaces"
+ ],
+ "inputSchema": "space.build-create@1",
+ "outputSchema": "space.build-list@1"
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,22 @@
@@ -0,0 +1,22 @@
+{
+ "id": "space.build.publish",
+ "version": "1.0",
+ "owner": "space",
+ "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.",
+ "permissions": [
+ "spaces:publish"
+ ],
+ "resourceConstraints": [
+ "owner"
+ ],
+ "quotaClass": "standard",
+ "events": [],
+ "implementedBy": [
+ "POST /api/v1/spaces/:id/publish"
+ ],
+ "inputSchema": "common.no-body@1",
+ "outputSchema": "space.build-publish@1"
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,24 @@
@@ -0,0 +1,24 @@
+{
+ "id": "space.build.read",
+ "version": "1.0",
+ "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/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"
+ ],
+ "resourceConstraints": [
+ "owner"
+ ],
+ "quotaClass": "standard",
+ "events": [],
+ "implementedBy": [
+ "GET /api/v1/spaces",
+ "GET /api/v1/spaces/:id",
+ "GET /api/v1/spaces/:id/files",
+ "GET /api/v1/spaces/:id/preview"
+ ],
+ "inputSchema": "common.no-body@1",
+ "outputSchema": "space.build-list@1"
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,21 @@
@@ -0,0 +1,21 @@
+{
+ "id": "space.build.write",
+ "version": "1.0",
+ "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.",
+ "permissions": [
+ "spaces:write"
+ ],
+ "resourceConstraints": [
+ "owner"
+ ],
+ "quotaClass": "standard",
+ "events": [],
+ "implementedBy": [
+ "PUT /api/v1/spaces/:id/files"
+ ],
+ "inputSchema": "space.build-files@1",
+ "outputSchema": "space.build-files@1"
+}
@@ -71,7 +71,11 @@
@@ -71,7 +71,11 @@
"space.domain.manage",
"space.domain.manage",
"space.site.config",
"space.site.config",
"space.resource.read",
"space.resource.read",
- "space.resource.control"
+ "space.resource.control",
+ "space.build.read",
+ "space.build.create",
+ "space.build.write",
+ "space.build.publish"
],
],
"eventsProduced": [
"eventsProduced": [
"space.deploy.created",
"space.deploy.created",
@@ -1,6 +1,6 @@
@@ -1,6 +1,6 @@
{
{
"name": "openvibe-contracts",
"name": "openvibe-contracts",
- "version": "0.320.0",
+ "version": "0.321.0",
"description": "Machine-readable contracts for the OpenVibe network: schemas, manifests, ids, error envelope, capability checks.",
"description": "Machine-readable contracts for the OpenVibe network: schemas, manifests, ids, error envelope, capability checks.",
"main": "index.js",
"main": "index.js",
"types": "generated/typescript/index.d.ts",
"types": "generated/typescript/index.d.ts",