openvibers/openvibe.contracts Commits
Contracts 0.406.0: release train for #444, #445, #446, #447 and #448 (#449)
Changes
@@@ -1,5 +1,22 @@# Changelog++## 0.406.0 — 2026-11-11++++The second train of the day, for the five pull requests opened after 0.405.0 (one line each):++++- Define `meme.caption.created` for a signed-in person's public caption, with only its id and owner (#444).++- Add `codes.model-plan@1`: execution modes, role models and effort, bounded samples and budgets, an escalation ladder++ and required checks; task requests accept a plan or a preset, and task reads can include the resolved plan and++ per-role usage and outcome (#445).++- Delivery and retry on computer and browser results: `bot.command-result@1` and `run.session-control-result@1` gain++ `delivery` (`delivered`, `not_delivered`, `uncertain`) and `retry` (`safe`, `reason`), only `not_delivered` is safe++ to replay; optional browser `origins` on browser commands, Run session creation and Bot desk lease creation (#446).++- Add `ai.model-directory-entry@1` and `ai.model-directory-list@1` for public model listings, with provider-listed++ models routed off, preview and retired models, and sourced pre-list sightings; a spotted entry never implies++ availability (#447).++- Keep the exact reply target and its display name in Community comment reads; document the two-reply preview and four++ Chat-compatible file references on comment writes and reads (#448).++## 0.405.0 — 2026-11-11This release train carries the contract work that was waiting on the owner's release. One line per carried pull request:@@@ -5,7 +5,7 @@**Docs:** https://openvibe.services · **For AI:** https://openvibe.services/llms.txt**Install and test:** `npm ci && npm test` (Node 20 or newer)--**Status:** alpha (first released in Wave 1; the release is package.json's `version`, tagged). At v0.405.0: 1238 schemas in `contracts/catalog.json`, 66 service manifests, 516 capability manifests, 14 namespace manifests and the staff capability map. Service repositories run `openvibe-contracts-check` and the pin-drift check in CI, and deployed services verify service and app tokens with `serviceAuth` in production. Consumers pin release tags (each repository's `STATUS.json` names its pin). `node scripts/docs-currency.js <root>` checks every checkout's README and `STATUS.json` against its code: the pins and versions they name, a library's consumer list, the deployed flag against the manifest, README links, and the paths and migrations they name. `node scripts/estate.js` generates `docs/ESTATE.md` and `manifests/repositories/` from the estate checkouts, and `--check` fails on drift (plan T1 step 3).++**Status:** alpha (first released in Wave 1; the release is package.json's `version`, tagged). At v0.406.0: 1238 schemas in `contracts/catalog.json`, 66 service manifests, 516 capability manifests, 14 namespace manifests and the staff capability map. Service repositories run `openvibe-contracts-check` and the pin-drift check in CI, and deployed services verify service and app tokens with `serviceAuth` in production. Consumers pin release tags (each repository's `STATUS.json` names its pin). `node scripts/docs-currency.js <root>` checks every checkout's README and `STATUS.json` against its code: the pins and versions they name, a library's consumer list, the deployed flag against the manifest, README links, and the paths and migrations they name. `node scripts/estate.js` generates `docs/ESTATE.md` and `manifests/repositories/` from the estate checkouts, and `--check` fails on drift (plan T1 step 3).**Plan:** OpenVibe Development Roadmap, Wave 1 (implementation plan rev 3, §3.1 and §18.11).**License:** AGPL-3.0 (same as every OpenVibe service).nnew file mode 100644@@@ -0,0 +1,42 @@++{++ "$schema": "https://json-schema.org/draft/2020-12/schema",++ "$id": "https://openvibe.network/contracts/ai/model-directory-entry.v1.json",++ "title": "AiModelDirectoryEntry",++ "description": "ai.model-directory-entry@1: one public model, including provider-listed models with routing off and sourced pre-list sightings. Spotted never means available.",++ "type": "object",++ "required": ["id", "provider", "model", "name", "status", "routing_enabled"],++ "additionalProperties": true,++ "allOf": [++ {"if": {"properties": {"status": {"enum": ["spotted", "retired"]}}}, "then": {"properties": {"routing_enabled": {"const": false}}}}++ ],++ "properties": {++ "id": {"type": "string", "minLength": 3, "maxLength": 256},++ "provider": {"type": "string", "minLength": 1},++ "provider_name": {"type": ["string", "null"]},++ "model": {"type": "string", "minLength": 1},++ "name": {"type": "string", "minLength": 1},++ "family": {"type": ["string", "null"]},++ "version": {"type": ["string", "null"]},++ "status": {"enum": ["available", "preview", "spotted", "retired"]},++ "routing_enabled": {"type": "boolean"},++ "context_window": {"type": ["integer", "null"], "minimum": 0},++ "max_output": {"type": ["integer", "null"], "minimum": 0},++ "type": {"type": "string"},++ "modalities": {"type": "array", "items": {"type": "string"}},++ "price": {++ "type": "object",++ "properties": {++ "input_per_million": {"type": ["number", "null"], "minimum": 0},++ "output_per_million": {"type": ["number", "null"], "minimum": 0},++ "cached_per_million": {"type": ["number", "null"], "minimum": 0},++ "source": {"type": ["string", "null"], "format": "uri"},++ "checked_at": {"type": ["string", "null"]}++ }++ },++ "source": {"type": ["string", "null"], "format": "uri"},++ "sources": {"type": "array", "items": {"type": "object", "required": ["url", "observed_at"], "properties": {"url": {"type": "string", "format": "uri"}, "observed_at": {"type": "string"}, "published_at": {"type": "string"}}}},++ "first_seen_at": {"type": ["string", "null"]},++ "updated_at": {"type": ["string", "null"]},++ "retired_at": {"type": ["string", "null"]}++ }++}nnew file mode 100644@@@ -0,0 +1,14 @@++{++ "$schema": "https://json-schema.org/draft/2020-12/schema",++ "$id": "https://openvibe.network/contracts/ai/model-directory-list.v1.json",++ "title": "AiModelDirectoryList",++ "description": "ai.model-directory-list@1: public model directory response; the list may include spotted, disabled and retired models.",++ "type": "object",++ "required": ["models", "count"],++ "additionalProperties": true,++ "properties": {++ "generated_at": {"type": "string"},++ "count": {"type": "integer", "minimum": 0},++ "models": {"type": "array", "items": {"$ref": "model-directory-entry.v1.json"}}++ }++}@@@ -2,7 +2,7 @@"$schema": "https://json-schema.org/draft/2020-12/schema","$id": "https://openvibe.network/contracts/bot/command-result.v1.json","title": "BotCommandResult",-- "description": "bot.command-result@1: the command_result frame OpenVibe.Bot answers a bot.command@1 with on the operator WebSocket (server/realtime.js). result: ack or nack (the device answered; reason is its fault code, latency_ms the round trip), refused (the gate refused it; code is Bot's refusal code such as bot.estop_latched, bot.cooldown or bot.device_offline, and reason says why), expired (no answer before the deadline) or pending (the same id is still in flight). cached is true when a repeated id is answered from the first result. An ack of a computer command (exec, fs, screen) carries its answer in data.",++ "description": "bot.command-result@1: the command_result frame OpenVibe.Bot answers a bot.command@1 with on the operator WebSocket (server/realtime.js). result: ack or nack (the device answered; reason is its fault code, latency_ms the round trip), refused (the gate refused it; code is Bot's refusal code such as bot.estop_latched, bot.cooldown or bot.device_offline, and reason says why), expired (no answer before the deadline) or pending (the same id is still in flight). cached is true when a repeated id is answered from the first result. An ack of a computer command (exec, fs, screen) carries its answer in data. delivery says whether the command reached the machine (delivered, not_delivered, uncertain); retry says whether repeating it is safe. Only not_delivered is safe to repeat: a delivered command already ran, and an uncertain one may have.","type": "object","required": ["v",@@@ -62,6 +62,33 @@"data": {"type": "object","description": "A computer command's answer as the machine gave it (exec: exit_code, stdout, stderr, truncated, timed_out, duration_ms; fs: entries, the stat, content_b64, written, created; screen: format, width, height, content_b64). Present only on an ack of exec, fs or screen."++ },++ "delivery": {++ "type": "string",++ "enum": [++ "delivered",++ "not_delivered",++ "uncertain"++ ],++ "description": "Whether the command reached the machine. Both senders and the device report it; absent means unknown."++ },++ "retry": {++ "type": "object",++ "description": "Whether repeating the command is safe. safe is true only when delivery is not_delivered.",++ "additionalProperties": false,++ "required": [++ "safe"++ ],++ "properties": {++ "safe": {++ "type": "boolean"++ },++ "reason": {++ "type": "string",++ "minLength": 1,++ "maxLength": 500++ }++ }}}}@@@ -472,6 +472,12 @@"pattern": "^https?://","description": "an http or https address"},++ "origins": {++ "type": "array",++ "maxItems": 32,++ "items": { "type": "string", "minLength": 8, "maxLength": 2048, "pattern": "^https?://" },++ "description": "Optional exact task origins. Link checks scheme, host and port and refuses other navigation and browser egress. Empty allows no network origin; absent keeps the legacy browser policy."++ },"selector": {"type": "string","minLength": 1,@@@ -27,6 +27,12 @@"height": {"$ref": "desk-lease.v1.json#/properties/height","description": "Default 800."++ },++ "origins": {++ "type": "array",++ "maxItems": 32,++ "items": { "type": "string", "minLength": 8, "maxLength": 2048, "pattern": "^https?://" },++ "description": "The session's exact browser origins, fixed for this lease. Empty allows no network origin; absent keeps the legacy policy. A shared desk that cannot enforce the list is refused."}}}@@@ -1754,6 +1754,24 @@"compatibility": "backward","status": "active"},++ {++ "id": "ai.model-directory-entry",++ "version": "1.0.0",++ "owner": "ai",++ "schema": "ai/model-directory-entry.v1.json",++ "visibility": "public",++ "compatibility": "backward",++ "status": "active"++ },++ {++ "id": "ai.model-directory-list",++ "version": "1.0.0",++ "owner": "ai",++ "schema": "ai/model-directory-list.v1.json",++ "visibility": "public",++ "compatibility": "backward",++ "status": "active"++ },{"id": "ai.model-read-result","version": "1.0.0",@@@ -8515,9 +8533,18 @@"compatibility": "backward","status": "active"},++ {++ "id": "codes.model-plan",++ "version": "1.0.0",++ "owner": "codes",++ "schema": "codes/model-plan.v1.json",++ "visibility": "public",++ "compatibility": "backward",++ "status": "active"++ },{"id": "codes.task-start-request",-- "version": "1.1.0",++ "version": "1.2.0","owner": "codes","schema": "codes/task-start-request.v1.json","visibility": "first-party",@@@ -8544,7 +8571,7 @@},{"id": "codes.task",-- "version": "2.0.0",++ "version": "2.1.0","owner": "codes","schema": "codes/task.v2.json","visibility": "first-party",@@@ -10811,6 +10838,15 @@"compatibility": "backward","status": "active"},++ {++ "id": "meme.caption.created",++ "version": "1.0.0",++ "owner": "meme",++ "schema": "events/payloads/meme.caption.created.v1.json",++ "visibility": "first-party",++ "compatibility": "backward",++ "status": "active"++ },{"id": "meme.template","version": "1.0.0",nnew file mode 100644@@@ -0,0 +1,54 @@++{++ "$schema": "https://json-schema.org/draft/2020-12/schema",++ "$id": "https://openvibe.network/contracts/codes/model-plan.v1.json",++ "title": "CodesModelPlan",++ "description": "codes.model-plan@1: a versioned execution plan for a Codes task. Roles are attempted in list order. The ladder names AI registry ids in fallback order; auto asks AI to route. A pair requires reviewer approval, a council has two or three planner samples and a judge, and escalation advances on a failed check, refusal, or low confidence.",++ "type": "object",++ "additionalProperties": false,++ "required": ["mode", "roles", "checks"],++ "properties": {++ "mode": { "enum": ["single", "pair", "council", "escalate"] },++ "roles": {++ "type": "array",++ "minItems": 1,++ "maxItems": 8,++ "items": {++ "type": "object",++ "additionalProperties": false,++ "required": ["role", "model", "effort"],++ "properties": {++ "role": { "enum": ["planner", "builder", "reviewer", "verifier"] },++ "model": { "type": "string", "minLength": 1, "maxLength": 200, "pattern": "^(auto|[A-Za-z0-9][A-Za-z0-9._:/@+-]*)$" },++ "effort": { "enum": ["none", "low", "medium", "high", "xhigh", "max"] },++ "samples": { "type": "integer", "minimum": 1, "maximum": 5 },++ "budget": {++ "type": "object", "additionalProperties": false, "minProperties": 1,++ "properties": {++ "tokens": { "type": "integer", "minimum": 1, "maximum": 100000000 },++ "minutes": { "type": "number", "exclusiveMinimum": 0, "maximum": 1440 },++ "dollars": { "type": "number", "exclusiveMinimum": 0, "maximum": 10000 }++ }++ }++ }++ }++ },++ "ladder": {++ "type": "array", "minItems": 1, "maxItems": 8, "uniqueItems": true,++ "items": { "type": "string", "minLength": 1, "maxLength": 200, "pattern": "^(auto|[A-Za-z0-9][A-Za-z0-9._:/@+-]*)$" }++ },++ "checks": {++ "type": "object", "additionalProperties": false, "minProperties": 1,++ "properties": {++ "tests": { "type": "boolean" },++ "lint": { "type": "boolean" },++ "reviewer": { "type": "boolean" }++ }++ }++ },++ "allOf": [++ { "if": { "properties": { "mode": { "const": "pair" } } }, "then": { "properties": { "roles": { "type": "array", "contains": { "type": "object", "properties": { "role": { "const": "reviewer" } }, "required": ["role"] } }, "checks": { "type": "object", "properties": { "reviewer": { "const": true } }, "required": ["reviewer"] } } } },++ { "if": { "properties": { "mode": { "const": "council" } } }, "then": { "properties": { "roles": { "type": "array", "contains": { "type": "object", "properties": { "role": { "const": "planner" }, "samples": { "type": "integer", "minimum": 2, "maximum": 3 } }, "required": ["role", "samples"] } } } } },++ { "if": { "properties": { "mode": { "const": "escalate" } } }, "then": { "required": ["ladder"], "properties": { "ladder": { "type": "array", "minItems": 2 } } } },++ { "properties": { "roles": { "type": "array", "contains": { "type": "object", "properties": { "role": { "const": "builder" } }, "required": ["role"] } } } }++ ]++}@@@ -41,6 +41,12 @@"goal": {"$ref": "../agent/goal.v1.json"},++ "plan": {++ "$ref": "model-plan.v1.json"++ },++ "preset": {++ "enum": ["Fast", "Balanced", "Deep", "Council"]++ },"push": {"type": "boolean"},@@@ -65,5 +71,6 @@"maxLength": 256,"description": "The OpenVibe.Actor step id when this coding task was started from Actor."}-- }++ },++ "not": { "required": ["plan", "preset"] }}@@@ -48,6 +48,25 @@],"maxLength": 41},++ "model_plan": { "$ref": "model-plan.v1.json" },++ "preset": { "enum": ["Fast", "Balanced", "Deep", "Council"] },++ "role_runs": {++ "type": "array", "maxItems": 30,++ "items": {++ "type": "object", "additionalProperties": false,++ "required": ["role", "model", "outcome", "tokens", "cost_usd", "duration_ms"],++ "properties": {++ "role": { "enum": ["planner", "builder", "reviewer", "verifier"] },++ "model": { "type": "string", "maxLength": 200 },++ "effort": { "enum": ["none", "low", "medium", "high", "xhigh", "max"] },++ "outcome": { "enum": ["approved", "rejected", "passed", "failed", "refused", "low_confidence", "skipped"] },++ "tokens": { "type": "integer", "minimum": 0 },++ "cost_usd": { "type": "number", "minimum": 0 },++ "duration_ms": { "type": "integer", "minimum": 0 },++ "reason": { "type": "string", "maxLength": 1000 }++ }++ }++ },"url": {"type": "string","format": "uri",@@@ -2,7 +2,7 @@"$schema": "https://json-schema.org/draft/2020-12/schema","$id": "https://openvibe.network/contracts/community/comment-write-request.v1.json","title": "CommunityCommentWriteRequest",-- "description": "community.comment-write-request@1: bodies of community.comment.write on OpenVibe.Community (people, anonymous people with a name where the thread allows it, and services acting as X-OV-Subject or as AI). POST /api/v1/comments/threads/resolve: { ref } — get or create the thread of an entity (browsers only for the allow-listed entity types; a label is taken only from a service). POST /api/v1/comments/threads/:id/comments: { message, parent_id?, anon_name? } (message trimmed, at most 5000 characters; a reply to a reply joins the top-level comment). POST /api/v1/comments/:commentId/votes: { value: 1 | -1 | 0 } (people). GET /api/v1/comments/threads/:id and DELETE /api/v1/comments/:commentId take no body. Unknown fields are ignored.",++ "description": "community.comment-write-request@1: bodies of community.comment.write on OpenVibe.Community (people, anonymous people with a name where the thread allows it, and services acting as X-OV-Subject or as AI). POST /api/v1/comments/threads/resolve: { ref } \u2014 get or create the thread of an entity (browsers only for the allow-listed entity types; a label is taken only from a service). POST /api/v1/comments/threads/:id/comments: { message, parent_id?, anon_name?, attachments? } (message trimmed, at most 5000 characters; a reply to a reply joins the top-level comment). POST /api/v1/comments/:commentId/votes: { value: 1 | -1 | 0 } (people). GET /api/v1/comments/threads/:id and DELETE /api/v1/comments/:commentId take no body. Unknown fields are ignored.","anyOf": [{"type": "object",@@@ -39,6 +39,13 @@"string","null"]++ },++ "attachments": {++ "type": "array",++ "maxItems": 4,++ "items": {++ "$ref": "../ai/file.v1.json"++ }}}},@@@ -2,7 +2,7 @@"$schema": "https://json-schema.org/draft/2020-12/schema","$id": "https://openvibe.network/contracts/community/comment.v1.json","title": "CommunityComment",-- "description": "community.comment@1: one comment in an embeddable comment thread on OpenVibe.Community (server/comments/service.js shapeComment), with its author (or anonymous name), score and the caller's vote, reply count and, for top-level comments in a page, the first replies. A deleted comment keeps its place with no author or message.",++ "description": "community.comment@1: one comment in an embeddable comment thread on OpenVibe.Community (server/comments/service.js shapeComment), with its author (or anonymous name), score and the caller's vote, reply count and, for top-level comments in a page, the first two replies. A deleted comment keeps its place with no author or message.","type": "object","required": ["id",@@@ -158,6 +158,34 @@"items": {"type": "object"}++ },++ "reply_to_id": {++ "type": [++ "integer",++ "null"++ ],++ "description": "The exact comment answered; parent_id remains the top-level comment."++ },++ "reply_to": {++ "type": [++ "object",++ "null"++ ],++ "properties": {++ "id": {++ "type": "integer"++ },++ "display_name": {++ "type": "string"++ }++ }++ },++ "attachments": {++ "type": "array",++ "maxItems": 4,++ "items": {++ "$ref": "../ai/file.v1.json"++ }}}}nnew file mode 100644@@@ -0,0 +1,14 @@++{++ "$schema": "https://json-schema.org/draft/2020-12/schema",++ "$id": "https://openvibe.network/contracts/events/payloads/meme.caption.created.v1.json",++ "title": "MemeCaptionCreatedPayload",++ "description": "meme.caption.created v1 (OpenVibe.Meme): a signed-in person saved a public caption. The event names only its id and owner, never the caption text, template, or other people's content. Envelope source meme, actor the owner, subject the caption, visibility internal.",++ "type": "object",++ "required": ["caption_id", "owner", "created_at"],++ "additionalProperties": false,++ "properties": {++ "caption_id": { "type": "string", "pattern": "^mcp_[0-9A-HJKMNP-TV-Z]{26}$" },++ "owner": { "$ref": "../../identity/subject-ref.v1.json" },++ "created_at": { "type": "string", "format": "date-time" }++ }++}@@@ -46,6 +46,20 @@"type": "object","description": "The desk's answer on an ack (bot.command-result@1 data)."},++ "delivery": {++ "enum": ["delivered", "not_delivered", "uncertain"],++ "description": "Whether the command reached the machine. Absent on older servers means unknown."++ },++ "retry": {++ "type": "object",++ "additionalProperties": false,++ "required": ["safe"],++ "properties": {++ "safe": { "type": "boolean" },++ "reason": { "type": "string", "minLength": 1, "maxLength": 500 }++ },++ "description": "safe is true only when delivery is not_delivered."++ },"state": {"$ref": "session.v1.json#/properties/state"}@@@ -33,6 +33,12 @@"pattern": "^dev_[0-9A-HJKMNP-TV-Z]{26}$","description": "One of the person's own machines, by its OpenVibe.Bot id; the session goes there or nowhere."},++ "origins": {++ "type": "array",++ "maxItems": 32,++ "items": { "type": "string", "minLength": 8, "maxLength": 2048, "pattern": "^https?://" },++ "description": "Exact HTTP(S) origins allowed for this browser session. Run fixes the list at creation and places it only on a user-owned desk that can enforce it. This option is owner switched off by default."++ },"requirements": {"$ref": "../platform/workload-requirements.v1.json"},nnew file mode 100644@@@ -0,0 +1,8 @@++{++ "id": "arena/anonymous-silver",++ "provider": "arena",++ "model": "anonymous-silver",++ "name": "anonymous-silver",++ "status": "spotted",++ "routing_enabled": true++}nnew file mode 100644@@@ -0,0 +1,9 @@++{++ "id": "arena/anonymous-silver",++ "provider": "arena",++ "model": "anonymous-silver",++ "name": "anonymous-silver",++ "status": "spotted",++ "routing_enabled": false,++ "sources": [{"url": "https://lmarena.ai/leaderboard/text", "observed_at": "2026-11-11T00:00:00Z"}]++}nnew file mode 100644@@@ -0,0 +1,3 @@++{++ "models": []++}nnew file mode 100644@@@ -0,0 +1,7 @@++{++ "count": 2,++ "models": [++ {"id": "google/gemini-preview", "provider": "google", "model": "gemini-preview", "name": "Gemini Preview", "status": "preview", "routing_enabled": false},++ {"id": "google/gemini-old", "provider": "google", "model": "gemini-old", "name": "Gemini Old", "status": "retired", "routing_enabled": false}++ ]++}nnew file mode 100644@@@ -0,0 +1,12 @@++{++ "v": 1,++ "seq": 17,++ "ts": 1759600000017,++ "type": "command_result",++ "id": "op-11",++ "result": "ack",++ "delivery": "maybe",++ "retry": {++ "safe": true++ }++}nnew file mode 100644@@@ -0,0 +1,15 @@++{++ "v": 1,++ "seq": 16,++ "ts": 1759600000016,++ "type": "command_result",++ "id": "op-10",++ "result": "ack",++ "reason": null,++ "latency_ms": 87,++ "delivery": "delivered",++ "retry": {++ "safe": false,++ "reason": "the command already ran; repeating it runs it twice"++ }++}nnew file mode 100644@@@ -0,0 +1,14 @@++{++ "v": 1,++ "seq": 15,++ "ts": 1759600000015,++ "type": "command_result",++ "id": "op-9",++ "result": "expired",++ "reason": "no answer before the deadline; the machine never confirmed receipt",++ "delivery": "not_delivered",++ "retry": {++ "safe": true,++ "reason": "the command never reached the machine"++ }++}nnew file mode 100644@@@ -0,0 +1 @@++{"mode":"single","roles":[{"role":"builder","model":"auto","effort":"ultra"}],"checks":{"tests":true}}nnew file mode 100644@@@ -0,0 +1 @@++{"mode":"council","roles":[{"role":"planner","model":"auto","effort":"high","samples":1},{"role":"builder","model":"auto","effort":"high"}],"checks":{"tests":true}}nnew file mode 100644@@@ -0,0 +1 @@++{"mode":"escalate","roles":[{"role":"builder","model":"auto","effort":"low"}],"checks":{"tests":true}}nnew file mode 100644@@@ -0,0 +1 @@++{"mode":"pair","roles":[{"role":"builder","model":"auto","effort":"high"}],"checks":{"tests":true}}nnew file mode 100644@@@ -0,0 +1 @@++{"mode":"council","roles":[{"role":"planner","model":"auto","effort":"high","samples":3},{"role":"builder","model":"auto","effort":"high"},{"role":"reviewer","model":"auto","effort":"high"},{"role":"verifier","model":"auto","effort":"medium"}],"checks":{"tests":true,"reviewer":true}}nnew file mode 100644@@@ -0,0 +1 @@++{"mode":"escalate","roles":[{"role":"builder","model":"auto","effort":"low"},{"role":"verifier","model":"auto","effort":"medium"}],"ladder":["openvibe/economy","openvibe/auto"],"checks":{"tests":true}}nnew file mode 100644@@@ -0,0 +1 @@++{"mode":"pair","roles":[{"role":"builder","model":"auto","effort":"high","budget":{"tokens":100000,"minutes":30,"dollars":2}},{"role":"reviewer","model":"openvibe/auto","effort":"medium"}],"checks":{"tests":true,"lint":true,"reviewer":true}}nnew file mode 100644@@@ -0,0 +1,6 @@++{++ "caption_id": "mcp_01M516F1WX5NN6C0EMW2V0G8Y9",++ "owner": { "type": "user", "id": "usr_01J8Z3V9Q6N1X2Y3Z4A5B6C7D8" },++ "created_at": "2026-11-11T03:00:00.000Z",++ "text": "Private content must not enter the event"++}nnew file mode 100644@@@ -0,0 +1,5 @@++{++ "caption_id": "mcp_01M516F1WX5NN6C0EMW2V0G8Y9",++ "owner": { "type": "user", "id": "usr_01J8Z3V9Q6N1X2Y3Z4A5B6C7D8" },++ "created_at": "2026-11-11T03:00:00.000Z"++}@@@ -19194,6 +19194,237 @@}}},++ "ai.model-directory-entry": {++ "version": "1.0.0",++ "owner": "ai",++ "status": "active",++ "schema": {++ "$schema": "https://json-schema.org/draft/2020-12/schema",++ "$id": "https://openvibe.network/contracts/ai/model-directory-entry.v1.json",++ "title": "AiModelDirectoryEntry",++ "description": "ai.model-directory-entry@1: one public model, including provider-listed models with routing off and sourced pre-list sightings. Spotted never means available.",++ "type": "object",++ "required": [++ "id",++ "provider",++ "model",++ "name",++ "status",++ "routing_enabled"++ ],++ "additionalProperties": true,++ "allOf": [++ {++ "if": {++ "properties": {++ "status": {++ "enum": [++ "spotted",++ "retired"++ ]++ }++ }++ },++ "then": {++ "properties": {++ "routing_enabled": {++ "const": false++ }++ }++ }++ }++ ],++ "properties": {++ "id": {++ "type": "string",++ "minLength": 3,++ "maxLength": 256++ },++ "provider": {++ "type": "string",++ "minLength": 1++ },++ "provider_name": {++ "type": [++ "string",++ "null"++ ]++ },++ "model": {++ "type": "string",++ "minLength": 1++ },++ "name": {++ "type": "string",++ "minLength": 1++ },++ "family": {++ "type": [++ "string",++ "null"++ ]++ },++ "version": {++ "type": [++ "string",++ "null"++ ]++ },++ "status": {++ "enum": [++ "available",++ "preview",++ "spotted",++ "retired"++ ]++ },++ "routing_enabled": {++ "type": "boolean"++ },++ "context_window": {++ "type": [++ "integer",++ "null"++ ],++ "minimum": 0++ },++ "max_output": {++ "type": [++ "integer",++ "null"++ ],++ "minimum": 0++ },++ "type": {++ "type": "string"++ },++ "modalities": {++ "type": "array",++ "items": {++ "type": "string"++ }++ },++ "price": {++ "type": "object",++ "properties": {++ "input_per_million": {++ "type": [++ "number",++ "null"++ ],++ "minimum": 0++ },++ "output_per_million": {++ "type": [++ "number",++ "null"++ ],++ "minimum": 0++ },++ "cached_per_million": {++ "type": [++ "number",++ "null"++ ],++ "minimum": 0++ },++ "source": {++ "type": [++ "string",++ "null"++ ],++ "format": "uri"++ },++ "checked_at": {++ "type": [++ "string",++ "null"++ ]++ }++ }++ },++ "source": {++ "type": [++ "string",++ "null"++ ],++ "format": "uri"++ },++ "sources": {++ "type": "array",++ "items": {++ "type": "object",++ "required": [++ "url",++ "observed_at"++ ],++ "properties": {++ "url": {++ "type": "string",++ "format": "uri"++ },++ "observed_at": {++ "type": "string"++ },++ "published_at": {++ "type": "string"++ }++ }++ }++ },++ "first_seen_at": {++ "type": [++ "string",++ "null"++ ]++ },++ "updated_at": {++ "type": [++ "string",++ "null"++ ]++ },++ "retired_at": {++ "type": [++ "string",++ "null"++ ]++ }++ }++ }++ },++ "ai.model-directory-list": {++ "version": "1.0.0",++ "owner": "ai",++ "status": "active",++ "schema": {++ "$schema": "https://json-schema.org/draft/2020-12/schema",++ "$id": "https://openvibe.network/contracts/ai/model-directory-list.v1.json",++ "title": "AiModelDirectoryList",++ "description": "ai.model-directory-list@1: public model directory response; the list may include spotted, disabled and retired models.",++ "type": "object",++ "required": [++ "models",++ "count"++ ],++ "additionalProperties": true,++ "properties": {++ "generated_at": {++ "type": "string"++ },++ "count": {++ "type": "integer",++ "minimum": 0++ },++ "models": {++ "type": "array",++ "items": {++ "$ref": "model-directory-entry.v1.json"++ }++ }++ }++ }++ },"ai.model-read-result": {"version": "1.0.0","owner": "ai",@@@ -68717,7 +68948,7 @@"$schema": "https://json-schema.org/draft/2020-12/schema","$id": "https://openvibe.network/contracts/community/comment-write-request.v1.json","title": "CommunityCommentWriteRequest",-- "description": "community.comment-write-request@1: bodies of community.comment.write on OpenVibe.Community (people, anonymous people with a name where the thread allows it, and services acting as X-OV-Subject or as AI). POST /api/v1/comments/threads/resolve: { ref } — get or create the thread of an entity (browsers only for the allow-listed entity types; a label is taken only from a service). POST /api/v1/comments/threads/:id/comments: { message, parent_id?, anon_name? } (message trimmed, at most 5000 characters; a reply to a reply joins the top-level comment). POST /api/v1/comments/:commentId/votes: { value: 1 | -1 | 0 } (people). GET /api/v1/comments/threads/:id and DELETE /api/v1/comments/:commentId take no body. Unknown fields are ignored.",++ "description": "community.comment-write-request@1: bodies of community.comment.write on OpenVibe.Community (people, anonymous people with a name where the thread allows it, and services acting as X-OV-Subject or as AI). POST /api/v1/comments/threads/resolve: { ref } — get or create the thread of an entity (browsers only for the allow-listed entity types; a label is taken only from a service). POST /api/v1/comments/threads/:id/comments: { message, parent_id?, anon_name?, attachments? } (message trimmed, at most 5000 characters; a reply to a reply joins the top-level comment). POST /api/v1/comments/:commentId/votes: { value: 1 | -1 | 0 } (people). GET /api/v1/comments/threads/:id and DELETE /api/v1/comments/:commentId take no body. Unknown fields are ignored.","anyOf": [{"type": "object",@@@ -68754,6 +68985,13 @@"string","null"]++ },++ "attachments": {++ "type": "array",++ "maxItems": 4,++ "items": {++ "$ref": "../ai/file.v1.json"++ }}}},@@@ -68919,7 +69157,7 @@"$schema": "https://json-schema.org/draft/2020-12/schema","$id": "https://openvibe.network/contracts/community/comment.v1.json","title": "CommunityComment",-- "description": "community.comment@1: one comment in an embeddable comment thread on OpenVibe.Community (server/comments/service.js shapeComment), with its author (or anonymous name), score and the caller's vote, reply count and, for top-level comments in a page, the first replies. A deleted comment keeps its place with no author or message.",++ "description": "community.comment@1: one comment in an embeddable comment thread on OpenVibe.Community (server/comments/service.js shapeComment), with its author (or anonymous name), score and the caller's vote, reply count and, for top-level comments in a page, the first two replies. A deleted comment keeps its place with no author or message.","type": "object","required": ["id",@@@ -69075,6 +69313,34 @@"items": {"type": "object"}++ },++ "reply_to_id": {++ "type": [++ "integer",++ "null"++ ],++ "description": "The exact comment answered; parent_id remains the top-level comment."++ },++ "reply_to": {++ "type": [++ "object",++ "null"++ ],++ "properties": {++ "id": {++ "type": "integer"++ },++ "display_name": {++ "type": "string"++ }++ }++ },++ "attachments": {++ "type": "array",++ "maxItems": 4,++ "items": {++ "$ref": "../ai/file.v1.json"++ }}}}@@@ -83414,6 +83680,17 @@"pattern": "^https?://","description": "an http or https address"},++ "origins": {++ "type": "array",++ "maxItems": 32,++ "items": {++ "type": "string",++ "minLength": 8,++ "maxLength": 2048,++ "pattern": "^https?://"++ },++ "description": "Optional exact task origins. Link checks scheme, host and port and refuses other navigation and browser egress. Empty allows no network origin; absent keeps the legacy browser policy."++ },"selector": {"type": "string","minLength": 1,@@@ -83852,7 +84129,7 @@"$schema": "https://json-schema.org/draft/2020-12/schema","$id": "https://openvibe.network/contracts/bot/command-result.v1.json","title": "BotCommandResult",-- "description": "bot.command-result@1: the command_result frame OpenVibe.Bot answers a bot.command@1 with on the operator WebSocket (server/realtime.js). result: ack or nack (the device answered; reason is its fault code, latency_ms the round trip), refused (the gate refused it; code is Bot's refusal code such as bot.estop_latched, bot.cooldown or bot.device_offline, and reason says why), expired (no answer before the deadline) or pending (the same id is still in flight). cached is true when a repeated id is answered from the first result. An ack of a computer command (exec, fs, screen) carries its answer in data.",++ "description": "bot.command-result@1: the command_result frame OpenVibe.Bot answers a bot.command@1 with on the operator WebSocket (server/realtime.js). result: ack or nack (the device answered; reason is its fault code, latency_ms the round trip), refused (the gate refused it; code is Bot's refusal code such as bot.estop_latched, bot.cooldown or bot.device_offline, and reason says why), expired (no answer before the deadline) or pending (the same id is still in flight). cached is true when a repeated id is answered from the first result. An ack of a computer command (exec, fs, screen) carries its answer in data. delivery says whether the command reached the machine (delivered, not_delivered, uncertain); retry says whether repeating it is safe. Only not_delivered is safe to repeat: a delivered command already ran, and an uncertain one may have.","type": "object","required": ["v",@@@ -83912,6 +84189,33 @@"data": {"type": "object","description": "A computer command's answer as the machine gave it (exec: exit_code, stdout, stderr, truncated, timed_out, duration_ms; fs: entries, the stat, content_b64, written, created; screen: format, width, height, content_b64). Present only on an ack of exec, fs or screen."++ },++ "delivery": {++ "type": "string",++ "enum": [++ "delivered",++ "not_delivered",++ "uncertain"++ ],++ "description": "Whether the command reached the machine. Both senders and the device report it; absent means unknown."++ },++ "retry": {++ "type": "object",++ "description": "Whether repeating the command is safe. safe is true only when delivery is not_delivered.",++ "additionalProperties": false,++ "required": [++ "safe"++ ],++ "properties": {++ "safe": {++ "type": "boolean"++ },++ "reason": {++ "type": "string",++ "minLength": 1,++ "maxLength": 500++ }++ }}}}@@@ -95017,8 +95321,242 @@]}},++ "codes.model-plan": {++ "version": "1.0.0",++ "owner": "codes",++ "status": "active",++ "schema": {++ "$schema": "https://json-schema.org/draft/2020-12/schema",++ "$id": "https://openvibe.network/contracts/codes/model-plan.v1.json",++ "title": "CodesModelPlan",++ "description": "codes.model-plan@1: a versioned execution plan for a Codes task. Roles are attempted in list order. The ladder names AI registry ids in fallback order; auto asks AI to route. A pair requires reviewer approval, a council has two or three planner samples and a judge, and escalation advances on a failed check, refusal, or low confidence.",++ "type": "object",++ "additionalProperties": false,++ "required": [++ "mode",++ "roles",++ "checks"++ ],++ "properties": {++ "mode": {++ "enum": [++ "single",++ "pair",++ "council",++ "escalate"++ ]++ },++ "roles": {++ "type": "array",++ "minItems": 1,++ "maxItems": 8,++ "items": {++ "type": "object",++ "additionalProperties": false,++ "required": [++ "role",++ "model",++ "effort"++ ],++ "properties": {++ "role": {++ "enum": [++ "planner",++ "builder",++ "reviewer",++ "verifier"++ ]++ },++ "model": {++ "type": "string",++ "minLength": 1,++ "maxLength": 200,++ "pattern": "^(auto|[A-Za-z0-9][A-Za-z0-9._:/@+-]*)$"++ },++ "effort": {++ "enum": [++ "none",++ "low",++ "medium",++ "high",++ "xhigh",++ "max"++ ]++ },++ "samples": {++ "type": "integer",++ "minimum": 1,++ "maximum": 5++ },++ "budget": {++ "type": "object",++ "additionalProperties": false,++ "minProperties": 1,++ "properties": {++ "tokens": {++ "type": "integer",++ "minimum": 1,++ "maximum": 100000000++ },++ "minutes": {++ "type": "number",++ "exclusiveMinimum": 0,++ "maximum": 1440++ },++ "dollars": {++ "type": "number",++ "exclusiveMinimum": 0,++ "maximum": 10000++ }++ }++ }++ }++ }++ },++ "ladder": {++ "type": "array",++ "minItems": 1,++ "maxItems": 8,++ "uniqueItems": true,++ "items": {++ "type": "string",++ "minLength": 1,++ "maxLength": 200,++ "pattern": "^(auto|[A-Za-z0-9][A-Za-z0-9._:/@+-]*)$"++ }++ },++ "checks": {++ "type": "object",++ "additionalProperties": false,++ "minProperties": 1,++ "properties": {++ "tests": {++ "type": "boolean"++ },++ "lint": {++ "type": "boolean"++ },++ "reviewer": {++ "type": "boolean"++ }++ }++ }++ },++ "allOf": [++ {++ "if": {++ "properties": {++ "mode": {++ "const": "pair"++ }++ }++ },++ "then": {++ "properties": {++ "roles": {++ "type": "array",++ "contains": {++ "type": "object",++ "properties": {++ "role": {++ "const": "reviewer"++ }++ },++ "required": [++ "role"++ ]++ }++ },++ "checks": {++ "type": "object",++ "properties": {++ "reviewer": {++ "const": true++ }++ },++ "required": [++ "reviewer"++ ]++ }++ }++ }++ },++ {++ "if": {++ "properties": {++ "mode": {++ "const": "council"++ }++ }++ },++ "then": {++ "properties": {++ "roles": {++ "type": "array",++ "contains": {++ "type": "object",++ "properties": {++ "role": {++ "const": "planner"++ },++ "samples": {++ "type": "integer",++ "minimum": 2,++ "maximum": 3++ }++ },++ "required": [++ "role",++ "samples"++ ]++ }++ }++ }++ }++ },++ {++ "if": {++ "properties": {++ "mode": {++ "const": "escalate"++ }++ }++ },++ "then": {++ "required": [++ "ladder"++ ],++ "properties": {++ "ladder": {++ "type": "array",++ "minItems": 2++ }++ }++ }++ },++ {++ "properties": {++ "roles": {++ "type": "array",++ "contains": {++ "type": "object",++ "properties": {++ "role": {++ "const": "builder"++ }++ },++ "required": [++ "role"++ ]++ }++ }++ }++ }++ ]++ }++ },"codes.task-start-request": {-- "version": "1.1.0",++ "version": "1.2.0","owner": "codes","status": "active","schema": {@@@ -95064,6 +95602,17 @@"goal": {"$ref": "../agent/goal.v1.json"},++ "plan": {++ "$ref": "model-plan.v1.json"++ },++ "preset": {++ "enum": [++ "Fast",++ "Balanced",++ "Deep",++ "Council"++ ]++ },"push": {"type": "boolean"},@@@ -95088,6 +95637,12 @@"maxLength": 256,"description": "The OpenVibe.Actor step id when this coding task was started from Actor."}++ },++ "not": {++ "required": [++ "plan",++ "preset"++ ]}}},@@@ -95321,7 +95876,7 @@}},"codes.task@2": {-- "version": "2.0.0",++ "version": "2.1.0","owner": "codes","status": "active","schema": {@@@ -95374,6 +95929,84 @@],"maxLength": 41},++ "model_plan": {++ "$ref": "model-plan.v1.json"++ },++ "preset": {++ "enum": [++ "Fast",++ "Balanced",++ "Deep",++ "Council"++ ]++ },++ "role_runs": {++ "type": "array",++ "maxItems": 30,++ "items": {++ "type": "object",++ "additionalProperties": false,++ "required": [++ "role",++ "model",++ "outcome",++ "tokens",++ "cost_usd",++ "duration_ms"++ ],++ "properties": {++ "role": {++ "enum": [++ "planner",++ "builder",++ "reviewer",++ "verifier"++ ]++ },++ "model": {++ "type": "string",++ "maxLength": 200++ },++ "effort": {++ "enum": [++ "none",++ "low",++ "medium",++ "high",++ "xhigh",++ "max"++ ]++ },++ "outcome": {++ "enum": [++ "approved",++ "rejected",++ "passed",++ "failed",++ "refused",++ "low_confidence",++ "skipped"++ ]++ },++ "tokens": {++ "type": "integer",++ "minimum": 0++ },++ "cost_usd": {++ "type": "number",++ "minimum": 0++ },++ "duration_ms": {++ "type": "integer",++ "minimum": 0++ },++ "reason": {++ "type": "string",++ "maxLength": 1000++ }++ }++ }++ },"url": {"type": "string","format": "uri",@@@ -97719,6 +98352,17 @@"pattern": "^dev_[0-9A-HJKMNP-TV-Z]{26}$","description": "One of the person's own machines, by its OpenVibe.Bot id; the session goes there or nowhere."},++ "origins": {++ "type": "array",++ "maxItems": 32,++ "items": {++ "type": "string",++ "minLength": 8,++ "maxLength": 2048,++ "pattern": "^https?://"++ },++ "description": "Exact HTTP(S) origins allowed for this browser session. Run fixes the list at creation and places it only on a user-owned desk that can enforce it. This option is owner switched off by default."++ },"requirements": {"$ref": "../platform/workload-requirements.v1.json"},@@@ -97855,6 +98499,32 @@"type": "object","description": "The desk's answer on an ack (bot.command-result@1 data)."},++ "delivery": {++ "enum": [++ "delivered",++ "not_delivered",++ "uncertain"++ ],++ "description": "Whether the command reached the machine. Absent on older servers means unknown."++ },++ "retry": {++ "type": "object",++ "additionalProperties": false,++ "required": [++ "safe"++ ],++ "properties": {++ "safe": {++ "type": "boolean"++ },++ "reason": {++ "type": "string",++ "minLength": 1,++ "maxLength": 500++ }++ },++ "description": "safe is true only when delivery is not_delivered."++ },"state": {"$ref": "session.v1.json#/properties/state"}@@@ -98412,6 +99082,17 @@"height": {"$ref": "desk-lease.v1.json#/properties/height","description": "Default 800."++ },++ "origins": {++ "type": "array",++ "maxItems": 32,++ "items": {++ "type": "string",++ "minLength": 8,++ "maxLength": 2048,++ "pattern": "^https?://"++ },++ "description": "The session's exact browser origins, fixed for this lease. Empty allows no network origin; absent keeps the legacy policy. A shared desk that cannot enforce the list is refused."}}}@@@ -118613,6 +119294,37 @@"additionalProperties": true}},++ "meme.caption.created": {++ "version": "1.0.0",++ "owner": "meme",++ "status": "active",++ "schema": {++ "$schema": "https://json-schema.org/draft/2020-12/schema",++ "$id": "https://openvibe.network/contracts/events/payloads/meme.caption.created.v1.json",++ "title": "MemeCaptionCreatedPayload",++ "description": "meme.caption.created v1 (OpenVibe.Meme): a signed-in person saved a public caption. The event names only its id and owner, never the caption text, template, or other people's content. Envelope source meme, actor the owner, subject the caption, visibility internal.",++ "type": "object",++ "required": [++ "caption_id",++ "owner",++ "created_at"++ ],++ "additionalProperties": false,++ "properties": {++ "caption_id": {++ "type": "string",++ "pattern": "^mcp_[0-9A-HJKMNP-TV-Z]{26}$"++ },++ "owner": {++ "$ref": "../../identity/subject-ref.v1.json"++ },++ "created_at": {++ "type": "string",++ "format": "date-time"++ }++ }++ }++ },"meme.template": {"version": "1.0.0","owner": "meme",@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Actor API",-- "version": "0.405.0",-- "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.405.0): each operation lists the capabilities it performs; a token for 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.406.0",++ "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.406.0): each operation lists the capabilities it performs; a token for 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.405.0",-- "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.405.0): each operation lists the capabilities it performs; a token for 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.406.0",++ "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.406.0): each operation lists the capabilities it performs; a token for 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.405.0",-- "description": "Routes of OpenVibe.Bench as the OpenVibe contracts describe them (openvibe-contracts 0.405.0): each operation lists the capabilities it performs; a token for 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.406.0",++ "description": "Routes of OpenVibe.Bench as the OpenVibe contracts describe them (openvibe-contracts 0.406.0): each operation lists the capabilities it performs; a token for 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.405.0",-- "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.405.0): each operation lists the capabilities it performs; a token for 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.406.0",++ "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.406.0): each operation lists the capabilities it performs; a token for 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.405.0",-- "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.405.0): each operation lists the capabilities it performs; a token for 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.406.0",++ "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.406.0): each operation lists the capabilities it performs; a token for 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.405.0",-- "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.405.0): each operation lists the capabilities it performs; a token for 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.406.0",++ "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.406.0): each operation lists the capabilities it performs; a token for 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"@@@ -787,6 +787,23 @@"description": "Default 800."},"description": "Default 800."++ },++ {++ "name": "origins",++ "in": "query",++ "required": false,++ "schema": {++ "type": "array",++ "maxItems": 32,++ "items": {++ "type": "string",++ "minLength": 8,++ "maxLength": 2048,++ "pattern": "^https?://"++ },++ "description": "The session's exact browser origins, fixed for this lease. Empty allows no network origin; absent keeps the legacy policy. A shared desk that cannot enforce the list is refused."++ },++ "description": "The session's exact browser origins, fixed for this lease. Empty allows no network origin; absent keeps the legacy policy. A shared desk that cannot enforce the list is refused."}],"responses": {@@@ -888,6 +905,23 @@"description": "Default 800."},"description": "Default 800."++ },++ {++ "name": "origins",++ "in": "query",++ "required": false,++ "schema": {++ "type": "array",++ "maxItems": 32,++ "items": {++ "type": "string",++ "minLength": 8,++ "maxLength": 2048,++ "pattern": "^https?://"++ },++ "description": "The session's exact browser origins, fixed for this lease. Empty allows no network origin; absent keeps the legacy policy. A shared desk that cannot enforce the list is refused."++ },++ "description": "The session's exact browser origins, fixed for this lease. Empty allows no network origin; absent keeps the legacy policy. A shared desk that cannot enforce the list is refused."}],"responses": {@@@ -2295,6 +2329,17 @@"height": {"$ref": "#/components/schemas/bot.desk-lease.v1/properties/height","description": "Default 800."++ },++ "origins": {++ "type": "array",++ "maxItems": 32,++ "items": {++ "type": "string",++ "minLength": 8,++ "maxLength": 2048,++ "pattern": "^https?://"++ },++ "description": "The session's exact browser origins, fixed for this lease. Empty allows no network origin; absent keeps the legacy policy. A shared desk that cannot enforce the list is refused."}}},@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Chat API",-- "version": "0.405.0",-- "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.405.0): each operation lists the capabilities it performs; a token for 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.406.0",++ "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.406.0): each operation lists the capabilities it performs; a token for 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.405.0",-- "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.405.0): each operation lists the capabilities it performs; a token for 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.406.0",++ "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.406.0): each operation lists the capabilities it performs; a token for 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"@@@ -927,6 +927,233 @@}}},++ "codes.model-plan.v1": {++ "title": "CodesModelPlan",++ "description": "codes.model-plan@1: a versioned execution plan for a Codes task. Roles are attempted in list order. The ladder names AI registry ids in fallback order; auto asks AI to route. A pair requires reviewer approval, a council has two or three planner samples and a judge, and escalation advances on a failed check, refusal, or low confidence.",++ "type": "object",++ "additionalProperties": false,++ "required": [++ "mode",++ "roles",++ "checks"++ ],++ "properties": {++ "mode": {++ "enum": [++ "single",++ "pair",++ "council",++ "escalate"++ ]++ },++ "roles": {++ "type": "array",++ "minItems": 1,++ "maxItems": 8,++ "items": {++ "type": "object",++ "additionalProperties": false,++ "required": [++ "role",++ "model",++ "effort"++ ],++ "properties": {++ "role": {++ "enum": [++ "planner",++ "builder",++ "reviewer",++ "verifier"++ ]++ },++ "model": {++ "type": "string",++ "minLength": 1,++ "maxLength": 200,++ "pattern": "^(auto|[A-Za-z0-9][A-Za-z0-9._:/@+-]*)$"++ },++ "effort": {++ "enum": [++ "none",++ "low",++ "medium",++ "high",++ "xhigh",++ "max"++ ]++ },++ "samples": {++ "type": "integer",++ "minimum": 1,++ "maximum": 5++ },++ "budget": {++ "type": "object",++ "additionalProperties": false,++ "minProperties": 1,++ "properties": {++ "tokens": {++ "type": "integer",++ "minimum": 1,++ "maximum": 100000000++ },++ "minutes": {++ "type": "number",++ "exclusiveMinimum": 0,++ "maximum": 1440++ },++ "dollars": {++ "type": "number",++ "exclusiveMinimum": 0,++ "maximum": 10000++ }++ }++ }++ }++ }++ },++ "ladder": {++ "type": "array",++ "minItems": 1,++ "maxItems": 8,++ "uniqueItems": true,++ "items": {++ "type": "string",++ "minLength": 1,++ "maxLength": 200,++ "pattern": "^(auto|[A-Za-z0-9][A-Za-z0-9._:/@+-]*)$"++ }++ },++ "checks": {++ "type": "object",++ "additionalProperties": false,++ "minProperties": 1,++ "properties": {++ "tests": {++ "type": "boolean"++ },++ "lint": {++ "type": "boolean"++ },++ "reviewer": {++ "type": "boolean"++ }++ }++ }++ },++ "allOf": [++ {++ "if": {++ "properties": {++ "mode": {++ "const": "pair"++ }++ }++ },++ "then": {++ "properties": {++ "roles": {++ "type": "array",++ "contains": {++ "type": "object",++ "properties": {++ "role": {++ "const": "reviewer"++ }++ },++ "required": [++ "role"++ ]++ }++ },++ "checks": {++ "type": "object",++ "properties": {++ "reviewer": {++ "const": true++ }++ },++ "required": [++ "reviewer"++ ]++ }++ }++ }++ },++ {++ "if": {++ "properties": {++ "mode": {++ "const": "council"++ }++ }++ },++ "then": {++ "properties": {++ "roles": {++ "type": "array",++ "contains": {++ "type": "object",++ "properties": {++ "role": {++ "const": "planner"++ },++ "samples": {++ "type": "integer",++ "minimum": 2,++ "maximum": 3++ }++ },++ "required": [++ "role",++ "samples"++ ]++ }++ }++ }++ }++ },++ {++ "if": {++ "properties": {++ "mode": {++ "const": "escalate"++ }++ }++ },++ "then": {++ "required": [++ "ladder"++ ],++ "properties": {++ "ladder": {++ "type": "array",++ "minItems": 2++ }++ }++ }++ },++ {++ "properties": {++ "roles": {++ "type": "array",++ "contains": {++ "type": "object",++ "properties": {++ "role": {++ "const": "builder"++ }++ },++ "required": [++ "role"++ ]++ }++ }++ }++ }++ ]++ },"codes.task-start-request.v1": {"title": "CodesTaskStartRequest","description": "codes.task-start-request@1: the body of POST /api/v1/tasks on OpenVibe.Codes (capability codes.task.start). A first-party service (OpenVibe.Actor) starts a coding task for a person, named with X-OV-Subject: Codes runs it on that person's own machine through OpenVibe.Run (openvibe.codes/run, plan T16), in the project of their latest task there, so the person has used openvibe.codes/run once before a service can start one for them (else 409 codes.no_project). REPO is an https git URL with no credentials; REF a branch or tag to start from (default: the repository's default branch). PROMPT is the task. AGENT names one of Codes' agents (GET /harnesses), absent for Codes' router to pick. PERMISSION: review (read-only: research, audits, reviews; nothing is changed), edit (default; the agents edit files) or full (they may also run commands: tests, installs). PUSH asks for the change on a new branch (GitHub, with the machine's GITHUB_TOKEN; never the branch it started from), PULL_REQUEST also opens a pull request. IDEMPOTENCY_KEY: a repeat for the same person with the same key answers the first task (200, created false).",@@@ -968,6 +1195,17 @@"goal": {"$ref": "#/components/schemas/agent.goal.v1"},++ "plan": {++ "$ref": "#/components/schemas/codes.model-plan.v1"++ },++ "preset": {++ "enum": [++ "Fast",++ "Balanced",++ "Deep",++ "Council"++ ]++ },"push": {"type": "boolean"},@@@ -992,6 +1230,12 @@"maxLength": 256,"description": "The OpenVibe.Actor step id when this coding task was started from Actor."}++ },++ "not": {++ "required": [++ "plan",++ "preset"++ ]}},"codes.task-start-result.v1": {@@@ -1257,6 +1501,84 @@],"maxLength": 41},++ "model_plan": {++ "$ref": "#/components/schemas/codes.model-plan.v1"++ },++ "preset": {++ "enum": [++ "Fast",++ "Balanced",++ "Deep",++ "Council"++ ]++ },++ "role_runs": {++ "type": "array",++ "maxItems": 30,++ "items": {++ "type": "object",++ "additionalProperties": false,++ "required": [++ "role",++ "model",++ "outcome",++ "tokens",++ "cost_usd",++ "duration_ms"++ ],++ "properties": {++ "role": {++ "enum": [++ "planner",++ "builder",++ "reviewer",++ "verifier"++ ]++ },++ "model": {++ "type": "string",++ "maxLength": 200++ },++ "effort": {++ "enum": [++ "none",++ "low",++ "medium",++ "high",++ "xhigh",++ "max"++ ]++ },++ "outcome": {++ "enum": [++ "approved",++ "rejected",++ "passed",++ "failed",++ "refused",++ "low_confidence",++ "skipped"++ ]++ },++ "tokens": {++ "type": "integer",++ "minimum": 0++ },++ "cost_usd": {++ "type": "number",++ "minimum": 0++ },++ "duration_ms": {++ "type": "integer",++ "minimum": 0++ },++ "reason": {++ "type": "string",++ "maxLength": 1000++ }++ }++ }++ },"url": {"type": "string","format": "uri",@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Community API",-- "version": "0.405.0",-- "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.405.0): each operation lists the capabilities it performs; a token for 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.406.0",++ "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.406.0): each operation lists the capabilities it performs; a token for 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"@@@ -2530,6 +2530,133 @@},"components": {"schemas": {++ "ai.file.v1": {++ "title": "AiFile",++ "description": "ai.file@1: a person attachment or model-produced artifact stored by Media. The reference is metadata only; file bytes are never embedded in an AI turn.",++ "type": "object",++ "additionalProperties": false,++ "required": [++ "id",++ "name",++ "media_type",++ "size",++ "storage",++ "access",++ "read"++ ],++ "properties": {++ "id": {++ "type": "string",++ "minLength": 1,++ "maxLength": 200++ },++ "name": {++ "type": "string",++ "minLength": 1,++ "maxLength": 255++ },++ "media_type": {++ "type": "string",++ "minLength": 1,++ "maxLength": 255++ },++ "size": {++ "type": "integer",++ "minimum": 0++ },++ "storage": {++ "type": "object",++ "additionalProperties": false,++ "required": [++ "provider",++ "key"++ ],++ "properties": {++ "provider": {++ "const": "media"++ },++ "key": {++ "type": "string",++ "minLength": 1,++ "maxLength": 500++ }++ }++ },++ "access": {++ "type": "object",++ "additionalProperties": false,++ "required": [++ "readers"++ ],++ "properties": {++ "readers": {++ "type": "array",++ "minItems": 1,++ "uniqueItems": true,++ "items": {++ "type": "string",++ "minLength": 1,++ "maxLength": 200++ }++ }++ }++ },++ "read": {++ "oneOf": [++ {++ "type": "object",++ "additionalProperties": false,++ "required": [++ "method"++ ],++ "properties": {++ "method": {++ "enum": [++ "text",++ "pages",++ "image",++ "audio_transcript"++ ]++ },++ "content": {++ "type": "string"++ },++ "pages": {++ "type": "array",++ "items": {++ "type": "string"++ }++ }++ }++ },++ {++ "type": "object",++ "additionalProperties": false,++ "required": [++ "method",++ "reason"++ ],++ "properties": {++ "method": {++ "const": "not_readable"++ },++ "reason": {++ "type": "string",++ "minLength": 1,++ "maxLength": 500++ }++ }++ }++ ]++ },++ "role": {++ "enum": [++ "input",++ "artifact"++ ]++ }++ }++ },"common.entity-ref.v1": {"title": "EntityRef","description": "Typed reference to another service's entity. Store this instead of a foreign key; resolve a display projection from the owner.",@@@ -2909,7 +3036,7 @@},"community.comment-write-request.v1": {"title": "CommunityCommentWriteRequest",-- "description": "community.comment-write-request@1: bodies of community.comment.write on OpenVibe.Community (people, anonymous people with a name where the thread allows it, and services acting as X-OV-Subject or as AI). POST /api/v1/comments/threads/resolve: { ref } — get or create the thread of an entity (browsers only for the allow-listed entity types; a label is taken only from a service). POST /api/v1/comments/threads/:id/comments: { message, parent_id?, anon_name? } (message trimmed, at most 5000 characters; a reply to a reply joins the top-level comment). POST /api/v1/comments/:commentId/votes: { value: 1 | -1 | 0 } (people). GET /api/v1/comments/threads/:id and DELETE /api/v1/comments/:commentId take no body. Unknown fields are ignored.",++ "description": "community.comment-write-request@1: bodies of community.comment.write on OpenVibe.Community (people, anonymous people with a name where the thread allows it, and services acting as X-OV-Subject or as AI). POST /api/v1/comments/threads/resolve: { ref } — get or create the thread of an entity (browsers only for the allow-listed entity types; a label is taken only from a service). POST /api/v1/comments/threads/:id/comments: { message, parent_id?, anon_name?, attachments? } (message trimmed, at most 5000 characters; a reply to a reply joins the top-level comment). POST /api/v1/comments/:commentId/votes: { value: 1 | -1 | 0 } (people). GET /api/v1/comments/threads/:id and DELETE /api/v1/comments/:commentId take no body. Unknown fields are ignored.","anyOf": [{"type": "object",@@@ -2946,6 +3073,13 @@"string","null"]++ },++ "attachments": {++ "type": "array",++ "maxItems": 4,++ "items": {++ "$ref": "#/components/schemas/ai.file.v1"++ }}}},@@@ -3097,7 +3231,7 @@},"community.comment.v1": {"title": "CommunityComment",-- "description": "community.comment@1: one comment in an embeddable comment thread on OpenVibe.Community (server/comments/service.js shapeComment), with its author (or anonymous name), score and the caller's vote, reply count and, for top-level comments in a page, the first replies. A deleted comment keeps its place with no author or message.",++ "description": "community.comment@1: one comment in an embeddable comment thread on OpenVibe.Community (server/comments/service.js shapeComment), with its author (or anonymous name), score and the caller's vote, reply count and, for top-level comments in a page, the first two replies. A deleted comment keeps its place with no author or message.","type": "object","required": ["id",@@@ -3253,6 +3387,34 @@"items": {"type": "object"}++ },++ "reply_to_id": {++ "type": [++ "integer",++ "null"++ ],++ "description": "The exact comment answered; parent_id remains the top-level comment."++ },++ "reply_to": {++ "type": [++ "object",++ "null"++ ],++ "properties": {++ "id": {++ "type": "integer"++ },++ "display_name": {++ "type": "string"++ }++ }++ },++ "attachments": {++ "type": "array",++ "maxItems": 4,++ "items": {++ "$ref": "#/components/schemas/ai.file.v1"++ }}}},@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe Connect API",-- "version": "0.405.0",-- "description": "Routes of OpenVibe Connect as the OpenVibe contracts describe them (openvibe-contracts 0.405.0): each operation lists the capabilities it performs; a token for 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.406.0",++ "description": "Routes of OpenVibe Connect as the OpenVibe contracts describe them (openvibe-contracts 0.406.0): each operation lists the capabilities it performs; a token for 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.405.0",-- "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.405.0): each operation lists the capabilities it performs; a token for 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.406.0",++ "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.406.0): each operation lists the capabilities it performs; a token for 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.405.0",-- "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.405.0): each operation lists the capabilities it performs; a token for 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.406.0",++ "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.406.0): each operation lists the capabilities it performs; a token for 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.405.0",-- "description": "Routes of OpenVibe.Design as the OpenVibe contracts describe them (openvibe-contracts 0.405.0): each operation lists the capabilities it performs; a token for 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.406.0",++ "description": "Routes of OpenVibe.Design as the OpenVibe contracts describe them (openvibe-contracts 0.406.0): each operation lists the capabilities it performs; a token for 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.405.0",-- "description": "Routes of OpenVibe.Domains as the OpenVibe contracts describe them (openvibe-contracts 0.405.0): each operation lists the capabilities it performs; a token for 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.406.0",++ "description": "Routes of OpenVibe.Domains as the OpenVibe contracts describe them (openvibe-contracts 0.406.0): each operation lists the capabilities it performs; a token for 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.405.0",-- "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.405.0): each operation lists the capabilities it performs; a token for 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.406.0",++ "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.406.0): each operation lists the capabilities it performs; a token for 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.Exchange API",-- "version": "0.405.0",-- "description": "Routes of OpenVibe.Exchange as the OpenVibe contracts describe them (openvibe-contracts 0.405.0): each operation lists the capabilities it performs; a token for 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.406.0",++ "description": "Routes of OpenVibe.Exchange as the OpenVibe contracts describe them (openvibe-contracts 0.406.0): each operation lists the capabilities it performs; a token for 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.405.0",-- "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.405.0): each operation lists the capabilities it performs; a token for 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.406.0",++ "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.406.0): each operation lists the capabilities it performs; a token for 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.405.0",-- "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.405.0): each operation lists the capabilities it performs; a token for 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.406.0",++ "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.406.0): each operation lists the capabilities it performs; a token for 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.Git API",-- "version": "0.405.0",-- "description": "Routes of OpenVibe.Git as the OpenVibe contracts describe them (openvibe-contracts 0.405.0): each operation lists the capabilities it performs; a token for 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.406.0",++ "description": "Routes of OpenVibe.Git as the OpenVibe contracts describe them (openvibe-contracts 0.406.0): each operation lists the capabilities it performs; a token for 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.405.0",-- "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.405.0): each operation lists the capabilities it performs; a token for 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.406.0",++ "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.406.0): each operation lists the capabilities it performs; a token for 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.Inventory API",-- "version": "0.405.0",-- "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.405.0): each operation lists the capabilities it performs; a token for 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.406.0",++ "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.406.0): each operation lists the capabilities it performs; a token for 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.405.0",-- "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.405.0): each operation lists the capabilities it performs; a token for 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.406.0",++ "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.406.0): each operation lists the capabilities it performs; a token for 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.Mail API",-- "version": "0.405.0",-- "description": "Routes of OpenVibe.Mail as the OpenVibe contracts describe them (openvibe-contracts 0.405.0): each operation lists the capabilities it performs; a token for 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.406.0",++ "description": "Routes of OpenVibe.Mail as the OpenVibe contracts describe them (openvibe-contracts 0.406.0): each operation lists the capabilities it performs; a token for 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.405.0",-- "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.405.0): each operation lists the capabilities it performs; a token for 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.406.0",++ "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.406.0): each operation lists the capabilities it performs; a token for 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.405.0",-- "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.405.0): each operation lists the capabilities it performs; a token for 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.406.0",++ "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.406.0): each operation lists the capabilities it performs; a token for 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.405.0",-- "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.405.0): each operation lists the capabilities it performs; a token for 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.406.0",++ "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.406.0): each operation lists the capabilities it performs; a token for 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.405.0",-- "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.405.0): each operation lists the capabilities it performs; a token for 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.406.0",++ "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.406.0): each operation lists the capabilities it performs; a token for 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.405.0",-- "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.405.0): each operation lists the capabilities it performs; a token for 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.406.0",++ "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.406.0): each operation lists the capabilities it performs; a token for 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.405.0",-- "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.405.0): each operation lists the capabilities it performs; a token for 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.406.0",++ "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.406.0): each operation lists the capabilities it performs; a token for 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.405.0",-- "description": "Routes of OpenVibe.Quest as the OpenVibe contracts describe them (openvibe-contracts 0.405.0): each operation lists the capabilities it performs; a token for 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.406.0",++ "description": "Routes of OpenVibe.Quest as the OpenVibe contracts describe them (openvibe-contracts 0.406.0): each operation lists the capabilities it performs; a token for 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.405.0",-- "description": "Routes of OpenVibe.Report as the OpenVibe contracts describe them (openvibe-contracts 0.405.0): each operation lists the capabilities it performs; a token for 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.406.0",++ "description": "Routes of OpenVibe.Report as the OpenVibe contracts describe them (openvibe-contracts 0.406.0): each operation lists the capabilities it performs; a token for 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.405.0",-- "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.405.0): each operation lists the capabilities it performs; a token for 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.406.0",++ "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.406.0): each operation lists the capabilities it performs; a token for 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.405.0",-- "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.405.0): each operation lists the capabilities it performs; a token for 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.406.0",++ "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.406.0): each operation lists the capabilities it performs; a token for 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"@@@ -3426,6 +3426,32 @@"type": "object","description": "The desk's answer on an ack (bot.command-result@1 data)."},++ "delivery": {++ "enum": [++ "delivered",++ "not_delivered",++ "uncertain"++ ],++ "description": "Whether the command reached the machine. Absent on older servers means unknown."++ },++ "retry": {++ "type": "object",++ "additionalProperties": false,++ "required": [++ "safe"++ ],++ "properties": {++ "safe": {++ "type": "boolean"++ },++ "reason": {++ "type": "string",++ "minLength": 1,++ "maxLength": 500++ }++ },++ "description": "safe is true only when delivery is not_delivered."++ },"state": {"$ref": "#/components/schemas/run.session.v1/properties/state"}@@@ -3480,6 +3506,17 @@"pattern": "^dev_[0-9A-HJKMNP-TV-Z]{26}$","description": "One of the person's own machines, by its OpenVibe.Bot id; the session goes there or nowhere."},++ "origins": {++ "type": "array",++ "maxItems": 32,++ "items": {++ "type": "string",++ "minLength": 8,++ "maxLength": 2048,++ "pattern": "^https?://"++ },++ "description": "Exact HTTP(S) origins allowed for this browser session. Run fixes the list at creation and places it only on a user-owned desk that can enforce it. This option is owner switched off by default."++ },"requirements": {"$ref": "#/components/schemas/platform.workload-requirements.v1"},@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Search API",-- "version": "0.405.0",-- "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.405.0): each operation lists the capabilities it performs; a token for 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.406.0",++ "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.406.0): each operation lists the capabilities it performs; a token for 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.405.0",-- "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.405.0): each operation lists the capabilities it performs; a token for 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.406.0",++ "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.406.0): each operation lists the capabilities it performs; a token for 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.405.0",-- "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.405.0): each operation lists the capabilities it performs; a token for 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.406.0",++ "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.406.0): each operation lists the capabilities it performs; a token for 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.405.0",-- "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.405.0): each operation lists the capabilities it performs; a token for 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.406.0",++ "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.406.0): each operation lists the capabilities it performs; a token for 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.Tips API",-- "version": "0.405.0",-- "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.405.0): each operation lists the capabilities it performs; a token for 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.406.0",++ "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.406.0): each operation lists the capabilities it performs; a token for 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.405.0",-- "description": "Routes of OpenVibe.Today as the OpenVibe contracts describe them (openvibe-contracts 0.405.0): each operation lists the capabilities it performs; a token for 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.406.0",++ "description": "Routes of OpenVibe.Today as the OpenVibe contracts describe them (openvibe-contracts 0.406.0): each operation lists the capabilities it performs; a token for 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.405.0",-- "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.405.0): each operation lists the capabilities it performs; a token for 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.406.0",++ "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.406.0): each operation lists the capabilities it performs; a token for 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.405.0",-- "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.405.0): each operation lists the capabilities it performs; a token for 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.406.0",++ "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.406.0): each operation lists the capabilities it performs; a token for 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.405.0",-- "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.405.0): each operation lists the capabilities it performs; a token for 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.406.0",++ "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.406.0): each operation lists the capabilities it performs; a token for 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.405.0",-- "description": "Routes of OpenVibe.Vision as the OpenVibe contracts describe them (openvibe-contracts 0.405.0): each operation lists the capabilities it performs; a token for 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.406.0",++ "description": "Routes of OpenVibe.Vision as the OpenVibe contracts describe them (openvibe-contracts 0.406.0): each operation lists the capabilities it performs; a token for 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.405.0",-- "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.405.0): each operation lists the capabilities it performs; a token for 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.406.0",++ "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.406.0): each operation lists the capabilities it performs; a token for 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.405.0",-- "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.405.0): each operation lists the capabilities it performs; a token for 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.406.0",++ "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.406.0): each operation lists the capabilities it performs; a token for 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.405.0",-- "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.405.0): each operation lists the capabilities it performs; a token for 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.406.0",++ "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.406.0): each operation lists the capabilities it performs; a token for 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.405.0",-- "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.405.0): each operation lists the capabilities it performs; a token for 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.406.0",++ "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.406.0): each operation lists the capabilities it performs; a token for 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"@@@ -163451,6 +163451,56 @@ export interface AiModelList {cursor?: string | null;}++/** [email protected] (owner: ai) */++/**++ * ai.model-directory-entry@1: one public model, including provider-listed models with routing off and sourced pre-list sightings. Spotted never means available.++ */++export type AiModelDirectoryEntry = {++ [k: string]: unknown | undefined;++} & {++ id: string;++ provider: string;++ provider_name?: string | null;++ model: string;++ name: string;++ family?: string | null;++ version?: string | null;++ status: "available" | "preview" | "spotted" | "retired";++ routing_enabled: boolean;++ context_window?: number | null;++ max_output?: number | null;++ type?: string;++ modalities?: string[];++ price?: {++ input_per_million?: number | null;++ output_per_million?: number | null;++ cached_per_million?: number | null;++ source?: string | null;++ checked_at?: string | null;++ };++ source?: string | null;++ sources?: {++ url: string;++ observed_at: string;++ published_at?: string;++ }[];++ first_seen_at?: string | null;++ updated_at?: string | null;++ retired_at?: string | null;++ [k: string]: unknown | undefined;++};++++/** [email protected] (owner: ai) */++/**++ * ai.model-directory-list@1: public model directory response; the list may include spotted, disabled and retired models.++ */++export interface AiModelDirectoryList {++ generated_at?: string;++ count: number;++ models: AiModelDirectoryEntry[];++ [k: string]: unknown | undefined;++}++/** [email protected] (owner: ai) *//*** ai.model-read-result@1: response from GET /v1/models (a list) or GET /v1/models/:id (a single model).@@@ -214053,7 +214103,7 @@ export interface CommunityCommentThread {/** [email protected] (owner: community) *//**-- * community.comment-write-request@1: bodies of community.comment.write on OpenVibe.Community (people, anonymous people with a name where the thread allows it, and services acting as X-OV-Subject or as AI). POST /api/v1/comments/threads/resolve: { ref } — get or create the thread of an entity (browsers only for the allow-listed entity types; a label is taken only from a service). POST /api/v1/comments/threads/:id/comments: { message, parent_id?, anon_name? } (message trimmed, at most 5000 characters; a reply to a reply joins the top-level comment). POST /api/v1/comments/:commentId/votes: { value: 1 | -1 | 0 } (people). GET /api/v1/comments/threads/:id and DELETE /api/v1/comments/:commentId take no body. Unknown fields are ignored.++ * community.comment-write-request@1: bodies of community.comment.write on OpenVibe.Community (people, anonymous people with a name where the thread allows it, and services acting as X-OV-Subject or as AI). POST /api/v1/comments/threads/resolve: { ref } — get or create the thread of an entity (browsers only for the allow-listed entity types; a label is taken only from a service). POST /api/v1/comments/threads/:id/comments: { message, parent_id?, anon_name?, attachments? } (message trimmed, at most 5000 characters; a reply to a reply joins the top-level comment). POST /api/v1/comments/:commentId/votes: { value: 1 | -1 | 0 } (people). GET /api/v1/comments/threads/:id and DELETE /api/v1/comments/:commentId take no body. Unknown fields are ignored.*/export type CommunityCommentWriteRequest =| {@@@ -214063,6 +214113,10 @@ export type CommunityCommentWriteRequest =message: string;parent_id?: number | string | null;anon_name?: string | null;++ /**++ * @maxItems 4++ */++ attachments?: [] | [AiFile] | [AiFile, AiFile] | [AiFile, AiFile, AiFile] | [AiFile, AiFile, AiFile, AiFile];}| {value: 1 | -1 | 0 | "1" | "-1" | "0";@@@ -214106,7 +214160,7 @@ export type CommunityCommentWriteResult =/** [email protected] (owner: community) *//**-- * community.comment@1: one comment in an embeddable comment thread on OpenVibe.Community (server/comments/service.js shapeComment), with its author (or anonymous name), score and the caller's vote, reply count and, for top-level comments in a page, the first replies. A deleted comment keeps its place with no author or message.++ * community.comment@1: one comment in an embeddable comment thread on OpenVibe.Community (server/comments/service.js shapeComment), with its author (or anonymous name), score and the caller's vote, reply count and, for top-level comments in a page, the first two replies. A deleted comment keeps its place with no author or message.*/export interface CommunityComment {id: number;@@@ -214137,6 +214191,18 @@ export interface CommunityComment {can_edit: boolean;can_delete: boolean;replies?: {}[];++ /**++ * The exact comment answered; parent_id remains the top-level comment.++ */++ reply_to_id?: number | null;++ reply_to?: {++ id?: number;++ display_name?: string;++ } | null;++ /**++ * @maxItems 4++ */++ attachments?: [] | [AiFile] | [AiFile, AiFile] | [AiFile, AiFile, AiFile] | [AiFile, AiFile, AiFile, AiFile];}/** [email protected] (owner: community) */@@@ -268527,7 +268593,7 @@ export type BotCommand = {/** [email protected] (owner: bot) *//**-- * bot.command-result@1: the command_result frame OpenVibe.Bot answers a bot.command@1 with on the operator WebSocket (server/realtime.js). result: ack or nack (the device answered; reason is its fault code, latency_ms the round trip), refused (the gate refused it; code is Bot's refusal code such as bot.estop_latched, bot.cooldown or bot.device_offline, and reason says why), expired (no answer before the deadline) or pending (the same id is still in flight). cached is true when a repeated id is answered from the first result. An ack of a computer command (exec, fs, screen) carries its answer in data.++ * bot.command-result@1: the command_result frame OpenVibe.Bot answers a bot.command@1 with on the operator WebSocket (server/realtime.js). result: ack or nack (the device answered; reason is its fault code, latency_ms the round trip), refused (the gate refused it; code is Bot's refusal code such as bot.estop_latched, bot.cooldown or bot.device_offline, and reason says why), expired (no answer before the deadline) or pending (the same id is still in flight). cached is true when a repeated id is answered from the first result. An ack of a computer command (exec, fs, screen) carries its answer in data. delivery says whether the command reached the machine (delivered, not_delivered, uncertain); retry says whether repeating it is safe. Only not_delivered is safe to repeat: a delivered command already ran, and an uncertain one may have.*/export interface BotCommandResult {v: 1;@@@ -268544,6 +268610,17 @@ export interface BotCommandResult {* A computer command's answer as the machine gave it (exec: exit_code, stdout, stderr, truncated, timed_out, duration_ms; fs: entries, the stat, content_b64, written, created; screen: format, width, height, content_b64). Present only on an ack of exec, fs or screen.*/data?: {};++ /**++ * Whether the command reached the machine. Both senders and the device report it; absent means unknown.++ */++ delivery?: "delivered" | "not_delivered" | "uncertain";++ /**++ * Whether repeating the command is safe. safe is true only when delivery is not_delivered.++ */++ retry?: {++ safe: boolean;++ reason?: string;++ };}/** [email protected] (owner: bot) */@@@ -280137,7 +280214,454 @@ export type VideoPlaylistManageResult =}[];};--/** [email protected] (owner: codes) */++/** [email protected] (owner: codes) */++/**++ * codes.model-plan@1: a versioned execution plan for a Codes task. Roles are attempted in list order. The ladder names AI registry ids in fallback order; auto asks AI to route. A pair requires reviewer approval, a council has two or three planner samples and a judge, and escalation advances on a failed check, refusal, or low confidence.++ */++export type CodesModelPlan = {++ [k: string]: unknown | undefined;++} & {++ roles?: unknown[];++} & {++ mode: "single" | "pair" | "council" | "escalate";++ /**++ * @minItems 1++ * @maxItems 8++ */++ roles:++ | [++ {++ role: "planner" | "builder" | "reviewer" | "verifier";++ model: string;++ effort: "none" | "low" | "medium" | "high" | "xhigh" | "max";++ samples?: number;++ budget?: {++ tokens?: number;++ minutes?: number;++ dollars?: number;++ };++ }++ ]++ | [++ {++ role: "planner" | "builder" | "reviewer" | "verifier";++ model: string;++ effort: "none" | "low" | "medium" | "high" | "xhigh" | "max";++ samples?: number;++ budget?: {++ tokens?: number;++ minutes?: number;++ dollars?: number;++ };++ },++ {++ role: "planner" | "builder" | "reviewer" | "verifier";++ model: string;++ effort: "none" | "low" | "medium" | "high" | "xhigh" | "max";++ samples?: number;++ budget?: {++ tokens?: number;++ minutes?: number;++ dollars?: number;++ };++ }++ ]++ | [++ {++ role: "planner" | "builder" | "reviewer" | "verifier";++ model: string;++ effort: "none" | "low" | "medium" | "high" | "xhigh" | "max";++ samples?: number;++ budget?: {++ tokens?: number;++ minutes?: number;++ dollars?: number;++ };++ },++ {++ role: "planner" | "builder" | "reviewer" | "verifier";++ model: string;++ effort: "none" | "low" | "medium" | "high" | "xhigh" | "max";++ samples?: number;++ budget?: {++ tokens?: number;++ minutes?: number;++ dollars?: number;++ };++ },++ {++ role: "planner" | "builder" | "reviewer" | "verifier";++ model: string;++ effort: "none" | "low" | "medium" | "high" | "xhigh" | "max";++ samples?: number;++ budget?: {++ tokens?: number;++ minutes?: number;++ dollars?: number;++ };++ }++ ]++ | [++ {++ role: "planner" | "builder" | "reviewer" | "verifier";++ model: string;++ effort: "none" | "low" | "medium" | "high" | "xhigh" | "max";++ samples?: number;++ budget?: {++ tokens?: number;++ minutes?: number;++ dollars?: number;++ };++ },++ {++ role: "planner" | "builder" | "reviewer" | "verifier";++ model: string;++ effort: "none" | "low" | "medium" | "high" | "xhigh" | "max";++ samples?: number;++ budget?: {++ tokens?: number;++ minutes?: number;++ dollars?: number;++ };++ },++ {++ role: "planner" | "builder" | "reviewer" | "verifier";++ model: string;++ effort: "none" | "low" | "medium" | "high" | "xhigh" | "max";++ samples?: number;++ budget?: {++ tokens?: number;++ minutes?: number;++ dollars?: number;++ };++ },++ {++ role: "planner" | "builder" | "reviewer" | "verifier";++ model: string;++ effort: "none" | "low" | "medium" | "high" | "xhigh" | "max";++ samples?: number;++ budget?: {++ tokens?: number;++ minutes?: number;++ dollars?: number;++ };++ }++ ]++ | [++ {++ role: "planner" | "builder" | "reviewer" | "verifier";++ model: string;++ effort: "none" | "low" | "medium" | "high" | "xhigh" | "max";++ samples?: number;++ budget?: {++ tokens?: number;++ minutes?: number;++ dollars?: number;++ };++ },++ {++ role: "planner" | "builder" | "reviewer" | "verifier";++ model: string;++ effort: "none" | "low" | "medium" | "high" | "xhigh" | "max";++ samples?: number;++ budget?: {++ tokens?: number;++ minutes?: number;++ dollars?: number;++ };++ },++ {++ role: "planner" | "builder" | "reviewer" | "verifier";++ model: string;++ effort: "none" | "low" | "medium" | "high" | "xhigh" | "max";++ samples?: number;++ budget?: {++ tokens?: number;++ minutes?: number;++ dollars?: number;++ };++ },++ {++ role: "planner" | "builder" | "reviewer" | "verifier";++ model: string;++ effort: "none" | "low" | "medium" | "high" | "xhigh" | "max";++ samples?: number;++ budget?: {++ tokens?: number;++ minutes?: number;++ dollars?: number;++ };++ },++ {++ role: "planner" | "builder" | "reviewer" | "verifier";++ model: string;++ effort: "none" | "low" | "medium" | "high" | "xhigh" | "max";++ samples?: number;++ budget?: {++ tokens?: number;++ minutes?: number;++ dollars?: number;++ };++ }++ ]++ | [++ {++ role: "planner" | "builder" | "reviewer" | "verifier";++ model: string;++ effort: "none" | "low" | "medium" | "high" | "xhigh" | "max";++ samples?: number;++ budget?: {++ tokens?: number;++ minutes?: number;++ dollars?: number;++ };++ },++ {++ role: "planner" | "builder" | "reviewer" | "verifier";++ model: string;++ effort: "none" | "low" | "medium" | "high" | "xhigh" | "max";++ samples?: number;++ budget?: {++ tokens?: number;++ minutes?: number;++ dollars?: number;++ };++ },++ {++ role: "planner" | "builder" | "reviewer" | "verifier";++ model: string;++ effort: "none" | "low" | "medium" | "high" | "xhigh" | "max";++ samples?: number;++ budget?: {++ tokens?: number;++ minutes?: number;++ dollars?: number;++ };++ },++ {++ role: "planner" | "builder" | "reviewer" | "verifier";++ model: string;++ effort: "none" | "low" | "medium" | "high" | "xhigh" | "max";++ samples?: number;++ budget?: {++ tokens?: number;++ minutes?: number;++ dollars?: number;++ };++ },++ {++ role: "planner" | "builder" | "reviewer" | "verifier";++ model: string;++ effort: "none" | "low" | "medium" | "high" | "xhigh" | "max";++ samples?: number;++ budget?: {++ tokens?: number;++ minutes?: number;++ dollars?: number;++ };++ },++ {++ role: "planner" | "builder" | "reviewer" | "verifier";++ model: string;++ effort: "none" | "low" | "medium" | "high" | "xhigh" | "max";++ samples?: number;++ budget?: {++ tokens?: number;++ minutes?: number;++ dollars?: number;++ };++ }++ ]++ | [++ {++ role: "planner" | "builder" | "reviewer" | "verifier";++ model: string;++ effort: "none" | "low" | "medium" | "high" | "xhigh" | "max";++ samples?: number;++ budget?: {++ tokens?: number;++ minutes?: number;++ dollars?: number;++ };++ },++ {++ role: "planner" | "builder" | "reviewer" | "verifier";++ model: string;++ effort: "none" | "low" | "medium" | "high" | "xhigh" | "max";++ samples?: number;++ budget?: {++ tokens?: number;++ minutes?: number;++ dollars?: number;++ };++ },++ {++ role: "planner" | "builder" | "reviewer" | "verifier";++ model: string;++ effort: "none" | "low" | "medium" | "high" | "xhigh" | "max";++ samples?: number;++ budget?: {++ tokens?: number;++ minutes?: number;++ dollars?: number;++ };++ },++ {++ role: "planner" | "builder" | "reviewer" | "verifier";++ model: string;++ effort: "none" | "low" | "medium" | "high" | "xhigh" | "max";++ samples?: number;++ budget?: {++ tokens?: number;++ minutes?: number;++ dollars?: number;++ };++ },++ {++ role: "planner" | "builder" | "reviewer" | "verifier";++ model: string;++ effort: "none" | "low" | "medium" | "high" | "xhigh" | "max";++ samples?: number;++ budget?: {++ tokens?: number;++ minutes?: number;++ dollars?: number;++ };++ },++ {++ role: "planner" | "builder" | "reviewer" | "verifier";++ model: string;++ effort: "none" | "low" | "medium" | "high" | "xhigh" | "max";++ samples?: number;++ budget?: {++ tokens?: number;++ minutes?: number;++ dollars?: number;++ };++ },++ {++ role: "planner" | "builder" | "reviewer" | "verifier";++ model: string;++ effort: "none" | "low" | "medium" | "high" | "xhigh" | "max";++ samples?: number;++ budget?: {++ tokens?: number;++ minutes?: number;++ dollars?: number;++ };++ }++ ]++ | [++ {++ role: "planner" | "builder" | "reviewer" | "verifier";++ model: string;++ effort: "none" | "low" | "medium" | "high" | "xhigh" | "max";++ samples?: number;++ budget?: {++ tokens?: number;++ minutes?: number;++ dollars?: number;++ };++ },++ {++ role: "planner" | "builder" | "reviewer" | "verifier";++ model: string;++ effort: "none" | "low" | "medium" | "high" | "xhigh" | "max";++ samples?: number;++ budget?: {++ tokens?: number;++ minutes?: number;++ dollars?: number;++ };++ },++ {++ role: "planner" | "builder" | "reviewer" | "verifier";++ model: string;++ effort: "none" | "low" | "medium" | "high" | "xhigh" | "max";++ samples?: number;++ budget?: {++ tokens?: number;++ minutes?: number;++ dollars?: number;++ };++ },++ {++ role: "planner" | "builder" | "reviewer" | "verifier";++ model: string;++ effort: "none" | "low" | "medium" | "high" | "xhigh" | "max";++ samples?: number;++ budget?: {++ tokens?: number;++ minutes?: number;++ dollars?: number;++ };++ },++ {++ role: "planner" | "builder" | "reviewer" | "verifier";++ model: string;++ effort: "none" | "low" | "medium" | "high" | "xhigh" | "max";++ samples?: number;++ budget?: {++ tokens?: number;++ minutes?: number;++ dollars?: number;++ };++ },++ {++ role: "planner" | "builder" | "reviewer" | "verifier";++ model: string;++ effort: "none" | "low" | "medium" | "high" | "xhigh" | "max";++ samples?: number;++ budget?: {++ tokens?: number;++ minutes?: number;++ dollars?: number;++ };++ },++ {++ role: "planner" | "builder" | "reviewer" | "verifier";++ model: string;++ effort: "none" | "low" | "medium" | "high" | "xhigh" | "max";++ samples?: number;++ budget?: {++ tokens?: number;++ minutes?: number;++ dollars?: number;++ };++ },++ {++ role: "planner" | "builder" | "reviewer" | "verifier";++ model: string;++ effort: "none" | "low" | "medium" | "high" | "xhigh" | "max";++ samples?: number;++ budget?: {++ tokens?: number;++ minutes?: number;++ dollars?: number;++ };++ }++ ];++ /**++ * @minItems 1++ * @maxItems 8++ */++ ladder?:++ | [string]++ | [string, string]++ | [string, string, string]++ | [string, string, string, string]++ | [string, string, string, string, string]++ | [string, string, string, string, string, string]++ | [string, string, string, string, string, string, string]++ | [string, string, string, string, string, string, string, string];++ checks: {++ tests?: boolean;++ lint?: boolean;++ reviewer?: boolean;++ };++};++++/** [email protected] (owner: codes) *//*** codes.task-start-request@1: the body of POST /api/v1/tasks on OpenVibe.Codes (capability codes.task.start). A first-party service (OpenVibe.Actor) starts a coding task for a person, named with X-OV-Subject: Codes runs it on that person's own machine through OpenVibe.Run (openvibe.codes/run, plan T16), in the project of their latest task there, so the person has used openvibe.codes/run once before a service can start one for them (else 409 codes.no_project). REPO is an https git URL with no credentials; REF a branch or tag to start from (default: the repository's default branch). PROMPT is the task. AGENT names one of Codes' agents (GET /harnesses), absent for Codes' router to pick. PERMISSION: review (read-only: research, audits, reviews; nothing is changed), edit (default; the agents edit files) or full (they may also run commands: tests, installs). PUSH asks for the change on a new branch (GitHub, with the machine's GITHUB_TOKEN; never the branch it started from), PULL_REQUEST also opens a pull request. IDEMPOTENCY_KEY: a repeat for the same person with the same key answers the first task (200, created false).*/@@@ -280148,6 +280672,8 @@ export interface CodesTaskStartRequest {agent?: string;permission?: "review" | "edit" | "full";goal?: AgentGoal;++ plan?: CodesModelPlan;++ preset?: "Fast" | "Balanced" | "Deep" | "Council";push?: boolean;pull_request?: boolean;idempotency_key?: string;@@@ -280357,7 +280883,7 @@ export interface CodesTask {} | null;}--/** [email protected] (owner: codes) */++/** [email protected] (owner: codes) *//** [email protected] (owner: play) *//**@@@ -281724,6 +282250,12 @@ export interface RunSessionCreateRequest {* One of the person's own machines, by its OpenVibe.Bot id; the session goes there or nowhere.*/machine?: string;++ /**++ * Exact HTTP(S) origins allowed for this browser session. Run fixes the list at creation and places it only on a user-owned desk that can enforce it. This option is owner switched off by default.++ *++ * @maxItems 32++ */++ origins?: string[];requirements?: WorkloadRequirements;idempotency_key?: string;/**@@@ -281759,6 +282291,17 @@ export interface RunSessionControlResult {* The desk's answer on an ack (bot.command-result@1 data).*/data?: {};++ /**++ * Whether the command reached the machine. Absent on older servers means unknown.++ */++ delivery?: "delivered" | "not_delivered" | "uncertain";++ /**++ * safe is true only when delivery is not_delivered.++ */++ retry?: {++ safe: boolean;++ reason?: string;++ };state: "placing" | "starting" | "running" | "ended";}@@@ -282078,6 +282621,12 @@ export interface BotDeskLeaseCreateRequest {* Default 800.*/height?: number;++ /**++ * The session's exact browser origins, fixed for this lease. Empty allows no network origin; absent keeps the legacy policy. A shared desk that cannot enforce the list is refused.++ *++ * @maxItems 32++ */++ origins?: string[];}/** [email protected] (owner: bot) */@@@ -327412,6 +327961,16 @@ export interface MemeEntry {[k: string]: unknown | undefined;}++/** [email protected] (owner: meme) */++/**++ * meme.caption.created v1 (OpenVibe.Meme): a signed-in person saved a public caption. The event names only its id and owner, never the caption text, template, or other people's content. Envelope source meme, actor the owner, subject the caption, visibility internal.++ */++export interface MemeCaptionCreatedPayload {++ caption_id: string;++ owner: SubjectRef;++ created_at: string;++}++/** [email protected] (owner: meme) *//*** meme.template@1: a reusable meme image with its source, reuse licence and caption layout. Public templates have passed any required review.@@@ -16,7 +16,7 @@"publicSite": "service"},"capabilities": [],-- "eventsProduced": [],++ "eventsProduced": ["meme.caption.created"],"eventsConsumed": [],"namespacesOwned": ["meme.*"@@@ -1,12 +1,12 @@{"name": "openvibe-contracts",-- "version": "0.405.0",++ "version": "0.406.0","lockfileVersion": 3,"requires": true,"packages": {"": {"name": "openvibe-contracts",-- "version": "0.405.0",++ "version": "0.406.0","license": "AGPL-3.0-only","dependencies": {"ajv": "^8.17.1",@@@ -1,6 +1,6 @@{"name": "openvibe-contracts",-- "version": "0.405.0",++ "version": "0.406.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",nnew file mode 100644@@@ -0,0 +1,22 @@++'use strict';++++const assert = require('node:assert/strict');++const fs = require('node:fs');++const path = require('node:path');++const { validate } = require('..');++++for (const kind of ['valid', 'invalid']) {++ const dir = path.join(__dirname, '..', 'fixtures', 'codes.model-plan', kind);++ for (const file of fs.readdirSync(dir)) {++ const value = JSON.parse(fs.readFileSync(path.join(dir, file), 'utf8'));++ assert.equal(validate('codes.model-plan@1', value).valid, kind === 'valid', file);++ }++}++++const base = { repo: 'https://github.com/OpenVibers/OpenVibe.Codes', prompt: 'Improve the task' };++const pair = require('../fixtures/codes.model-plan/valid/pair.json');++assert.equal(validate('codes.task-start-request@1', { ...base, plan: pair }).valid, true);++assert.equal(validate('codes.task-start-request@1', { ...base, preset: 'Balanced' }).valid, true);++assert.equal(validate('codes.task-start-request@1', { ...base, plan: pair, preset: 'Balanced' }).valid, false);++++console.log('codes.model-plan@1: valid modes, invalid role, effort and ladder fixtures, task plan or preset');
@@ -1,5 +1,22 @@
@@ -1,5 +1,22 @@
# Changelog
# Changelog
+## 0.406.0 — 2026-11-11
+
+The second train of the day, for the five pull requests opened after 0.405.0 (one line each):
+
+- Define `meme.caption.created` for a signed-in person's public caption, with only its id and owner (#444).
+- Add `codes.model-plan@1`: execution modes, role models and effort, bounded samples and budgets, an escalation ladder
+ and required checks; task requests accept a plan or a preset, and task reads can include the resolved plan and
+ per-role usage and outcome (#445).
+- Delivery and retry on computer and browser results: `bot.command-result@1` and `run.session-control-result@1` gain
+ `delivery` (`delivered`, `not_delivered`, `uncertain`) and `retry` (`safe`, `reason`), only `not_delivered` is safe
+ to replay; optional browser `origins` on browser commands, Run session creation and Bot desk lease creation (#446).
+- Add `ai.model-directory-entry@1` and `ai.model-directory-list@1` for public model listings, with provider-listed
+ models routed off, preview and retired models, and sourced pre-list sightings; a spotted entry never implies
+ availability (#447).
+- Keep the exact reply target and its display name in Community comment reads; document the two-reply preview and four
+ Chat-compatible file references on comment writes and reads (#448).
+
## 0.405.0 — 2026-11-11
## 0.405.0 — 2026-11-11
This release train carries the contract work that was waiting on the owner's release. One line per carried pull request:
This release train carries the contract work that was waiting on the owner's release. One line per carried pull request:
@@ -5,7 +5,7 @@
@@ -5,7 +5,7 @@
**Docs:** https://openvibe.services · **For AI:** https://openvibe.services/llms.txt
**Docs:** https://openvibe.services · **For AI:** https://openvibe.services/llms.txt
**Install and test:** `npm ci && npm test` (Node 20 or newer)
**Install and test:** `npm ci && npm test` (Node 20 or newer)
-**Status:** alpha (first released in Wave 1; the release is package.json's `version`, tagged). At v0.405.0: 1238 schemas in `contracts/catalog.json`, 66 service manifests, 516 capability manifests, 14 namespace manifests and the staff capability map. Service repositories run `openvibe-contracts-check` and the pin-drift check in CI, and deployed services verify service and app tokens with `serviceAuth` in production. Consumers pin release tags (each repository's `STATUS.json` names its pin). `node scripts/docs-currency.js <root>` checks every checkout's README and `STATUS.json` against its code: the pins and versions they name, a library's consumer list, the deployed flag against the manifest, README links, and the paths and migrations they name. `node scripts/estate.js` generates `docs/ESTATE.md` and `manifests/repositories/` from the estate checkouts, and `--check` fails on drift (plan T1 step 3).
+**Status:** alpha (first released in Wave 1; the release is package.json's `version`, tagged). At v0.406.0: 1238 schemas in `contracts/catalog.json`, 66 service manifests, 516 capability manifests, 14 namespace manifests and the staff capability map. Service repositories run `openvibe-contracts-check` and the pin-drift check in CI, and deployed services verify service and app tokens with `serviceAuth` in production. Consumers pin release tags (each repository's `STATUS.json` names its pin). `node scripts/docs-currency.js <root>` checks every checkout's README and `STATUS.json` against its code: the pins and versions they name, a library's consumer list, the deployed flag against the manifest, README links, and the paths and migrations they name. `node scripts/estate.js` generates `docs/ESTATE.md` and `manifests/repositories/` from the estate checkouts, and `--check` fails on drift (plan T1 step 3).
**Plan:** OpenVibe Development Roadmap, Wave 1 (implementation plan rev 3, §3.1 and §18.11).
**Plan:** OpenVibe Development Roadmap, Wave 1 (implementation plan rev 3, §3.1 and §18.11).
**License:** AGPL-3.0 (same as every OpenVibe service).
**License:** AGPL-3.0 (same as every OpenVibe service).
new file mode 100644
new file mode 100644
@@ -0,0 +1,42 @@
@@ -0,0 +1,42 @@
+{
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "https://openvibe.network/contracts/ai/model-directory-entry.v1.json",
+ "title": "AiModelDirectoryEntry",
+ "description": "ai.model-directory-entry@1: one public model, including provider-listed models with routing off and sourced pre-list sightings. Spotted never means available.",
+ "type": "object",
+ "required": ["id", "provider", "model", "name", "status", "routing_enabled"],
+ "additionalProperties": true,
+ "allOf": [
+ {"if": {"properties": {"status": {"enum": ["spotted", "retired"]}}}, "then": {"properties": {"routing_enabled": {"const": false}}}}
+ ],
+ "properties": {
+ "id": {"type": "string", "minLength": 3, "maxLength": 256},
+ "provider": {"type": "string", "minLength": 1},
+ "provider_name": {"type": ["string", "null"]},
+ "model": {"type": "string", "minLength": 1},
+ "name": {"type": "string", "minLength": 1},
+ "family": {"type": ["string", "null"]},
+ "version": {"type": ["string", "null"]},
+ "status": {"enum": ["available", "preview", "spotted", "retired"]},
+ "routing_enabled": {"type": "boolean"},
+ "context_window": {"type": ["integer", "null"], "minimum": 0},
+ "max_output": {"type": ["integer", "null"], "minimum": 0},
+ "type": {"type": "string"},
+ "modalities": {"type": "array", "items": {"type": "string"}},
+ "price": {
+ "type": "object",
+ "properties": {
+ "input_per_million": {"type": ["number", "null"], "minimum": 0},
+ "output_per_million": {"type": ["number", "null"], "minimum": 0},
+ "cached_per_million": {"type": ["number", "null"], "minimum": 0},
+ "source": {"type": ["string", "null"], "format": "uri"},
+ "checked_at": {"type": ["string", "null"]}
+ }
+ },
+ "source": {"type": ["string", "null"], "format": "uri"},
+ "sources": {"type": "array", "items": {"type": "object", "required": ["url", "observed_at"], "properties": {"url": {"type": "string", "format": "uri"}, "observed_at": {"type": "string"}, "published_at": {"type": "string"}}}},
+ "first_seen_at": {"type": ["string", "null"]},
+ "updated_at": {"type": ["string", "null"]},
+ "retired_at": {"type": ["string", "null"]}
+ }
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,14 @@
@@ -0,0 +1,14 @@
+{
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "https://openvibe.network/contracts/ai/model-directory-list.v1.json",
+ "title": "AiModelDirectoryList",
+ "description": "ai.model-directory-list@1: public model directory response; the list may include spotted, disabled and retired models.",
+ "type": "object",
+ "required": ["models", "count"],
+ "additionalProperties": true,
+ "properties": {
+ "generated_at": {"type": "string"},
+ "count": {"type": "integer", "minimum": 0},
+ "models": {"type": "array", "items": {"$ref": "model-directory-entry.v1.json"}}
+ }
+}
@@ -2,7 +2,7 @@
@@ -2,7 +2,7 @@
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://openvibe.network/contracts/bot/command-result.v1.json",
"$id": "https://openvibe.network/contracts/bot/command-result.v1.json",
"title": "BotCommandResult",
"title": "BotCommandResult",
- "description": "bot.command-result@1: the command_result frame OpenVibe.Bot answers a bot.command@1 with on the operator WebSocket (server/realtime.js). result: ack or nack (the device answered; reason is its fault code, latency_ms the round trip), refused (the gate refused it; code is Bot's refusal code such as bot.estop_latched, bot.cooldown or bot.device_offline, and reason says why), expired (no answer before the deadline) or pending (the same id is still in flight). cached is true when a repeated id is answered from the first result. An ack of a computer command (exec, fs, screen) carries its answer in data.",
+ "description": "bot.command-result@1: the command_result frame OpenVibe.Bot answers a bot.command@1 with on the operator WebSocket (server/realtime.js). result: ack or nack (the device answered; reason is its fault code, latency_ms the round trip), refused (the gate refused it; code is Bot's refusal code such as bot.estop_latched, bot.cooldown or bot.device_offline, and reason says why), expired (no answer before the deadline) or pending (the same id is still in flight). cached is true when a repeated id is answered from the first result. An ack of a computer command (exec, fs, screen) carries its answer in data. delivery says whether the command reached the machine (delivered, not_delivered, uncertain); retry says whether repeating it is safe. Only not_delivered is safe to repeat: a delivered command already ran, and an uncertain one may have.",
"type": "object",
"type": "object",
"required": [
"required": [
"v",
"v",
@@ -62,6 +62,33 @@
@@ -62,6 +62,33 @@
"data": {
"data": {
"type": "object",
"type": "object",
"description": "A computer command's answer as the machine gave it (exec: exit_code, stdout, stderr, truncated, timed_out, duration_ms; fs: entries, the stat, content_b64, written, created; screen: format, width, height, content_b64). Present only on an ack of exec, fs or screen."
"description": "A computer command's answer as the machine gave it (exec: exit_code, stdout, stderr, truncated, timed_out, duration_ms; fs: entries, the stat, content_b64, written, created; screen: format, width, height, content_b64). Present only on an ack of exec, fs or screen."
+ },
+ "delivery": {
+ "type": "string",
+ "enum": [
+ "delivered",
+ "not_delivered",
+ "uncertain"
+ ],
+ "description": "Whether the command reached the machine. Both senders and the device report it; absent means unknown."
+ },
+ "retry": {
+ "type": "object",
+ "description": "Whether repeating the command is safe. safe is true only when delivery is not_delivered.",
+ "additionalProperties": false,
+ "required": [
+ "safe"
+ ],
+ "properties": {
+ "safe": {
+ "type": "boolean"
+ },
+ "reason": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 500
+ }
+ }
}
}
}
}
}
}
@@ -472,6 +472,12 @@
@@ -472,6 +472,12 @@
"pattern": "^https?://",
"pattern": "^https?://",
"description": "an http or https address"
"description": "an http or https address"
},
},
+ "origins": {
+ "type": "array",
+ "maxItems": 32,
+ "items": { "type": "string", "minLength": 8, "maxLength": 2048, "pattern": "^https?://" },
+ "description": "Optional exact task origins. Link checks scheme, host and port and refuses other navigation and browser egress. Empty allows no network origin; absent keeps the legacy browser policy."
+ },
"selector": {
"selector": {
"type": "string",
"type": "string",
"minLength": 1,
"minLength": 1,
@@ -27,6 +27,12 @@
@@ -27,6 +27,12 @@
"height": {
"height": {
"$ref": "desk-lease.v1.json#/properties/height",
"$ref": "desk-lease.v1.json#/properties/height",
"description": "Default 800."
"description": "Default 800."
+ },
+ "origins": {
+ "type": "array",
+ "maxItems": 32,
+ "items": { "type": "string", "minLength": 8, "maxLength": 2048, "pattern": "^https?://" },
+ "description": "The session's exact browser origins, fixed for this lease. Empty allows no network origin; absent keeps the legacy policy. A shared desk that cannot enforce the list is refused."
}
}
}
}
}
}
@@ -1754,6 +1754,24 @@
@@ -1754,6 +1754,24 @@
"compatibility": "backward",
"compatibility": "backward",
"status": "active"
"status": "active"
},
},
+ {
+ "id": "ai.model-directory-entry",
+ "version": "1.0.0",
+ "owner": "ai",
+ "schema": "ai/model-directory-entry.v1.json",
+ "visibility": "public",
+ "compatibility": "backward",
+ "status": "active"
+ },
+ {
+ "id": "ai.model-directory-list",
+ "version": "1.0.0",
+ "owner": "ai",
+ "schema": "ai/model-directory-list.v1.json",
+ "visibility": "public",
+ "compatibility": "backward",
+ "status": "active"
+ },
{
{
"id": "ai.model-read-result",
"id": "ai.model-read-result",
"version": "1.0.0",
"version": "1.0.0",
@@ -8515,9 +8533,18 @@
@@ -8515,9 +8533,18 @@
"compatibility": "backward",
"compatibility": "backward",
"status": "active"
"status": "active"
},
},
+ {
+ "id": "codes.model-plan",
+ "version": "1.0.0",
+ "owner": "codes",
+ "schema": "codes/model-plan.v1.json",
+ "visibility": "public",
+ "compatibility": "backward",
+ "status": "active"
+ },
{
{
"id": "codes.task-start-request",
"id": "codes.task-start-request",
- "version": "1.1.0",
+ "version": "1.2.0",
"owner": "codes",
"owner": "codes",
"schema": "codes/task-start-request.v1.json",
"schema": "codes/task-start-request.v1.json",
"visibility": "first-party",
"visibility": "first-party",
@@ -8544,7 +8571,7 @@
@@ -8544,7 +8571,7 @@
},
},
{
{
"id": "codes.task",
"id": "codes.task",
- "version": "2.0.0",
+ "version": "2.1.0",
"owner": "codes",
"owner": "codes",
"schema": "codes/task.v2.json",
"schema": "codes/task.v2.json",
"visibility": "first-party",
"visibility": "first-party",
@@ -10811,6 +10838,15 @@
@@ -10811,6 +10838,15 @@
"compatibility": "backward",
"compatibility": "backward",
"status": "active"
"status": "active"
},
},
+ {
+ "id": "meme.caption.created",
+ "version": "1.0.0",
+ "owner": "meme",
+ "schema": "events/payloads/meme.caption.created.v1.json",
+ "visibility": "first-party",
+ "compatibility": "backward",
+ "status": "active"
+ },
{
{
"id": "meme.template",
"id": "meme.template",
"version": "1.0.0",
"version": "1.0.0",
new file mode 100644
new file mode 100644
@@ -0,0 +1,54 @@
@@ -0,0 +1,54 @@
+{
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "https://openvibe.network/contracts/codes/model-plan.v1.json",
+ "title": "CodesModelPlan",
+ "description": "codes.model-plan@1: a versioned execution plan for a Codes task. Roles are attempted in list order. The ladder names AI registry ids in fallback order; auto asks AI to route. A pair requires reviewer approval, a council has two or three planner samples and a judge, and escalation advances on a failed check, refusal, or low confidence.",
+ "type": "object",
+ "additionalProperties": false,
+ "required": ["mode", "roles", "checks"],
+ "properties": {
+ "mode": { "enum": ["single", "pair", "council", "escalate"] },
+ "roles": {
+ "type": "array",
+ "minItems": 1,
+ "maxItems": 8,
+ "items": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": ["role", "model", "effort"],
+ "properties": {
+ "role": { "enum": ["planner", "builder", "reviewer", "verifier"] },
+ "model": { "type": "string", "minLength": 1, "maxLength": 200, "pattern": "^(auto|[A-Za-z0-9][A-Za-z0-9._:/@+-]*)$" },
+ "effort": { "enum": ["none", "low", "medium", "high", "xhigh", "max"] },
+ "samples": { "type": "integer", "minimum": 1, "maximum": 5 },
+ "budget": {
+ "type": "object", "additionalProperties": false, "minProperties": 1,
+ "properties": {
+ "tokens": { "type": "integer", "minimum": 1, "maximum": 100000000 },
+ "minutes": { "type": "number", "exclusiveMinimum": 0, "maximum": 1440 },
+ "dollars": { "type": "number", "exclusiveMinimum": 0, "maximum": 10000 }
+ }
+ }
+ }
+ }
+ },
+ "ladder": {
+ "type": "array", "minItems": 1, "maxItems": 8, "uniqueItems": true,
+ "items": { "type": "string", "minLength": 1, "maxLength": 200, "pattern": "^(auto|[A-Za-z0-9][A-Za-z0-9._:/@+-]*)$" }
+ },
+ "checks": {
+ "type": "object", "additionalProperties": false, "minProperties": 1,
+ "properties": {
+ "tests": { "type": "boolean" },
+ "lint": { "type": "boolean" },
+ "reviewer": { "type": "boolean" }
+ }
+ }
+ },
+ "allOf": [
+ { "if": { "properties": { "mode": { "const": "pair" } } }, "then": { "properties": { "roles": { "type": "array", "contains": { "type": "object", "properties": { "role": { "const": "reviewer" } }, "required": ["role"] } }, "checks": { "type": "object", "properties": { "reviewer": { "const": true } }, "required": ["reviewer"] } } } },
+ { "if": { "properties": { "mode": { "const": "council" } } }, "then": { "properties": { "roles": { "type": "array", "contains": { "type": "object", "properties": { "role": { "const": "planner" }, "samples": { "type": "integer", "minimum": 2, "maximum": 3 } }, "required": ["role", "samples"] } } } } },
+ { "if": { "properties": { "mode": { "const": "escalate" } } }, "then": { "required": ["ladder"], "properties": { "ladder": { "type": "array", "minItems": 2 } } } },
+ { "properties": { "roles": { "type": "array", "contains": { "type": "object", "properties": { "role": { "const": "builder" } }, "required": ["role"] } } } }
+ ]
+}
@@ -41,6 +41,12 @@
@@ -41,6 +41,12 @@
"goal": {
"goal": {
"$ref": "../agent/goal.v1.json"
"$ref": "../agent/goal.v1.json"
},
},
+ "plan": {
+ "$ref": "model-plan.v1.json"
+ },
+ "preset": {
+ "enum": ["Fast", "Balanced", "Deep", "Council"]
+ },
"push": {
"push": {
"type": "boolean"
"type": "boolean"
},
},
@@ -65,5 +71,6 @@
@@ -65,5 +71,6 @@
"maxLength": 256,
"maxLength": 256,
"description": "The OpenVibe.Actor step id when this coding task was started from Actor."
"description": "The OpenVibe.Actor step id when this coding task was started from Actor."
}
}
- }
+ },
+ "not": { "required": ["plan", "preset"] }
}
}
@@ -48,6 +48,25 @@
@@ -48,6 +48,25 @@
],
],
"maxLength": 41
"maxLength": 41
},
},
+ "model_plan": { "$ref": "model-plan.v1.json" },
+ "preset": { "enum": ["Fast", "Balanced", "Deep", "Council"] },
+ "role_runs": {
+ "type": "array", "maxItems": 30,
+ "items": {
+ "type": "object", "additionalProperties": false,
+ "required": ["role", "model", "outcome", "tokens", "cost_usd", "duration_ms"],
+ "properties": {
+ "role": { "enum": ["planner", "builder", "reviewer", "verifier"] },
+ "model": { "type": "string", "maxLength": 200 },
+ "effort": { "enum": ["none", "low", "medium", "high", "xhigh", "max"] },
+ "outcome": { "enum": ["approved", "rejected", "passed", "failed", "refused", "low_confidence", "skipped"] },
+ "tokens": { "type": "integer", "minimum": 0 },
+ "cost_usd": { "type": "number", "minimum": 0 },
+ "duration_ms": { "type": "integer", "minimum": 0 },
+ "reason": { "type": "string", "maxLength": 1000 }
+ }
+ }
+ },
"url": {
"url": {
"type": "string",
"type": "string",
"format": "uri",
"format": "uri",
@@ -2,7 +2,7 @@
@@ -2,7 +2,7 @@
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://openvibe.network/contracts/community/comment-write-request.v1.json",
"$id": "https://openvibe.network/contracts/community/comment-write-request.v1.json",
"title": "CommunityCommentWriteRequest",
"title": "CommunityCommentWriteRequest",
- "description": "community.comment-write-request@1: bodies of community.comment.write on OpenVibe.Community (people, anonymous people with a name where the thread allows it, and services acting as X-OV-Subject or as AI). POST /api/v1/comments/threads/resolve: { ref } — get or create the thread of an entity (browsers only for the allow-listed entity types; a label is taken only from a service). POST /api/v1/comments/threads/:id/comments: { message, parent_id?, anon_name? } (message trimmed, at most 5000 characters; a reply to a reply joins the top-level comment). POST /api/v1/comments/:commentId/votes: { value: 1 | -1 | 0 } (people). GET /api/v1/comments/threads/:id and DELETE /api/v1/comments/:commentId take no body. Unknown fields are ignored.",
+ "description": "community.comment-write-request@1: bodies of community.comment.write on OpenVibe.Community (people, anonymous people with a name where the thread allows it, and services acting as X-OV-Subject or as AI). POST /api/v1/comments/threads/resolve: { ref } \u2014 get or create the thread of an entity (browsers only for the allow-listed entity types; a label is taken only from a service). POST /api/v1/comments/threads/:id/comments: { message, parent_id?, anon_name?, attachments? } (message trimmed, at most 5000 characters; a reply to a reply joins the top-level comment). POST /api/v1/comments/:commentId/votes: { value: 1 | -1 | 0 } (people). GET /api/v1/comments/threads/:id and DELETE /api/v1/comments/:commentId take no body. Unknown fields are ignored.",
"anyOf": [
"anyOf": [
{
{
"type": "object",
"type": "object",
@@ -39,6 +39,13 @@
@@ -39,6 +39,13 @@
"string",
"string",
"null"
"null"
]
]
+ },
+ "attachments": {
+ "type": "array",
+ "maxItems": 4,
+ "items": {
+ "$ref": "../ai/file.v1.json"
+ }
}
}
}
}
},
},
@@ -2,7 +2,7 @@
@@ -2,7 +2,7 @@
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://openvibe.network/contracts/community/comment.v1.json",
"$id": "https://openvibe.network/contracts/community/comment.v1.json",
"title": "CommunityComment",
"title": "CommunityComment",
- "description": "community.comment@1: one comment in an embeddable comment thread on OpenVibe.Community (server/comments/service.js shapeComment), with its author (or anonymous name), score and the caller's vote, reply count and, for top-level comments in a page, the first replies. A deleted comment keeps its place with no author or message.",
+ "description": "community.comment@1: one comment in an embeddable comment thread on OpenVibe.Community (server/comments/service.js shapeComment), with its author (or anonymous name), score and the caller's vote, reply count and, for top-level comments in a page, the first two replies. A deleted comment keeps its place with no author or message.",
"type": "object",
"type": "object",
"required": [
"required": [
"id",
"id",
@@ -158,6 +158,34 @@
@@ -158,6 +158,34 @@
"items": {
"items": {
"type": "object"
"type": "object"
}
}
+ },
+ "reply_to_id": {
+ "type": [
+ "integer",
+ "null"
+ ],
+ "description": "The exact comment answered; parent_id remains the top-level comment."
+ },
+ "reply_to": {
+ "type": [
+ "object",
+ "null"
+ ],
+ "properties": {
+ "id": {
+ "type": "integer"
+ },
+ "display_name": {
+ "type": "string"
+ }
+ }
+ },
+ "attachments": {
+ "type": "array",
+ "maxItems": 4,
+ "items": {
+ "$ref": "../ai/file.v1.json"
+ }
}
}
}
}
}
}
new file mode 100644
new file mode 100644
@@ -0,0 +1,14 @@
@@ -0,0 +1,14 @@
+{
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "https://openvibe.network/contracts/events/payloads/meme.caption.created.v1.json",
+ "title": "MemeCaptionCreatedPayload",
+ "description": "meme.caption.created v1 (OpenVibe.Meme): a signed-in person saved a public caption. The event names only its id and owner, never the caption text, template, or other people's content. Envelope source meme, actor the owner, subject the caption, visibility internal.",
+ "type": "object",
+ "required": ["caption_id", "owner", "created_at"],
+ "additionalProperties": false,
+ "properties": {
+ "caption_id": { "type": "string", "pattern": "^mcp_[0-9A-HJKMNP-TV-Z]{26}$" },
+ "owner": { "$ref": "../../identity/subject-ref.v1.json" },
+ "created_at": { "type": "string", "format": "date-time" }
+ }
+}
@@ -46,6 +46,20 @@
@@ -46,6 +46,20 @@
"type": "object",
"type": "object",
"description": "The desk's answer on an ack (bot.command-result@1 data)."
"description": "The desk's answer on an ack (bot.command-result@1 data)."
},
},
+ "delivery": {
+ "enum": ["delivered", "not_delivered", "uncertain"],
+ "description": "Whether the command reached the machine. Absent on older servers means unknown."
+ },
+ "retry": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": ["safe"],
+ "properties": {
+ "safe": { "type": "boolean" },
+ "reason": { "type": "string", "minLength": 1, "maxLength": 500 }
+ },
+ "description": "safe is true only when delivery is not_delivered."
+ },
"state": {
"state": {
"$ref": "session.v1.json#/properties/state"
"$ref": "session.v1.json#/properties/state"
}
}
@@ -33,6 +33,12 @@
@@ -33,6 +33,12 @@
"pattern": "^dev_[0-9A-HJKMNP-TV-Z]{26}$",
"pattern": "^dev_[0-9A-HJKMNP-TV-Z]{26}$",
"description": "One of the person's own machines, by its OpenVibe.Bot id; the session goes there or nowhere."
"description": "One of the person's own machines, by its OpenVibe.Bot id; the session goes there or nowhere."
},
},
+ "origins": {
+ "type": "array",
+ "maxItems": 32,
+ "items": { "type": "string", "minLength": 8, "maxLength": 2048, "pattern": "^https?://" },
+ "description": "Exact HTTP(S) origins allowed for this browser session. Run fixes the list at creation and places it only on a user-owned desk that can enforce it. This option is owner switched off by default."
+ },
"requirements": {
"requirements": {
"$ref": "../platform/workload-requirements.v1.json"
"$ref": "../platform/workload-requirements.v1.json"
},
},
new file mode 100644
new file mode 100644
@@ -0,0 +1,8 @@
@@ -0,0 +1,8 @@
+{
+ "id": "arena/anonymous-silver",
+ "provider": "arena",
+ "model": "anonymous-silver",
+ "name": "anonymous-silver",
+ "status": "spotted",
+ "routing_enabled": true
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,9 @@
@@ -0,0 +1,9 @@
+{
+ "id": "arena/anonymous-silver",
+ "provider": "arena",
+ "model": "anonymous-silver",
+ "name": "anonymous-silver",
+ "status": "spotted",
+ "routing_enabled": false,
+ "sources": [{"url": "https://lmarena.ai/leaderboard/text", "observed_at": "2026-11-11T00:00:00Z"}]
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,3 @@
@@ -0,0 +1,3 @@
+{
+ "models": []
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,7 @@
@@ -0,0 +1,7 @@
+{
+ "count": 2,
+ "models": [
+ {"id": "google/gemini-preview", "provider": "google", "model": "gemini-preview", "name": "Gemini Preview", "status": "preview", "routing_enabled": false},
+ {"id": "google/gemini-old", "provider": "google", "model": "gemini-old", "name": "Gemini Old", "status": "retired", "routing_enabled": false}
+ ]
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,12 @@
@@ -0,0 +1,12 @@
+{
+ "v": 1,
+ "seq": 17,
+ "ts": 1759600000017,
+ "type": "command_result",
+ "id": "op-11",
+ "result": "ack",
+ "delivery": "maybe",
+ "retry": {
+ "safe": true
+ }
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,15 @@
@@ -0,0 +1,15 @@
+{
+ "v": 1,
+ "seq": 16,
+ "ts": 1759600000016,
+ "type": "command_result",
+ "id": "op-10",
+ "result": "ack",
+ "reason": null,
+ "latency_ms": 87,
+ "delivery": "delivered",
+ "retry": {
+ "safe": false,
+ "reason": "the command already ran; repeating it runs it twice"
+ }
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,14 @@
@@ -0,0 +1,14 @@
+{
+ "v": 1,
+ "seq": 15,
+ "ts": 1759600000015,
+ "type": "command_result",
+ "id": "op-9",
+ "result": "expired",
+ "reason": "no answer before the deadline; the machine never confirmed receipt",
+ "delivery": "not_delivered",
+ "retry": {
+ "safe": true,
+ "reason": "the command never reached the machine"
+ }
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1 @@
@@ -0,0 +1 @@
+{"mode":"single","roles":[{"role":"builder","model":"auto","effort":"ultra"}],"checks":{"tests":true}}
new file mode 100644
new file mode 100644
@@ -0,0 +1 @@
@@ -0,0 +1 @@
+{"mode":"council","roles":[{"role":"planner","model":"auto","effort":"high","samples":1},{"role":"builder","model":"auto","effort":"high"}],"checks":{"tests":true}}
new file mode 100644
new file mode 100644
@@ -0,0 +1 @@
@@ -0,0 +1 @@
+{"mode":"escalate","roles":[{"role":"builder","model":"auto","effort":"low"}],"checks":{"tests":true}}
new file mode 100644
new file mode 100644
@@ -0,0 +1 @@
@@ -0,0 +1 @@
+{"mode":"pair","roles":[{"role":"builder","model":"auto","effort":"high"}],"checks":{"tests":true}}
new file mode 100644
new file mode 100644
@@ -0,0 +1 @@
@@ -0,0 +1 @@
+{"mode":"council","roles":[{"role":"planner","model":"auto","effort":"high","samples":3},{"role":"builder","model":"auto","effort":"high"},{"role":"reviewer","model":"auto","effort":"high"},{"role":"verifier","model":"auto","effort":"medium"}],"checks":{"tests":true,"reviewer":true}}
new file mode 100644
new file mode 100644
@@ -0,0 +1 @@
@@ -0,0 +1 @@
+{"mode":"escalate","roles":[{"role":"builder","model":"auto","effort":"low"},{"role":"verifier","model":"auto","effort":"medium"}],"ladder":["openvibe/economy","openvibe/auto"],"checks":{"tests":true}}
new file mode 100644
new file mode 100644
@@ -0,0 +1 @@
@@ -0,0 +1 @@
+{"mode":"pair","roles":[{"role":"builder","model":"auto","effort":"high","budget":{"tokens":100000,"minutes":30,"dollars":2}},{"role":"reviewer","model":"openvibe/auto","effort":"medium"}],"checks":{"tests":true,"lint":true,"reviewer":true}}
new file mode 100644
new file mode 100644
@@ -0,0 +1,6 @@
@@ -0,0 +1,6 @@
+{
+ "caption_id": "mcp_01M516F1WX5NN6C0EMW2V0G8Y9",
+ "owner": { "type": "user", "id": "usr_01J8Z3V9Q6N1X2Y3Z4A5B6C7D8" },
+ "created_at": "2026-11-11T03:00:00.000Z",
+ "text": "Private content must not enter the event"
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,5 @@
@@ -0,0 +1,5 @@
+{
+ "caption_id": "mcp_01M516F1WX5NN6C0EMW2V0G8Y9",
+ "owner": { "type": "user", "id": "usr_01J8Z3V9Q6N1X2Y3Z4A5B6C7D8" },
+ "created_at": "2026-11-11T03:00:00.000Z"
+}
@@ -19194,6 +19194,237 @@
@@ -19194,6 +19194,237 @@
}
}
}
}
},
},
+ "ai.model-directory-entry": {
+ "version": "1.0.0",
+ "owner": "ai",
+ "status": "active",
+ "schema": {
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "https://openvibe.network/contracts/ai/model-directory-entry.v1.json",
+ "title": "AiModelDirectoryEntry",
+ "description": "ai.model-directory-entry@1: one public model, including provider-listed models with routing off and sourced pre-list sightings. Spotted never means available.",
+ "type": "object",
+ "required": [
+ "id",
+ "provider",
+ "model",
+ "name",
+ "status",
+ "routing_enabled"
+ ],
+ "additionalProperties": true,
+ "allOf": [
+ {
+ "if": {
+ "properties": {
+ "status": {
+ "enum": [
+ "spotted",
+ "retired"
+ ]
+ }
+ }
+ },
+ "then": {
+ "properties": {
+ "routing_enabled": {
+ "const": false
+ }
+ }
+ }
+ }
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "minLength": 3,
+ "maxLength": 256
+ },
+ "provider": {
+ "type": "string",
+ "minLength": 1
+ },
+ "provider_name": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "model": {
+ "type": "string",
+ "minLength": 1
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1
+ },
+ "family": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "version": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "status": {
+ "enum": [
+ "available",
+ "preview",
+ "spotted",
+ "retired"
+ ]
+ },
+ "routing_enabled": {
+ "type": "boolean"
+ },
+ "context_window": {
+ "type": [
+ "integer",
+ "null"
+ ],
+ "minimum": 0
+ },
+ "max_output": {
+ "type": [
+ "integer",
+ "null"
+ ],
+ "minimum": 0
+ },
+ "type": {
+ "type": "string"
+ },
+ "modalities": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "price": {
+ "type": "object",
+ "properties": {
+ "input_per_million": {
+ "type": [
+ "number",
+ "null"
+ ],
+ "minimum": 0
+ },
+ "output_per_million": {
+ "type": [
+ "number",
+ "null"
+ ],
+ "minimum": 0
+ },
+ "cached_per_million": {
+ "type": [
+ "number",
+ "null"
+ ],
+ "minimum": 0
+ },
+ "source": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "format": "uri"
+ },
+ "checked_at": {
+ "type": [
+ "string",
+ "null"
+ ]
+ }
+ }
+ },
+ "source": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "format": "uri"
+ },
+ "sources": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "url",
+ "observed_at"
+ ],
+ "properties": {
+ "url": {
+ "type": "string",
+ "format": "uri"
+ },
+ "observed_at": {
+ "type": "string"
+ },
+ "published_at": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "first_seen_at": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "updated_at": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "retired_at": {
+ "type": [
+ "string",
+ "null"
+ ]
+ }
+ }
+ }
+ },
+ "ai.model-directory-list": {
+ "version": "1.0.0",
+ "owner": "ai",
+ "status": "active",
+ "schema": {
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "https://openvibe.network/contracts/ai/model-directory-list.v1.json",
+ "title": "AiModelDirectoryList",
+ "description": "ai.model-directory-list@1: public model directory response; the list may include spotted, disabled and retired models.",
+ "type": "object",
+ "required": [
+ "models",
+ "count"
+ ],
+ "additionalProperties": true,
+ "properties": {
+ "generated_at": {
+ "type": "string"
+ },
+ "count": {
+ "type": "integer",
+ "minimum": 0
+ },
+ "models": {
+ "type": "array",
+ "items": {
+ "$ref": "model-directory-entry.v1.json"
+ }
+ }
+ }
+ }
+ },
"ai.model-read-result": {
"ai.model-read-result": {
"version": "1.0.0",
"version": "1.0.0",
"owner": "ai",
"owner": "ai",
@@ -68717,7 +68948,7 @@
@@ -68717,7 +68948,7 @@
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://openvibe.network/contracts/community/comment-write-request.v1.json",
"$id": "https://openvibe.network/contracts/community/comment-write-request.v1.json",
"title": "CommunityCommentWriteRequest",
"title": "CommunityCommentWriteRequest",
- "description": "community.comment-write-request@1: bodies of community.comment.write on OpenVibe.Community (people, anonymous people with a name where the thread allows it, and services acting as X-OV-Subject or as AI). POST /api/v1/comments/threads/resolve: { ref } — get or create the thread of an entity (browsers only for the allow-listed entity types; a label is taken only from a service). POST /api/v1/comments/threads/:id/comments: { message, parent_id?, anon_name? } (message trimmed, at most 5000 characters; a reply to a reply joins the top-level comment). POST /api/v1/comments/:commentId/votes: { value: 1 | -1 | 0 } (people). GET /api/v1/comments/threads/:id and DELETE /api/v1/comments/:commentId take no body. Unknown fields are ignored.",
+ "description": "community.comment-write-request@1: bodies of community.comment.write on OpenVibe.Community (people, anonymous people with a name where the thread allows it, and services acting as X-OV-Subject or as AI). POST /api/v1/comments/threads/resolve: { ref } — get or create the thread of an entity (browsers only for the allow-listed entity types; a label is taken only from a service). POST /api/v1/comments/threads/:id/comments: { message, parent_id?, anon_name?, attachments? } (message trimmed, at most 5000 characters; a reply to a reply joins the top-level comment). POST /api/v1/comments/:commentId/votes: { value: 1 | -1 | 0 } (people). GET /api/v1/comments/threads/:id and DELETE /api/v1/comments/:commentId take no body. Unknown fields are ignored.",
"anyOf": [
"anyOf": [
{
{
"type": "object",
"type": "object",
@@ -68754,6 +68985,13 @@
@@ -68754,6 +68985,13 @@
"string",
"string",
"null"
"null"
]
]
+ },
+ "attachments": {
+ "type": "array",
+ "maxItems": 4,
+ "items": {
+ "$ref": "../ai/file.v1.json"
+ }
}
}
}
}
},
},
@@ -68919,7 +69157,7 @@
@@ -68919,7 +69157,7 @@
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://openvibe.network/contracts/community/comment.v1.json",
"$id": "https://openvibe.network/contracts/community/comment.v1.json",
"title": "CommunityComment",
"title": "CommunityComment",
- "description": "community.comment@1: one comment in an embeddable comment thread on OpenVibe.Community (server/comments/service.js shapeComment), with its author (or anonymous name), score and the caller's vote, reply count and, for top-level comments in a page, the first replies. A deleted comment keeps its place with no author or message.",
+ "description": "community.comment@1: one comment in an embeddable comment thread on OpenVibe.Community (server/comments/service.js shapeComment), with its author (or anonymous name), score and the caller's vote, reply count and, for top-level comments in a page, the first two replies. A deleted comment keeps its place with no author or message.",
"type": "object",
"type": "object",
"required": [
"required": [
"id",
"id",
@@ -69075,6 +69313,34 @@
@@ -69075,6 +69313,34 @@
"items": {
"items": {
"type": "object"
"type": "object"
}
}
+ },
+ "reply_to_id": {
+ "type": [
+ "integer",
+ "null"
+ ],
+ "description": "The exact comment answered; parent_id remains the top-level comment."
+ },
+ "reply_to": {
+ "type": [
+ "object",
+ "null"
+ ],
+ "properties": {
+ "id": {
+ "type": "integer"
+ },
+ "display_name": {
+ "type": "string"
+ }
+ }
+ },
+ "attachments": {
+ "type": "array",
+ "maxItems": 4,
+ "items": {
+ "$ref": "../ai/file.v1.json"
+ }
}
}
}
}
}
}
@@ -83414,6 +83680,17 @@
@@ -83414,6 +83680,17 @@
"pattern": "^https?://",
"pattern": "^https?://",
"description": "an http or https address"
"description": "an http or https address"
},
},
+ "origins": {
+ "type": "array",
+ "maxItems": 32,
+ "items": {
+ "type": "string",
+ "minLength": 8,
+ "maxLength": 2048,
+ "pattern": "^https?://"
+ },
+ "description": "Optional exact task origins. Link checks scheme, host and port and refuses other navigation and browser egress. Empty allows no network origin; absent keeps the legacy browser policy."
+ },
"selector": {
"selector": {
"type": "string",
"type": "string",
"minLength": 1,
"minLength": 1,
@@ -83852,7 +84129,7 @@
@@ -83852,7 +84129,7 @@
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://openvibe.network/contracts/bot/command-result.v1.json",
"$id": "https://openvibe.network/contracts/bot/command-result.v1.json",
"title": "BotCommandResult",
"title": "BotCommandResult",
- "description": "bot.command-result@1: the command_result frame OpenVibe.Bot answers a bot.command@1 with on the operator WebSocket (server/realtime.js). result: ack or nack (the device answered; reason is its fault code, latency_ms the round trip), refused (the gate refused it; code is Bot's refusal code such as bot.estop_latched, bot.cooldown or bot.device_offline, and reason says why), expired (no answer before the deadline) or pending (the same id is still in flight). cached is true when a repeated id is answered from the first result. An ack of a computer command (exec, fs, screen) carries its answer in data.",
+ "description": "bot.command-result@1: the command_result frame OpenVibe.Bot answers a bot.command@1 with on the operator WebSocket (server/realtime.js). result: ack or nack (the device answered; reason is its fault code, latency_ms the round trip), refused (the gate refused it; code is Bot's refusal code such as bot.estop_latched, bot.cooldown or bot.device_offline, and reason says why), expired (no answer before the deadline) or pending (the same id is still in flight). cached is true when a repeated id is answered from the first result. An ack of a computer command (exec, fs, screen) carries its answer in data. delivery says whether the command reached the machine (delivered, not_delivered, uncertain); retry says whether repeating it is safe. Only not_delivered is safe to repeat: a delivered command already ran, and an uncertain one may have.",
"type": "object",
"type": "object",
"required": [
"required": [
"v",
"v",
@@ -83912,6 +84189,33 @@
@@ -83912,6 +84189,33 @@
"data": {
"data": {
"type": "object",
"type": "object",
"description": "A computer command's answer as the machine gave it (exec: exit_code, stdout, stderr, truncated, timed_out, duration_ms; fs: entries, the stat, content_b64, written, created; screen: format, width, height, content_b64). Present only on an ack of exec, fs or screen."
"description": "A computer command's answer as the machine gave it (exec: exit_code, stdout, stderr, truncated, timed_out, duration_ms; fs: entries, the stat, content_b64, written, created; screen: format, width, height, content_b64). Present only on an ack of exec, fs or screen."
+ },
+ "delivery": {
+ "type": "string",
+ "enum": [
+ "delivered",
+ "not_delivered",
+ "uncertain"
+ ],
+ "description": "Whether the command reached the machine. Both senders and the device report it; absent means unknown."
+ },
+ "retry": {
+ "type": "object",
+ "description": "Whether repeating the command is safe. safe is true only when delivery is not_delivered.",
+ "additionalProperties": false,
+ "required": [
+ "safe"
+ ],
+ "properties": {
+ "safe": {
+ "type": "boolean"
+ },
+ "reason": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 500
+ }
+ }
}
}
}
}
}
}
@@ -95017,8 +95321,242 @@
@@ -95017,8 +95321,242 @@
]
]
}
}
},
},
+ "codes.model-plan": {
+ "version": "1.0.0",
+ "owner": "codes",
+ "status": "active",
+ "schema": {
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "https://openvibe.network/contracts/codes/model-plan.v1.json",
+ "title": "CodesModelPlan",
+ "description": "codes.model-plan@1: a versioned execution plan for a Codes task. Roles are attempted in list order. The ladder names AI registry ids in fallback order; auto asks AI to route. A pair requires reviewer approval, a council has two or three planner samples and a judge, and escalation advances on a failed check, refusal, or low confidence.",
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "mode",
+ "roles",
+ "checks"
+ ],
+ "properties": {
+ "mode": {
+ "enum": [
+ "single",
+ "pair",
+ "council",
+ "escalate"
+ ]
+ },
+ "roles": {
+ "type": "array",
+ "minItems": 1,
+ "maxItems": 8,
+ "items": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "role",
+ "model",
+ "effort"
+ ],
+ "properties": {
+ "role": {
+ "enum": [
+ "planner",
+ "builder",
+ "reviewer",
+ "verifier"
+ ]
+ },
+ "model": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 200,
+ "pattern": "^(auto|[A-Za-z0-9][A-Za-z0-9._:/@+-]*)$"
+ },
+ "effort": {
+ "enum": [
+ "none",
+ "low",
+ "medium",
+ "high",
+ "xhigh",
+ "max"
+ ]
+ },
+ "samples": {
+ "type": "integer",
+ "minimum": 1,
+ "maximum": 5
+ },
+ "budget": {
+ "type": "object",
+ "additionalProperties": false,
+ "minProperties": 1,
+ "properties": {
+ "tokens": {
+ "type": "integer",
+ "minimum": 1,
+ "maximum": 100000000
+ },
+ "minutes": {
+ "type": "number",
+ "exclusiveMinimum": 0,
+ "maximum": 1440
+ },
+ "dollars": {
+ "type": "number",
+ "exclusiveMinimum": 0,
+ "maximum": 10000
+ }
+ }
+ }
+ }
+ }
+ },
+ "ladder": {
+ "type": "array",
+ "minItems": 1,
+ "maxItems": 8,
+ "uniqueItems": true,
+ "items": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 200,
+ "pattern": "^(auto|[A-Za-z0-9][A-Za-z0-9._:/@+-]*)$"
+ }
+ },
+ "checks": {
+ "type": "object",
+ "additionalProperties": false,
+ "minProperties": 1,
+ "properties": {
+ "tests": {
+ "type": "boolean"
+ },
+ "lint": {
+ "type": "boolean"
+ },
+ "reviewer": {
+ "type": "boolean"
+ }
+ }
+ }
+ },
+ "allOf": [
+ {
+ "if": {
+ "properties": {
+ "mode": {
+ "const": "pair"
+ }
+ }
+ },
+ "then": {
+ "properties": {
+ "roles": {
+ "type": "array",
+ "contains": {
+ "type": "object",
+ "properties": {
+ "role": {
+ "const": "reviewer"
+ }
+ },
+ "required": [
+ "role"
+ ]
+ }
+ },
+ "checks": {
+ "type": "object",
+ "properties": {
+ "reviewer": {
+ "const": true
+ }
+ },
+ "required": [
+ "reviewer"
+ ]
+ }
+ }
+ }
+ },
+ {
+ "if": {
+ "properties": {
+ "mode": {
+ "const": "council"
+ }
+ }
+ },
+ "then": {
+ "properties": {
+ "roles": {
+ "type": "array",
+ "contains": {
+ "type": "object",
+ "properties": {
+ "role": {
+ "const": "planner"
+ },
+ "samples": {
+ "type": "integer",
+ "minimum": 2,
+ "maximum": 3
+ }
+ },
+ "required": [
+ "role",
+ "samples"
+ ]
+ }
+ }
+ }
+ }
+ },
+ {
+ "if": {
+ "properties": {
+ "mode": {
+ "const": "escalate"
+ }
+ }
+ },
+ "then": {
+ "required": [
+ "ladder"
+ ],
+ "properties": {
+ "ladder": {
+ "type": "array",
+ "minItems": 2
+ }
+ }
+ }
+ },
+ {
+ "properties": {
+ "roles": {
+ "type": "array",
+ "contains": {
+ "type": "object",
+ "properties": {
+ "role": {
+ "const": "builder"
+ }
+ },
+ "required": [
+ "role"
+ ]
+ }
+ }
+ }
+ }
+ ]
+ }
+ },
"codes.task-start-request": {
"codes.task-start-request": {
- "version": "1.1.0",
+ "version": "1.2.0",
"owner": "codes",
"owner": "codes",
"status": "active",
"status": "active",
"schema": {
"schema": {
@@ -95064,6 +95602,17 @@
@@ -95064,6 +95602,17 @@
"goal": {
"goal": {
"$ref": "../agent/goal.v1.json"
"$ref": "../agent/goal.v1.json"
},
},
+ "plan": {
+ "$ref": "model-plan.v1.json"
+ },
+ "preset": {
+ "enum": [
+ "Fast",
+ "Balanced",
+ "Deep",
+ "Council"
+ ]
+ },
"push": {
"push": {
"type": "boolean"
"type": "boolean"
},
},
@@ -95088,6 +95637,12 @@
@@ -95088,6 +95637,12 @@
"maxLength": 256,
"maxLength": 256,
"description": "The OpenVibe.Actor step id when this coding task was started from Actor."
"description": "The OpenVibe.Actor step id when this coding task was started from Actor."
}
}
+ },
+ "not": {
+ "required": [
+ "plan",
+ "preset"
+ ]
}
}
}
}
},
},
@@ -95321,7 +95876,7 @@
@@ -95321,7 +95876,7 @@
}
}
},
},
"codes.task@2": {
"codes.task@2": {
- "version": "2.0.0",
+ "version": "2.1.0",
"owner": "codes",
"owner": "codes",
"status": "active",
"status": "active",
"schema": {
"schema": {
@@ -95374,6 +95929,84 @@
@@ -95374,6 +95929,84 @@
],
],
"maxLength": 41
"maxLength": 41
},
},
+ "model_plan": {
+ "$ref": "model-plan.v1.json"
+ },
+ "preset": {
+ "enum": [
+ "Fast",
+ "Balanced",
+ "Deep",
+ "Council"
+ ]
+ },
+ "role_runs": {
+ "type": "array",
+ "maxItems": 30,
+ "items": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "role",
+ "model",
+ "outcome",
+ "tokens",
+ "cost_usd",
+ "duration_ms"
+ ],
+ "properties": {
+ "role": {
+ "enum": [
+ "planner",
+ "builder",
+ "reviewer",
+ "verifier"
+ ]
+ },
+ "model": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "effort": {
+ "enum": [
+ "none",
+ "low",
+ "medium",
+ "high",
+ "xhigh",
+ "max"
+ ]
+ },
+ "outcome": {
+ "enum": [
+ "approved",
+ "rejected",
+ "passed",
+ "failed",
+ "refused",
+ "low_confidence",
+ "skipped"
+ ]
+ },
+ "tokens": {
+ "type": "integer",
+ "minimum": 0
+ },
+ "cost_usd": {
+ "type": "number",
+ "minimum": 0
+ },
+ "duration_ms": {
+ "type": "integer",
+ "minimum": 0
+ },
+ "reason": {
+ "type": "string",
+ "maxLength": 1000
+ }
+ }
+ }
+ },
"url": {
"url": {
"type": "string",
"type": "string",
"format": "uri",
"format": "uri",
@@ -97719,6 +98352,17 @@
@@ -97719,6 +98352,17 @@
"pattern": "^dev_[0-9A-HJKMNP-TV-Z]{26}$",
"pattern": "^dev_[0-9A-HJKMNP-TV-Z]{26}$",
"description": "One of the person's own machines, by its OpenVibe.Bot id; the session goes there or nowhere."
"description": "One of the person's own machines, by its OpenVibe.Bot id; the session goes there or nowhere."
},
},
+ "origins": {
+ "type": "array",
+ "maxItems": 32,
+ "items": {
+ "type": "string",
+ "minLength": 8,
+ "maxLength": 2048,
+ "pattern": "^https?://"
+ },
+ "description": "Exact HTTP(S) origins allowed for this browser session. Run fixes the list at creation and places it only on a user-owned desk that can enforce it. This option is owner switched off by default."
+ },
"requirements": {
"requirements": {
"$ref": "../platform/workload-requirements.v1.json"
"$ref": "../platform/workload-requirements.v1.json"
},
},
@@ -97855,6 +98499,32 @@
@@ -97855,6 +98499,32 @@
"type": "object",
"type": "object",
"description": "The desk's answer on an ack (bot.command-result@1 data)."
"description": "The desk's answer on an ack (bot.command-result@1 data)."
},
},
+ "delivery": {
+ "enum": [
+ "delivered",
+ "not_delivered",
+ "uncertain"
+ ],
+ "description": "Whether the command reached the machine. Absent on older servers means unknown."
+ },
+ "retry": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "safe"
+ ],
+ "properties": {
+ "safe": {
+ "type": "boolean"
+ },
+ "reason": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 500
+ }
+ },
+ "description": "safe is true only when delivery is not_delivered."
+ },
"state": {
"state": {
"$ref": "session.v1.json#/properties/state"
"$ref": "session.v1.json#/properties/state"
}
}
@@ -98412,6 +99082,17 @@
@@ -98412,6 +99082,17 @@
"height": {
"height": {
"$ref": "desk-lease.v1.json#/properties/height",
"$ref": "desk-lease.v1.json#/properties/height",
"description": "Default 800."
"description": "Default 800."
+ },
+ "origins": {
+ "type": "array",
+ "maxItems": 32,
+ "items": {
+ "type": "string",
+ "minLength": 8,
+ "maxLength": 2048,
+ "pattern": "^https?://"
+ },
+ "description": "The session's exact browser origins, fixed for this lease. Empty allows no network origin; absent keeps the legacy policy. A shared desk that cannot enforce the list is refused."
}
}
}
}
}
}
@@ -118613,6 +119294,37 @@
@@ -118613,6 +119294,37 @@
"additionalProperties": true
"additionalProperties": true
}
}
},
},
+ "meme.caption.created": {
+ "version": "1.0.0",
+ "owner": "meme",
+ "status": "active",
+ "schema": {
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "https://openvibe.network/contracts/events/payloads/meme.caption.created.v1.json",
+ "title": "MemeCaptionCreatedPayload",
+ "description": "meme.caption.created v1 (OpenVibe.Meme): a signed-in person saved a public caption. The event names only its id and owner, never the caption text, template, or other people's content. Envelope source meme, actor the owner, subject the caption, visibility internal.",
+ "type": "object",
+ "required": [
+ "caption_id",
+ "owner",
+ "created_at"
+ ],
+ "additionalProperties": false,
+ "properties": {
+ "caption_id": {
+ "type": "string",
+ "pattern": "^mcp_[0-9A-HJKMNP-TV-Z]{26}$"
+ },
+ "owner": {
+ "$ref": "../../identity/subject-ref.v1.json"
+ },
+ "created_at": {
+ "type": "string",
+ "format": "date-time"
+ }
+ }
+ }
+ },
"meme.template": {
"meme.template": {
"version": "1.0.0",
"version": "1.0.0",
"owner": "meme",
"owner": "meme",
@@ -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.405.0",
- "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.405.0): each operation lists the capabilities it performs; a token for 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.406.0",
+ "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.406.0): each operation lists the capabilities it performs; a token for 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.405.0",
- "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.405.0): each operation lists the capabilities it performs; a token for 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.406.0",
+ "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.406.0): each operation lists the capabilities it performs; a token for 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.405.0",
- "description": "Routes of OpenVibe.Bench as the OpenVibe contracts describe them (openvibe-contracts 0.405.0): each operation lists the capabilities it performs; a token for 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.406.0",
+ "description": "Routes of OpenVibe.Bench as the OpenVibe contracts describe them (openvibe-contracts 0.406.0): each operation lists the capabilities it performs; a token for 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.405.0",
- "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.405.0): each operation lists the capabilities it performs; a token for 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.406.0",
+ "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.406.0): each operation lists the capabilities it performs; a token for 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.405.0",
- "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.405.0): each operation lists the capabilities it performs; a token for 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.406.0",
+ "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.406.0): each operation lists the capabilities it performs; a token for 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.405.0",
- "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.405.0): each operation lists the capabilities it performs; a token for 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.406.0",
+ "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.406.0): each operation lists the capabilities it performs; a token for 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"
@@ -787,6 +787,23 @@
@@ -787,6 +787,23 @@
"description": "Default 800."
"description": "Default 800."
},
},
"description": "Default 800."
"description": "Default 800."
+ },
+ {
+ "name": "origins",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "array",
+ "maxItems": 32,
+ "items": {
+ "type": "string",
+ "minLength": 8,
+ "maxLength": 2048,
+ "pattern": "^https?://"
+ },
+ "description": "The session's exact browser origins, fixed for this lease. Empty allows no network origin; absent keeps the legacy policy. A shared desk that cannot enforce the list is refused."
+ },
+ "description": "The session's exact browser origins, fixed for this lease. Empty allows no network origin; absent keeps the legacy policy. A shared desk that cannot enforce the list is refused."
}
}
],
],
"responses": {
"responses": {
@@ -888,6 +905,23 @@
@@ -888,6 +905,23 @@
"description": "Default 800."
"description": "Default 800."
},
},
"description": "Default 800."
"description": "Default 800."
+ },
+ {
+ "name": "origins",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "array",
+ "maxItems": 32,
+ "items": {
+ "type": "string",
+ "minLength": 8,
+ "maxLength": 2048,
+ "pattern": "^https?://"
+ },
+ "description": "The session's exact browser origins, fixed for this lease. Empty allows no network origin; absent keeps the legacy policy. A shared desk that cannot enforce the list is refused."
+ },
+ "description": "The session's exact browser origins, fixed for this lease. Empty allows no network origin; absent keeps the legacy policy. A shared desk that cannot enforce the list is refused."
}
}
],
],
"responses": {
"responses": {
@@ -2295,6 +2329,17 @@
@@ -2295,6 +2329,17 @@
"height": {
"height": {
"$ref": "#/components/schemas/bot.desk-lease.v1/properties/height",
"$ref": "#/components/schemas/bot.desk-lease.v1/properties/height",
"description": "Default 800."
"description": "Default 800."
+ },
+ "origins": {
+ "type": "array",
+ "maxItems": 32,
+ "items": {
+ "type": "string",
+ "minLength": 8,
+ "maxLength": 2048,
+ "pattern": "^https?://"
+ },
+ "description": "The session's exact browser origins, fixed for this lease. Empty allows no network origin; absent keeps the legacy policy. A shared desk that cannot enforce the list is refused."
}
}
}
}
},
},
@@ -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.405.0",
- "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.405.0): each operation lists the capabilities it performs; a token for 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.406.0",
+ "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.406.0): each operation lists the capabilities it performs; a token for 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.405.0",
- "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.405.0): each operation lists the capabilities it performs; a token for 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.406.0",
+ "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.406.0): each operation lists the capabilities it performs; a token for 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"
@@ -927,6 +927,233 @@
@@ -927,6 +927,233 @@
}
}
}
}
},
},
+ "codes.model-plan.v1": {
+ "title": "CodesModelPlan",
+ "description": "codes.model-plan@1: a versioned execution plan for a Codes task. Roles are attempted in list order. The ladder names AI registry ids in fallback order; auto asks AI to route. A pair requires reviewer approval, a council has two or three planner samples and a judge, and escalation advances on a failed check, refusal, or low confidence.",
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "mode",
+ "roles",
+ "checks"
+ ],
+ "properties": {
+ "mode": {
+ "enum": [
+ "single",
+ "pair",
+ "council",
+ "escalate"
+ ]
+ },
+ "roles": {
+ "type": "array",
+ "minItems": 1,
+ "maxItems": 8,
+ "items": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "role",
+ "model",
+ "effort"
+ ],
+ "properties": {
+ "role": {
+ "enum": [
+ "planner",
+ "builder",
+ "reviewer",
+ "verifier"
+ ]
+ },
+ "model": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 200,
+ "pattern": "^(auto|[A-Za-z0-9][A-Za-z0-9._:/@+-]*)$"
+ },
+ "effort": {
+ "enum": [
+ "none",
+ "low",
+ "medium",
+ "high",
+ "xhigh",
+ "max"
+ ]
+ },
+ "samples": {
+ "type": "integer",
+ "minimum": 1,
+ "maximum": 5
+ },
+ "budget": {
+ "type": "object",
+ "additionalProperties": false,
+ "minProperties": 1,
+ "properties": {
+ "tokens": {
+ "type": "integer",
+ "minimum": 1,
+ "maximum": 100000000
+ },
+ "minutes": {
+ "type": "number",
+ "exclusiveMinimum": 0,
+ "maximum": 1440
+ },
+ "dollars": {
+ "type": "number",
+ "exclusiveMinimum": 0,
+ "maximum": 10000
+ }
+ }
+ }
+ }
+ }
+ },
+ "ladder": {
+ "type": "array",
+ "minItems": 1,
+ "maxItems": 8,
+ "uniqueItems": true,
+ "items": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 200,
+ "pattern": "^(auto|[A-Za-z0-9][A-Za-z0-9._:/@+-]*)$"
+ }
+ },
+ "checks": {
+ "type": "object",
+ "additionalProperties": false,
+ "minProperties": 1,
+ "properties": {
+ "tests": {
+ "type": "boolean"
+ },
+ "lint": {
+ "type": "boolean"
+ },
+ "reviewer": {
+ "type": "boolean"
+ }
+ }
+ }
+ },
+ "allOf": [
+ {
+ "if": {
+ "properties": {
+ "mode": {
+ "const": "pair"
+ }
+ }
+ },
+ "then": {
+ "properties": {
+ "roles": {
+ "type": "array",
+ "contains": {
+ "type": "object",
+ "properties": {
+ "role": {
+ "const": "reviewer"
+ }
+ },
+ "required": [
+ "role"
+ ]
+ }
+ },
+ "checks": {
+ "type": "object",
+ "properties": {
+ "reviewer": {
+ "const": true
+ }
+ },
+ "required": [
+ "reviewer"
+ ]
+ }
+ }
+ }
+ },
+ {
+ "if": {
+ "properties": {
+ "mode": {
+ "const": "council"
+ }
+ }
+ },
+ "then": {
+ "properties": {
+ "roles": {
+ "type": "array",
+ "contains": {
+ "type": "object",
+ "properties": {
+ "role": {
+ "const": "planner"
+ },
+ "samples": {
+ "type": "integer",
+ "minimum": 2,
+ "maximum": 3
+ }
+ },
+ "required": [
+ "role",
+ "samples"
+ ]
+ }
+ }
+ }
+ }
+ },
+ {
+ "if": {
+ "properties": {
+ "mode": {
+ "const": "escalate"
+ }
+ }
+ },
+ "then": {
+ "required": [
+ "ladder"
+ ],
+ "properties": {
+ "ladder": {
+ "type": "array",
+ "minItems": 2
+ }
+ }
+ }
+ },
+ {
+ "properties": {
+ "roles": {
+ "type": "array",
+ "contains": {
+ "type": "object",
+ "properties": {
+ "role": {
+ "const": "builder"
+ }
+ },
+ "required": [
+ "role"
+ ]
+ }
+ }
+ }
+ }
+ ]
+ },
"codes.task-start-request.v1": {
"codes.task-start-request.v1": {
"title": "CodesTaskStartRequest",
"title": "CodesTaskStartRequest",
"description": "codes.task-start-request@1: the body of POST /api/v1/tasks on OpenVibe.Codes (capability codes.task.start). A first-party service (OpenVibe.Actor) starts a coding task for a person, named with X-OV-Subject: Codes runs it on that person's own machine through OpenVibe.Run (openvibe.codes/run, plan T16), in the project of their latest task there, so the person has used openvibe.codes/run once before a service can start one for them (else 409 codes.no_project). REPO is an https git URL with no credentials; REF a branch or tag to start from (default: the repository's default branch). PROMPT is the task. AGENT names one of Codes' agents (GET /harnesses), absent for Codes' router to pick. PERMISSION: review (read-only: research, audits, reviews; nothing is changed), edit (default; the agents edit files) or full (they may also run commands: tests, installs). PUSH asks for the change on a new branch (GitHub, with the machine's GITHUB_TOKEN; never the branch it started from), PULL_REQUEST also opens a pull request. IDEMPOTENCY_KEY: a repeat for the same person with the same key answers the first task (200, created false).",
"description": "codes.task-start-request@1: the body of POST /api/v1/tasks on OpenVibe.Codes (capability codes.task.start). A first-party service (OpenVibe.Actor) starts a coding task for a person, named with X-OV-Subject: Codes runs it on that person's own machine through OpenVibe.Run (openvibe.codes/run, plan T16), in the project of their latest task there, so the person has used openvibe.codes/run once before a service can start one for them (else 409 codes.no_project). REPO is an https git URL with no credentials; REF a branch or tag to start from (default: the repository's default branch). PROMPT is the task. AGENT names one of Codes' agents (GET /harnesses), absent for Codes' router to pick. PERMISSION: review (read-only: research, audits, reviews; nothing is changed), edit (default; the agents edit files) or full (they may also run commands: tests, installs). PUSH asks for the change on a new branch (GitHub, with the machine's GITHUB_TOKEN; never the branch it started from), PULL_REQUEST also opens a pull request. IDEMPOTENCY_KEY: a repeat for the same person with the same key answers the first task (200, created false).",
@@ -968,6 +1195,17 @@
@@ -968,6 +1195,17 @@
"goal": {
"goal": {
"$ref": "#/components/schemas/agent.goal.v1"
"$ref": "#/components/schemas/agent.goal.v1"
},
},
+ "plan": {
+ "$ref": "#/components/schemas/codes.model-plan.v1"
+ },
+ "preset": {
+ "enum": [
+ "Fast",
+ "Balanced",
+ "Deep",
+ "Council"
+ ]
+ },
"push": {
"push": {
"type": "boolean"
"type": "boolean"
},
},
@@ -992,6 +1230,12 @@
@@ -992,6 +1230,12 @@
"maxLength": 256,
"maxLength": 256,
"description": "The OpenVibe.Actor step id when this coding task was started from Actor."
"description": "The OpenVibe.Actor step id when this coding task was started from Actor."
}
}
+ },
+ "not": {
+ "required": [
+ "plan",
+ "preset"
+ ]
}
}
},
},
"codes.task-start-result.v1": {
"codes.task-start-result.v1": {
@@ -1257,6 +1501,84 @@
@@ -1257,6 +1501,84 @@
],
],
"maxLength": 41
"maxLength": 41
},
},
+ "model_plan": {
+ "$ref": "#/components/schemas/codes.model-plan.v1"
+ },
+ "preset": {
+ "enum": [
+ "Fast",
+ "Balanced",
+ "Deep",
+ "Council"
+ ]
+ },
+ "role_runs": {
+ "type": "array",
+ "maxItems": 30,
+ "items": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "role",
+ "model",
+ "outcome",
+ "tokens",
+ "cost_usd",
+ "duration_ms"
+ ],
+ "properties": {
+ "role": {
+ "enum": [
+ "planner",
+ "builder",
+ "reviewer",
+ "verifier"
+ ]
+ },
+ "model": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "effort": {
+ "enum": [
+ "none",
+ "low",
+ "medium",
+ "high",
+ "xhigh",
+ "max"
+ ]
+ },
+ "outcome": {
+ "enum": [
+ "approved",
+ "rejected",
+ "passed",
+ "failed",
+ "refused",
+ "low_confidence",
+ "skipped"
+ ]
+ },
+ "tokens": {
+ "type": "integer",
+ "minimum": 0
+ },
+ "cost_usd": {
+ "type": "number",
+ "minimum": 0
+ },
+ "duration_ms": {
+ "type": "integer",
+ "minimum": 0
+ },
+ "reason": {
+ "type": "string",
+ "maxLength": 1000
+ }
+ }
+ }
+ },
"url": {
"url": {
"type": "string",
"type": "string",
"format": "uri",
"format": "uri",
@@ -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.405.0",
- "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.405.0): each operation lists the capabilities it performs; a token for 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.406.0",
+ "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.406.0): each operation lists the capabilities it performs; a token for 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"
@@ -2530,6 +2530,133 @@
@@ -2530,6 +2530,133 @@
},
},
"components": {
"components": {
"schemas": {
"schemas": {
+ "ai.file.v1": {
+ "title": "AiFile",
+ "description": "ai.file@1: a person attachment or model-produced artifact stored by Media. The reference is metadata only; file bytes are never embedded in an AI turn.",
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "id",
+ "name",
+ "media_type",
+ "size",
+ "storage",
+ "access",
+ "read"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 200
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 255
+ },
+ "media_type": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 255
+ },
+ "size": {
+ "type": "integer",
+ "minimum": 0
+ },
+ "storage": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "provider",
+ "key"
+ ],
+ "properties": {
+ "provider": {
+ "const": "media"
+ },
+ "key": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 500
+ }
+ }
+ },
+ "access": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "readers"
+ ],
+ "properties": {
+ "readers": {
+ "type": "array",
+ "minItems": 1,
+ "uniqueItems": true,
+ "items": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 200
+ }
+ }
+ }
+ },
+ "read": {
+ "oneOf": [
+ {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "method"
+ ],
+ "properties": {
+ "method": {
+ "enum": [
+ "text",
+ "pages",
+ "image",
+ "audio_transcript"
+ ]
+ },
+ "content": {
+ "type": "string"
+ },
+ "pages": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "method",
+ "reason"
+ ],
+ "properties": {
+ "method": {
+ "const": "not_readable"
+ },
+ "reason": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 500
+ }
+ }
+ }
+ ]
+ },
+ "role": {
+ "enum": [
+ "input",
+ "artifact"
+ ]
+ }
+ }
+ },
"common.entity-ref.v1": {
"common.entity-ref.v1": {
"title": "EntityRef",
"title": "EntityRef",
"description": "Typed reference to another service's entity. Store this instead of a foreign key; resolve a display projection from the owner.",
"description": "Typed reference to another service's entity. Store this instead of a foreign key; resolve a display projection from the owner.",
@@ -2909,7 +3036,7 @@
@@ -2909,7 +3036,7 @@
},
},
"community.comment-write-request.v1": {
"community.comment-write-request.v1": {
"title": "CommunityCommentWriteRequest",
"title": "CommunityCommentWriteRequest",
- "description": "community.comment-write-request@1: bodies of community.comment.write on OpenVibe.Community (people, anonymous people with a name where the thread allows it, and services acting as X-OV-Subject or as AI). POST /api/v1/comments/threads/resolve: { ref } — get or create the thread of an entity (browsers only for the allow-listed entity types; a label is taken only from a service). POST /api/v1/comments/threads/:id/comments: { message, parent_id?, anon_name? } (message trimmed, at most 5000 characters; a reply to a reply joins the top-level comment). POST /api/v1/comments/:commentId/votes: { value: 1 | -1 | 0 } (people). GET /api/v1/comments/threads/:id and DELETE /api/v1/comments/:commentId take no body. Unknown fields are ignored.",
+ "description": "community.comment-write-request@1: bodies of community.comment.write on OpenVibe.Community (people, anonymous people with a name where the thread allows it, and services acting as X-OV-Subject or as AI). POST /api/v1/comments/threads/resolve: { ref } — get or create the thread of an entity (browsers only for the allow-listed entity types; a label is taken only from a service). POST /api/v1/comments/threads/:id/comments: { message, parent_id?, anon_name?, attachments? } (message trimmed, at most 5000 characters; a reply to a reply joins the top-level comment). POST /api/v1/comments/:commentId/votes: { value: 1 | -1 | 0 } (people). GET /api/v1/comments/threads/:id and DELETE /api/v1/comments/:commentId take no body. Unknown fields are ignored.",
"anyOf": [
"anyOf": [
{
{
"type": "object",
"type": "object",
@@ -2946,6 +3073,13 @@
@@ -2946,6 +3073,13 @@
"string",
"string",
"null"
"null"
]
]
+ },
+ "attachments": {
+ "type": "array",
+ "maxItems": 4,
+ "items": {
+ "$ref": "#/components/schemas/ai.file.v1"
+ }
}
}
}
}
},
},
@@ -3097,7 +3231,7 @@
@@ -3097,7 +3231,7 @@
},
},
"community.comment.v1": {
"community.comment.v1": {
"title": "CommunityComment",
"title": "CommunityComment",
- "description": "community.comment@1: one comment in an embeddable comment thread on OpenVibe.Community (server/comments/service.js shapeComment), with its author (or anonymous name), score and the caller's vote, reply count and, for top-level comments in a page, the first replies. A deleted comment keeps its place with no author or message.",
+ "description": "community.comment@1: one comment in an embeddable comment thread on OpenVibe.Community (server/comments/service.js shapeComment), with its author (or anonymous name), score and the caller's vote, reply count and, for top-level comments in a page, the first two replies. A deleted comment keeps its place with no author or message.",
"type": "object",
"type": "object",
"required": [
"required": [
"id",
"id",
@@ -3253,6 +3387,34 @@
@@ -3253,6 +3387,34 @@
"items": {
"items": {
"type": "object"
"type": "object"
}
}
+ },
+ "reply_to_id": {
+ "type": [
+ "integer",
+ "null"
+ ],
+ "description": "The exact comment answered; parent_id remains the top-level comment."
+ },
+ "reply_to": {
+ "type": [
+ "object",
+ "null"
+ ],
+ "properties": {
+ "id": {
+ "type": "integer"
+ },
+ "display_name": {
+ "type": "string"
+ }
+ }
+ },
+ "attachments": {
+ "type": "array",
+ "maxItems": 4,
+ "items": {
+ "$ref": "#/components/schemas/ai.file.v1"
+ }
}
}
}
}
},
},
@@ -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.405.0",
- "description": "Routes of OpenVibe Connect as the OpenVibe contracts describe them (openvibe-contracts 0.405.0): each operation lists the capabilities it performs; a token for 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.406.0",
+ "description": "Routes of OpenVibe Connect as the OpenVibe contracts describe them (openvibe-contracts 0.406.0): each operation lists the capabilities it performs; a token for 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.405.0",
- "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.405.0): each operation lists the capabilities it performs; a token for 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.406.0",
+ "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.406.0): each operation lists the capabilities it performs; a token for 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.405.0",
- "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.405.0): each operation lists the capabilities it performs; a token for 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.406.0",
+ "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.406.0): each operation lists the capabilities it performs; a token for 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.405.0",
- "description": "Routes of OpenVibe.Design as the OpenVibe contracts describe them (openvibe-contracts 0.405.0): each operation lists the capabilities it performs; a token for 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.406.0",
+ "description": "Routes of OpenVibe.Design as the OpenVibe contracts describe them (openvibe-contracts 0.406.0): each operation lists the capabilities it performs; a token for 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.405.0",
- "description": "Routes of OpenVibe.Domains as the OpenVibe contracts describe them (openvibe-contracts 0.405.0): each operation lists the capabilities it performs; a token for 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.406.0",
+ "description": "Routes of OpenVibe.Domains as the OpenVibe contracts describe them (openvibe-contracts 0.406.0): each operation lists the capabilities it performs; a token for 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.405.0",
- "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.405.0): each operation lists the capabilities it performs; a token for 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.406.0",
+ "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.406.0): each operation lists the capabilities it performs; a token for 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.Exchange API",
"title": "OpenVibe.Exchange API",
- "version": "0.405.0",
- "description": "Routes of OpenVibe.Exchange as the OpenVibe contracts describe them (openvibe-contracts 0.405.0): each operation lists the capabilities it performs; a token for 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.406.0",
+ "description": "Routes of OpenVibe.Exchange as the OpenVibe contracts describe them (openvibe-contracts 0.406.0): each operation lists the capabilities it performs; a token for 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.405.0",
- "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.405.0): each operation lists the capabilities it performs; a token for 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.406.0",
+ "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.406.0): each operation lists the capabilities it performs; a token for 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.405.0",
- "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.405.0): each operation lists the capabilities it performs; a token for 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.406.0",
+ "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.406.0): each operation lists the capabilities it performs; a token for 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.Git API",
"title": "OpenVibe.Git API",
- "version": "0.405.0",
- "description": "Routes of OpenVibe.Git as the OpenVibe contracts describe them (openvibe-contracts 0.405.0): each operation lists the capabilities it performs; a token for 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.406.0",
+ "description": "Routes of OpenVibe.Git as the OpenVibe contracts describe them (openvibe-contracts 0.406.0): each operation lists the capabilities it performs; a token for 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.405.0",
- "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.405.0): each operation lists the capabilities it performs; a token for 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.406.0",
+ "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.406.0): each operation lists the capabilities it performs; a token for 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.Inventory API",
"title": "OpenVibe.Inventory API",
- "version": "0.405.0",
- "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.405.0): each operation lists the capabilities it performs; a token for 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.406.0",
+ "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.406.0): each operation lists the capabilities it performs; a token for 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.405.0",
- "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.405.0): each operation lists the capabilities it performs; a token for 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.406.0",
+ "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.406.0): each operation lists the capabilities it performs; a token for 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.Mail API",
"title": "OpenVibe.Mail API",
- "version": "0.405.0",
- "description": "Routes of OpenVibe.Mail as the OpenVibe contracts describe them (openvibe-contracts 0.405.0): each operation lists the capabilities it performs; a token for 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.406.0",
+ "description": "Routes of OpenVibe.Mail as the OpenVibe contracts describe them (openvibe-contracts 0.406.0): each operation lists the capabilities it performs; a token for 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.405.0",
- "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.405.0): each operation lists the capabilities it performs; a token for 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.406.0",
+ "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.406.0): each operation lists the capabilities it performs; a token for 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.405.0",
- "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.405.0): each operation lists the capabilities it performs; a token for 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.406.0",
+ "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.406.0): each operation lists the capabilities it performs; a token for 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.405.0",
- "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.405.0): each operation lists the capabilities it performs; a token for 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.406.0",
+ "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.406.0): each operation lists the capabilities it performs; a token for 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.405.0",
- "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.405.0): each operation lists the capabilities it performs; a token for 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.406.0",
+ "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.406.0): each operation lists the capabilities it performs; a token for 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.405.0",
- "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.405.0): each operation lists the capabilities it performs; a token for 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.406.0",
+ "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.406.0): each operation lists the capabilities it performs; a token for 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.405.0",
- "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.405.0): each operation lists the capabilities it performs; a token for 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.406.0",
+ "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.406.0): each operation lists the capabilities it performs; a token for 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.405.0",
- "description": "Routes of OpenVibe.Quest as the OpenVibe contracts describe them (openvibe-contracts 0.405.0): each operation lists the capabilities it performs; a token for 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.406.0",
+ "description": "Routes of OpenVibe.Quest as the OpenVibe contracts describe them (openvibe-contracts 0.406.0): each operation lists the capabilities it performs; a token for 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.405.0",
- "description": "Routes of OpenVibe.Report as the OpenVibe contracts describe them (openvibe-contracts 0.405.0): each operation lists the capabilities it performs; a token for 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.406.0",
+ "description": "Routes of OpenVibe.Report as the OpenVibe contracts describe them (openvibe-contracts 0.406.0): each operation lists the capabilities it performs; a token for 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.405.0",
- "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.405.0): each operation lists the capabilities it performs; a token for 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.406.0",
+ "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.406.0): each operation lists the capabilities it performs; a token for 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.405.0",
- "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.405.0): each operation lists the capabilities it performs; a token for 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.406.0",
+ "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.406.0): each operation lists the capabilities it performs; a token for 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"
@@ -3426,6 +3426,32 @@
@@ -3426,6 +3426,32 @@
"type": "object",
"type": "object",
"description": "The desk's answer on an ack (bot.command-result@1 data)."
"description": "The desk's answer on an ack (bot.command-result@1 data)."
},
},
+ "delivery": {
+ "enum": [
+ "delivered",
+ "not_delivered",
+ "uncertain"
+ ],
+ "description": "Whether the command reached the machine. Absent on older servers means unknown."
+ },
+ "retry": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "safe"
+ ],
+ "properties": {
+ "safe": {
+ "type": "boolean"
+ },
+ "reason": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 500
+ }
+ },
+ "description": "safe is true only when delivery is not_delivered."
+ },
"state": {
"state": {
"$ref": "#/components/schemas/run.session.v1/properties/state"
"$ref": "#/components/schemas/run.session.v1/properties/state"
}
}
@@ -3480,6 +3506,17 @@
@@ -3480,6 +3506,17 @@
"pattern": "^dev_[0-9A-HJKMNP-TV-Z]{26}$",
"pattern": "^dev_[0-9A-HJKMNP-TV-Z]{26}$",
"description": "One of the person's own machines, by its OpenVibe.Bot id; the session goes there or nowhere."
"description": "One of the person's own machines, by its OpenVibe.Bot id; the session goes there or nowhere."
},
},
+ "origins": {
+ "type": "array",
+ "maxItems": 32,
+ "items": {
+ "type": "string",
+ "minLength": 8,
+ "maxLength": 2048,
+ "pattern": "^https?://"
+ },
+ "description": "Exact HTTP(S) origins allowed for this browser session. Run fixes the list at creation and places it only on a user-owned desk that can enforce it. This option is owner switched off by default."
+ },
"requirements": {
"requirements": {
"$ref": "#/components/schemas/platform.workload-requirements.v1"
"$ref": "#/components/schemas/platform.workload-requirements.v1"
},
},
@@ -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.405.0",
- "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.405.0): each operation lists the capabilities it performs; a token for 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.406.0",
+ "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.406.0): each operation lists the capabilities it performs; a token for 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.405.0",
- "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.405.0): each operation lists the capabilities it performs; a token for 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.406.0",
+ "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.406.0): each operation lists the capabilities it performs; a token for 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.405.0",
- "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.405.0): each operation lists the capabilities it performs; a token for 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.406.0",
+ "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.406.0): each operation lists the capabilities it performs; a token for 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.405.0",
- "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.405.0): each operation lists the capabilities it performs; a token for 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.406.0",
+ "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.406.0): each operation lists the capabilities it performs; a token for 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.Tips API",
"title": "OpenVibe.Tips API",
- "version": "0.405.0",
- "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.405.0): each operation lists the capabilities it performs; a token for 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.406.0",
+ "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.406.0): each operation lists the capabilities it performs; a token for 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.405.0",
- "description": "Routes of OpenVibe.Today as the OpenVibe contracts describe them (openvibe-contracts 0.405.0): each operation lists the capabilities it performs; a token for 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.406.0",
+ "description": "Routes of OpenVibe.Today as the OpenVibe contracts describe them (openvibe-contracts 0.406.0): each operation lists the capabilities it performs; a token for 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.405.0",
- "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.405.0): each operation lists the capabilities it performs; a token for 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.406.0",
+ "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.406.0): each operation lists the capabilities it performs; a token for 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.405.0",
- "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.405.0): each operation lists the capabilities it performs; a token for 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.406.0",
+ "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.406.0): each operation lists the capabilities it performs; a token for 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.405.0",
- "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.405.0): each operation lists the capabilities it performs; a token for 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.406.0",
+ "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.406.0): each operation lists the capabilities it performs; a token for 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.405.0",
- "description": "Routes of OpenVibe.Vision as the OpenVibe contracts describe them (openvibe-contracts 0.405.0): each operation lists the capabilities it performs; a token for 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.406.0",
+ "description": "Routes of OpenVibe.Vision as the OpenVibe contracts describe them (openvibe-contracts 0.406.0): each operation lists the capabilities it performs; a token for 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.405.0",
- "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.405.0): each operation lists the capabilities it performs; a token for 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.406.0",
+ "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.406.0): each operation lists the capabilities it performs; a token for 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.405.0",
- "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.405.0): each operation lists the capabilities it performs; a token for 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.406.0",
+ "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.406.0): each operation lists the capabilities it performs; a token for 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.405.0",
- "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.405.0): each operation lists the capabilities it performs; a token for 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.406.0",
+ "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.406.0): each operation lists the capabilities it performs; a token for 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.405.0",
- "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.405.0): each operation lists the capabilities it performs; a token for 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.406.0",
+ "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.406.0): each operation lists the capabilities it performs; a token for 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"
@@ -163451,6 +163451,56 @@ export interface AiModelList {
@@ -163451,6 +163451,56 @@ export interface AiModelList {
cursor?: string | null;
cursor?: string | null;
}
}
+/** [email protected] (owner: ai) */
+/**
+ * ai.model-directory-entry@1: one public model, including provider-listed models with routing off and sourced pre-list sightings. Spotted never means available.
+ */
+export type AiModelDirectoryEntry = {
+ [k: string]: unknown | undefined;
+} & {
+ id: string;
+ provider: string;
+ provider_name?: string | null;
+ model: string;
+ name: string;
+ family?: string | null;
+ version?: string | null;
+ status: "available" | "preview" | "spotted" | "retired";
+ routing_enabled: boolean;
+ context_window?: number | null;
+ max_output?: number | null;
+ type?: string;
+ modalities?: string[];
+ price?: {
+ input_per_million?: number | null;
+ output_per_million?: number | null;
+ cached_per_million?: number | null;
+ source?: string | null;
+ checked_at?: string | null;
+ };
+ source?: string | null;
+ sources?: {
+ url: string;
+ observed_at: string;
+ published_at?: string;
+ }[];
+ first_seen_at?: string | null;
+ updated_at?: string | null;
+ retired_at?: string | null;
+ [k: string]: unknown | undefined;
+};
+
+/** [email protected] (owner: ai) */
+/**
+ * ai.model-directory-list@1: public model directory response; the list may include spotted, disabled and retired models.
+ */
+export interface AiModelDirectoryList {
+ generated_at?: string;
+ count: number;
+ models: AiModelDirectoryEntry[];
+ [k: string]: unknown | undefined;
+}
+
/** [email protected] (owner: ai) */
/** [email protected] (owner: ai) */
/**
/**
* ai.model-read-result@1: response from GET /v1/models (a list) or GET /v1/models/:id (a single model).
* ai.model-read-result@1: response from GET /v1/models (a list) or GET /v1/models/:id (a single model).
@@ -214053,7 +214103,7 @@ export interface CommunityCommentThread {
@@ -214053,7 +214103,7 @@ export interface CommunityCommentThread {
/** [email protected] (owner: community) */
/** [email protected] (owner: community) */
/**
/**
- * community.comment-write-request@1: bodies of community.comment.write on OpenVibe.Community (people, anonymous people with a name where the thread allows it, and services acting as X-OV-Subject or as AI). POST /api/v1/comments/threads/resolve: { ref } — get or create the thread of an entity (browsers only for the allow-listed entity types; a label is taken only from a service). POST /api/v1/comments/threads/:id/comments: { message, parent_id?, anon_name? } (message trimmed, at most 5000 characters; a reply to a reply joins the top-level comment). POST /api/v1/comments/:commentId/votes: { value: 1 | -1 | 0 } (people). GET /api/v1/comments/threads/:id and DELETE /api/v1/comments/:commentId take no body. Unknown fields are ignored.
+ * community.comment-write-request@1: bodies of community.comment.write on OpenVibe.Community (people, anonymous people with a name where the thread allows it, and services acting as X-OV-Subject or as AI). POST /api/v1/comments/threads/resolve: { ref } — get or create the thread of an entity (browsers only for the allow-listed entity types; a label is taken only from a service). POST /api/v1/comments/threads/:id/comments: { message, parent_id?, anon_name?, attachments? } (message trimmed, at most 5000 characters; a reply to a reply joins the top-level comment). POST /api/v1/comments/:commentId/votes: { value: 1 | -1 | 0 } (people). GET /api/v1/comments/threads/:id and DELETE /api/v1/comments/:commentId take no body. Unknown fields are ignored.
*/
*/
export type CommunityCommentWriteRequest =
export type CommunityCommentWriteRequest =
| {
| {
@@ -214063,6 +214113,10 @@ export type CommunityCommentWriteRequest =
@@ -214063,6 +214113,10 @@ export type CommunityCommentWriteRequest =
message: string;
message: string;
parent_id?: number | string | null;
parent_id?: number | string | null;
anon_name?: string | null;
anon_name?: string | null;
+ /**
+ * @maxItems 4
+ */
+ attachments?: [] | [AiFile] | [AiFile, AiFile] | [AiFile, AiFile, AiFile] | [AiFile, AiFile, AiFile, AiFile];
}
}
| {
| {
value: 1 | -1 | 0 | "1" | "-1" | "0";
value: 1 | -1 | 0 | "1" | "-1" | "0";
@@ -214106,7 +214160,7 @@ export type CommunityCommentWriteResult =
@@ -214106,7 +214160,7 @@ export type CommunityCommentWriteResult =
/** [email protected] (owner: community) */
/** [email protected] (owner: community) */
/**
/**
- * community.comment@1: one comment in an embeddable comment thread on OpenVibe.Community (server/comments/service.js shapeComment), with its author (or anonymous name), score and the caller's vote, reply count and, for top-level comments in a page, the first replies. A deleted comment keeps its place with no author or message.
+ * community.comment@1: one comment in an embeddable comment thread on OpenVibe.Community (server/comments/service.js shapeComment), with its author (or anonymous name), score and the caller's vote, reply count and, for top-level comments in a page, the first two replies. A deleted comment keeps its place with no author or message.
*/
*/
export interface CommunityComment {
export interface CommunityComment {
id: number;
id: number;
@@ -214137,6 +214191,18 @@ export interface CommunityComment {
@@ -214137,6 +214191,18 @@ export interface CommunityComment {
can_edit: boolean;
can_edit: boolean;
can_delete: boolean;
can_delete: boolean;
replies?: {}[];
replies?: {}[];
+ /**
+ * The exact comment answered; parent_id remains the top-level comment.
+ */
+ reply_to_id?: number | null;
+ reply_to?: {
+ id?: number;
+ display_name?: string;
+ } | null;
+ /**
+ * @maxItems 4
+ */
+ attachments?: [] | [AiFile] | [AiFile, AiFile] | [AiFile, AiFile, AiFile] | [AiFile, AiFile, AiFile, AiFile];
}
}
/** [email protected] (owner: community) */
/** [email protected] (owner: community) */
@@ -268527,7 +268593,7 @@ export type BotCommand = {
@@ -268527,7 +268593,7 @@ export type BotCommand = {
/** [email protected] (owner: bot) */
/** [email protected] (owner: bot) */
/**
/**
- * bot.command-result@1: the command_result frame OpenVibe.Bot answers a bot.command@1 with on the operator WebSocket (server/realtime.js). result: ack or nack (the device answered; reason is its fault code, latency_ms the round trip), refused (the gate refused it; code is Bot's refusal code such as bot.estop_latched, bot.cooldown or bot.device_offline, and reason says why), expired (no answer before the deadline) or pending (the same id is still in flight). cached is true when a repeated id is answered from the first result. An ack of a computer command (exec, fs, screen) carries its answer in data.
+ * bot.command-result@1: the command_result frame OpenVibe.Bot answers a bot.command@1 with on the operator WebSocket (server/realtime.js). result: ack or nack (the device answered; reason is its fault code, latency_ms the round trip), refused (the gate refused it; code is Bot's refusal code such as bot.estop_latched, bot.cooldown or bot.device_offline, and reason says why), expired (no answer before the deadline) or pending (the same id is still in flight). cached is true when a repeated id is answered from the first result. An ack of a computer command (exec, fs, screen) carries its answer in data. delivery says whether the command reached the machine (delivered, not_delivered, uncertain); retry says whether repeating it is safe. Only not_delivered is safe to repeat: a delivered command already ran, and an uncertain one may have.
*/
*/
export interface BotCommandResult {
export interface BotCommandResult {
v: 1;
v: 1;
@@ -268544,6 +268610,17 @@ export interface BotCommandResult {
@@ -268544,6 +268610,17 @@ export interface BotCommandResult {
* A computer command's answer as the machine gave it (exec: exit_code, stdout, stderr, truncated, timed_out, duration_ms; fs: entries, the stat, content_b64, written, created; screen: format, width, height, content_b64). Present only on an ack of exec, fs or screen.
* A computer command's answer as the machine gave it (exec: exit_code, stdout, stderr, truncated, timed_out, duration_ms; fs: entries, the stat, content_b64, written, created; screen: format, width, height, content_b64). Present only on an ack of exec, fs or screen.
*/
*/
data?: {};
data?: {};
+ /**
+ * Whether the command reached the machine. Both senders and the device report it; absent means unknown.
+ */
+ delivery?: "delivered" | "not_delivered" | "uncertain";
+ /**
+ * Whether repeating the command is safe. safe is true only when delivery is not_delivered.
+ */
+ retry?: {
+ safe: boolean;
+ reason?: string;
+ };
}
}
/** [email protected] (owner: bot) */
/** [email protected] (owner: bot) */
@@ -280137,7 +280214,454 @@ export type VideoPlaylistManageResult =
@@ -280137,7 +280214,454 @@ export type VideoPlaylistManageResult =
}[];
}[];
};
};
-/** [email protected] (owner: codes) */
+/** [email protected] (owner: codes) */
+/**
+ * codes.model-plan@1: a versioned execution plan for a Codes task. Roles are attempted in list order. The ladder names AI registry ids in fallback order; auto asks AI to route. A pair requires reviewer approval, a council has two or three planner samples and a judge, and escalation advances on a failed check, refusal, or low confidence.
+ */
+export type CodesModelPlan = {
+ [k: string]: unknown | undefined;
+} & {
+ roles?: unknown[];
+} & {
+ mode: "single" | "pair" | "council" | "escalate";
+ /**
+ * @minItems 1
+ * @maxItems 8
+ */
+ roles:
+ | [
+ {
+ role: "planner" | "builder" | "reviewer" | "verifier";
+ model: string;
+ effort: "none" | "low" | "medium" | "high" | "xhigh" | "max";
+ samples?: number;
+ budget?: {
+ tokens?: number;
+ minutes?: number;
+ dollars?: number;
+ };
+ }
+ ]
+ | [
+ {
+ role: "planner" | "builder" | "reviewer" | "verifier";
+ model: string;
+ effort: "none" | "low" | "medium" | "high" | "xhigh" | "max";
+ samples?: number;
+ budget?: {
+ tokens?: number;
+ minutes?: number;
+ dollars?: number;
+ };
+ },
+ {
+ role: "planner" | "builder" | "reviewer" | "verifier";
+ model: string;
+ effort: "none" | "low" | "medium" | "high" | "xhigh" | "max";
+ samples?: number;
+ budget?: {
+ tokens?: number;
+ minutes?: number;
+ dollars?: number;
+ };
+ }
+ ]
+ | [
+ {
+ role: "planner" | "builder" | "reviewer" | "verifier";
+ model: string;
+ effort: "none" | "low" | "medium" | "high" | "xhigh" | "max";
+ samples?: number;
+ budget?: {
+ tokens?: number;
+ minutes?: number;
+ dollars?: number;
+ };
+ },
+ {
+ role: "planner" | "builder" | "reviewer" | "verifier";
+ model: string;
+ effort: "none" | "low" | "medium" | "high" | "xhigh" | "max";
+ samples?: number;
+ budget?: {
+ tokens?: number;
+ minutes?: number;
+ dollars?: number;
+ };
+ },
+ {
+ role: "planner" | "builder" | "reviewer" | "verifier";
+ model: string;
+ effort: "none" | "low" | "medium" | "high" | "xhigh" | "max";
+ samples?: number;
+ budget?: {
+ tokens?: number;
+ minutes?: number;
+ dollars?: number;
+ };
+ }
+ ]
+ | [
+ {
+ role: "planner" | "builder" | "reviewer" | "verifier";
+ model: string;
+ effort: "none" | "low" | "medium" | "high" | "xhigh" | "max";
+ samples?: number;
+ budget?: {
+ tokens?: number;
+ minutes?: number;
+ dollars?: number;
+ };
+ },
+ {
+ role: "planner" | "builder" | "reviewer" | "verifier";
+ model: string;
+ effort: "none" | "low" | "medium" | "high" | "xhigh" | "max";
+ samples?: number;
+ budget?: {
+ tokens?: number;
+ minutes?: number;
+ dollars?: number;
+ };
+ },
+ {
+ role: "planner" | "builder" | "reviewer" | "verifier";
+ model: string;
+ effort: "none" | "low" | "medium" | "high" | "xhigh" | "max";
+ samples?: number;
+ budget?: {
+ tokens?: number;
+ minutes?: number;
+ dollars?: number;
+ };
+ },
+ {
+ role: "planner" | "builder" | "reviewer" | "verifier";
+ model: string;
+ effort: "none" | "low" | "medium" | "high" | "xhigh" | "max";
+ samples?: number;
+ budget?: {
+ tokens?: number;
+ minutes?: number;
+ dollars?: number;
+ };
+ }
+ ]
+ | [
+ {
+ role: "planner" | "builder" | "reviewer" | "verifier";
+ model: string;
+ effort: "none" | "low" | "medium" | "high" | "xhigh" | "max";
+ samples?: number;
+ budget?: {
+ tokens?: number;
+ minutes?: number;
+ dollars?: number;
+ };
+ },
+ {
+ role: "planner" | "builder" | "reviewer" | "verifier";
+ model: string;
+ effort: "none" | "low" | "medium" | "high" | "xhigh" | "max";
+ samples?: number;
+ budget?: {
+ tokens?: number;
+ minutes?: number;
+ dollars?: number;
+ };
+ },
+ {
+ role: "planner" | "builder" | "reviewer" | "verifier";
+ model: string;
+ effort: "none" | "low" | "medium" | "high" | "xhigh" | "max";
+ samples?: number;
+ budget?: {
+ tokens?: number;
+ minutes?: number;
+ dollars?: number;
+ };
+ },
+ {
+ role: "planner" | "builder" | "reviewer" | "verifier";
+ model: string;
+ effort: "none" | "low" | "medium" | "high" | "xhigh" | "max";
+ samples?: number;
+ budget?: {
+ tokens?: number;
+ minutes?: number;
+ dollars?: number;
+ };
+ },
+ {
+ role: "planner" | "builder" | "reviewer" | "verifier";
+ model: string;
+ effort: "none" | "low" | "medium" | "high" | "xhigh" | "max";
+ samples?: number;
+ budget?: {
+ tokens?: number;
+ minutes?: number;
+ dollars?: number;
+ };
+ }
+ ]
+ | [
+ {
+ role: "planner" | "builder" | "reviewer" | "verifier";
+ model: string;
+ effort: "none" | "low" | "medium" | "high" | "xhigh" | "max";
+ samples?: number;
+ budget?: {
+ tokens?: number;
+ minutes?: number;
+ dollars?: number;
+ };
+ },
+ {
+ role: "planner" | "builder" | "reviewer" | "verifier";
+ model: string;
+ effort: "none" | "low" | "medium" | "high" | "xhigh" | "max";
+ samples?: number;
+ budget?: {
+ tokens?: number;
+ minutes?: number;
+ dollars?: number;
+ };
+ },
+ {
+ role: "planner" | "builder" | "reviewer" | "verifier";
+ model: string;
+ effort: "none" | "low" | "medium" | "high" | "xhigh" | "max";
+ samples?: number;
+ budget?: {
+ tokens?: number;
+ minutes?: number;
+ dollars?: number;
+ };
+ },
+ {
+ role: "planner" | "builder" | "reviewer" | "verifier";
+ model: string;
+ effort: "none" | "low" | "medium" | "high" | "xhigh" | "max";
+ samples?: number;
+ budget?: {
+ tokens?: number;
+ minutes?: number;
+ dollars?: number;
+ };
+ },
+ {
+ role: "planner" | "builder" | "reviewer" | "verifier";
+ model: string;
+ effort: "none" | "low" | "medium" | "high" | "xhigh" | "max";
+ samples?: number;
+ budget?: {
+ tokens?: number;
+ minutes?: number;
+ dollars?: number;
+ };
+ },
+ {
+ role: "planner" | "builder" | "reviewer" | "verifier";
+ model: string;
+ effort: "none" | "low" | "medium" | "high" | "xhigh" | "max";
+ samples?: number;
+ budget?: {
+ tokens?: number;
+ minutes?: number;
+ dollars?: number;
+ };
+ }
+ ]
+ | [
+ {
+ role: "planner" | "builder" | "reviewer" | "verifier";
+ model: string;
+ effort: "none" | "low" | "medium" | "high" | "xhigh" | "max";
+ samples?: number;
+ budget?: {
+ tokens?: number;
+ minutes?: number;
+ dollars?: number;
+ };
+ },
+ {
+ role: "planner" | "builder" | "reviewer" | "verifier";
+ model: string;
+ effort: "none" | "low" | "medium" | "high" | "xhigh" | "max";
+ samples?: number;
+ budget?: {
+ tokens?: number;
+ minutes?: number;
+ dollars?: number;
+ };
+ },
+ {
+ role: "planner" | "builder" | "reviewer" | "verifier";
+ model: string;
+ effort: "none" | "low" | "medium" | "high" | "xhigh" | "max";
+ samples?: number;
+ budget?: {
+ tokens?: number;
+ minutes?: number;
+ dollars?: number;
+ };
+ },
+ {
+ role: "planner" | "builder" | "reviewer" | "verifier";
+ model: string;
+ effort: "none" | "low" | "medium" | "high" | "xhigh" | "max";
+ samples?: number;
+ budget?: {
+ tokens?: number;
+ minutes?: number;
+ dollars?: number;
+ };
+ },
+ {
+ role: "planner" | "builder" | "reviewer" | "verifier";
+ model: string;
+ effort: "none" | "low" | "medium" | "high" | "xhigh" | "max";
+ samples?: number;
+ budget?: {
+ tokens?: number;
+ minutes?: number;
+ dollars?: number;
+ };
+ },
+ {
+ role: "planner" | "builder" | "reviewer" | "verifier";
+ model: string;
+ effort: "none" | "low" | "medium" | "high" | "xhigh" | "max";
+ samples?: number;
+ budget?: {
+ tokens?: number;
+ minutes?: number;
+ dollars?: number;
+ };
+ },
+ {
+ role: "planner" | "builder" | "reviewer" | "verifier";
+ model: string;
+ effort: "none" | "low" | "medium" | "high" | "xhigh" | "max";
+ samples?: number;
+ budget?: {
+ tokens?: number;
+ minutes?: number;
+ dollars?: number;
+ };
+ }
+ ]
+ | [
+ {
+ role: "planner" | "builder" | "reviewer" | "verifier";
+ model: string;
+ effort: "none" | "low" | "medium" | "high" | "xhigh" | "max";
+ samples?: number;
+ budget?: {
+ tokens?: number;
+ minutes?: number;
+ dollars?: number;
+ };
+ },
+ {
+ role: "planner" | "builder" | "reviewer" | "verifier";
+ model: string;
+ effort: "none" | "low" | "medium" | "high" | "xhigh" | "max";
+ samples?: number;
+ budget?: {
+ tokens?: number;
+ minutes?: number;
+ dollars?: number;
+ };
+ },
+ {
+ role: "planner" | "builder" | "reviewer" | "verifier";
+ model: string;
+ effort: "none" | "low" | "medium" | "high" | "xhigh" | "max";
+ samples?: number;
+ budget?: {
+ tokens?: number;
+ minutes?: number;
+ dollars?: number;
+ };
+ },
+ {
+ role: "planner" | "builder" | "reviewer" | "verifier";
+ model: string;
+ effort: "none" | "low" | "medium" | "high" | "xhigh" | "max";
+ samples?: number;
+ budget?: {
+ tokens?: number;
+ minutes?: number;
+ dollars?: number;
+ };
+ },
+ {
+ role: "planner" | "builder" | "reviewer" | "verifier";
+ model: string;
+ effort: "none" | "low" | "medium" | "high" | "xhigh" | "max";
+ samples?: number;
+ budget?: {
+ tokens?: number;
+ minutes?: number;
+ dollars?: number;
+ };
+ },
+ {
+ role: "planner" | "builder" | "reviewer" | "verifier";
+ model: string;
+ effort: "none" | "low" | "medium" | "high" | "xhigh" | "max";
+ samples?: number;
+ budget?: {
+ tokens?: number;
+ minutes?: number;
+ dollars?: number;
+ };
+ },
+ {
+ role: "planner" | "builder" | "reviewer" | "verifier";
+ model: string;
+ effort: "none" | "low" | "medium" | "high" | "xhigh" | "max";
+ samples?: number;
+ budget?: {
+ tokens?: number;
+ minutes?: number;
+ dollars?: number;
+ };
+ },
+ {
+ role: "planner" | "builder" | "reviewer" | "verifier";
+ model: string;
+ effort: "none" | "low" | "medium" | "high" | "xhigh" | "max";
+ samples?: number;
+ budget?: {
+ tokens?: number;
+ minutes?: number;
+ dollars?: number;
+ };
+ }
+ ];
+ /**
+ * @minItems 1
+ * @maxItems 8
+ */
+ ladder?:
+ | [string]
+ | [string, string]
+ | [string, string, string]
+ | [string, string, string, string]
+ | [string, string, string, string, string]
+ | [string, string, string, string, string, string]
+ | [string, string, string, string, string, string, string]
+ | [string, string, string, string, string, string, string, string];
+ checks: {
+ tests?: boolean;
+ lint?: boolean;
+ reviewer?: boolean;
+ };
+};
+
+/** [email protected] (owner: codes) */
/**
/**
* codes.task-start-request@1: the body of POST /api/v1/tasks on OpenVibe.Codes (capability codes.task.start). A first-party service (OpenVibe.Actor) starts a coding task for a person, named with X-OV-Subject: Codes runs it on that person's own machine through OpenVibe.Run (openvibe.codes/run, plan T16), in the project of their latest task there, so the person has used openvibe.codes/run once before a service can start one for them (else 409 codes.no_project). REPO is an https git URL with no credentials; REF a branch or tag to start from (default: the repository's default branch). PROMPT is the task. AGENT names one of Codes' agents (GET /harnesses), absent for Codes' router to pick. PERMISSION: review (read-only: research, audits, reviews; nothing is changed), edit (default; the agents edit files) or full (they may also run commands: tests, installs). PUSH asks for the change on a new branch (GitHub, with the machine's GITHUB_TOKEN; never the branch it started from), PULL_REQUEST also opens a pull request. IDEMPOTENCY_KEY: a repeat for the same person with the same key answers the first task (200, created false).
* codes.task-start-request@1: the body of POST /api/v1/tasks on OpenVibe.Codes (capability codes.task.start). A first-party service (OpenVibe.Actor) starts a coding task for a person, named with X-OV-Subject: Codes runs it on that person's own machine through OpenVibe.Run (openvibe.codes/run, plan T16), in the project of their latest task there, so the person has used openvibe.codes/run once before a service can start one for them (else 409 codes.no_project). REPO is an https git URL with no credentials; REF a branch or tag to start from (default: the repository's default branch). PROMPT is the task. AGENT names one of Codes' agents (GET /harnesses), absent for Codes' router to pick. PERMISSION: review (read-only: research, audits, reviews; nothing is changed), edit (default; the agents edit files) or full (they may also run commands: tests, installs). PUSH asks for the change on a new branch (GitHub, with the machine's GITHUB_TOKEN; never the branch it started from), PULL_REQUEST also opens a pull request. IDEMPOTENCY_KEY: a repeat for the same person with the same key answers the first task (200, created false).
*/
*/
@@ -280148,6 +280672,8 @@ export interface CodesTaskStartRequest {
@@ -280148,6 +280672,8 @@ export interface CodesTaskStartRequest {
agent?: string;
agent?: string;
permission?: "review" | "edit" | "full";
permission?: "review" | "edit" | "full";
goal?: AgentGoal;
goal?: AgentGoal;
+ plan?: CodesModelPlan;
+ preset?: "Fast" | "Balanced" | "Deep" | "Council";
push?: boolean;
push?: boolean;
pull_request?: boolean;
pull_request?: boolean;
idempotency_key?: string;
idempotency_key?: string;
@@ -280357,7 +280883,7 @@ export interface CodesTask {
@@ -280357,7 +280883,7 @@ export interface CodesTask {
} | null;
} | null;
}
}
-/** [email protected] (owner: codes) */
+/** [email protected] (owner: codes) */
/** [email protected] (owner: play) */
/** [email protected] (owner: play) */
/**
/**
@@ -281724,6 +282250,12 @@ export interface RunSessionCreateRequest {
@@ -281724,6 +282250,12 @@ export interface RunSessionCreateRequest {
* One of the person's own machines, by its OpenVibe.Bot id; the session goes there or nowhere.
* One of the person's own machines, by its OpenVibe.Bot id; the session goes there or nowhere.
*/
*/
machine?: string;
machine?: string;
+ /**
+ * Exact HTTP(S) origins allowed for this browser session. Run fixes the list at creation and places it only on a user-owned desk that can enforce it. This option is owner switched off by default.
+ *
+ * @maxItems 32
+ */
+ origins?: string[];
requirements?: WorkloadRequirements;
requirements?: WorkloadRequirements;
idempotency_key?: string;
idempotency_key?: string;
/**
/**
@@ -281759,6 +282291,17 @@ export interface RunSessionControlResult {
@@ -281759,6 +282291,17 @@ export interface RunSessionControlResult {
* The desk's answer on an ack (bot.command-result@1 data).
* The desk's answer on an ack (bot.command-result@1 data).
*/
*/
data?: {};
data?: {};
+ /**
+ * Whether the command reached the machine. Absent on older servers means unknown.
+ */
+ delivery?: "delivered" | "not_delivered" | "uncertain";
+ /**
+ * safe is true only when delivery is not_delivered.
+ */
+ retry?: {
+ safe: boolean;
+ reason?: string;
+ };
state: "placing" | "starting" | "running" | "ended";
state: "placing" | "starting" | "running" | "ended";
}
}
@@ -282078,6 +282621,12 @@ export interface BotDeskLeaseCreateRequest {
@@ -282078,6 +282621,12 @@ export interface BotDeskLeaseCreateRequest {
* Default 800.
* Default 800.
*/
*/
height?: number;
height?: number;
+ /**
+ * The session's exact browser origins, fixed for this lease. Empty allows no network origin; absent keeps the legacy policy. A shared desk that cannot enforce the list is refused.
+ *
+ * @maxItems 32
+ */
+ origins?: string[];
}
}
/** [email protected] (owner: bot) */
/** [email protected] (owner: bot) */
@@ -327412,6 +327961,16 @@ export interface MemeEntry {
@@ -327412,6 +327961,16 @@ export interface MemeEntry {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
}
}
+/** [email protected] (owner: meme) */
+/**
+ * meme.caption.created v1 (OpenVibe.Meme): a signed-in person saved a public caption. The event names only its id and owner, never the caption text, template, or other people's content. Envelope source meme, actor the owner, subject the caption, visibility internal.
+ */
+export interface MemeCaptionCreatedPayload {
+ caption_id: string;
+ owner: SubjectRef;
+ created_at: string;
+}
+
/** [email protected] (owner: meme) */
/** [email protected] (owner: meme) */
/**
/**
* meme.template@1: a reusable meme image with its source, reuse licence and caption layout. Public templates have passed any required review.
* meme.template@1: a reusable meme image with its source, reuse licence and caption layout. Public templates have passed any required review.
@@ -16,7 +16,7 @@
@@ -16,7 +16,7 @@
"publicSite": "service"
"publicSite": "service"
},
},
"capabilities": [],
"capabilities": [],
- "eventsProduced": [],
+ "eventsProduced": ["meme.caption.created"],
"eventsConsumed": [],
"eventsConsumed": [],
"namespacesOwned": [
"namespacesOwned": [
"meme.*"
"meme.*"
@@ -1,12 +1,12 @@
@@ -1,12 +1,12 @@
{
{
"name": "openvibe-contracts",
"name": "openvibe-contracts",
- "version": "0.405.0",
+ "version": "0.406.0",
"lockfileVersion": 3,
"lockfileVersion": 3,
"requires": true,
"requires": true,
"packages": {
"packages": {
"": {
"": {
"name": "openvibe-contracts",
"name": "openvibe-contracts",
- "version": "0.405.0",
+ "version": "0.406.0",
"license": "AGPL-3.0-only",
"license": "AGPL-3.0-only",
"dependencies": {
"dependencies": {
"ajv": "^8.17.1",
"ajv": "^8.17.1",
@@ -1,6 +1,6 @@
@@ -1,6 +1,6 @@
{
{
"name": "openvibe-contracts",
"name": "openvibe-contracts",
- "version": "0.405.0",
+ "version": "0.406.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",
new file mode 100644
new file mode 100644
@@ -0,0 +1,22 @@
@@ -0,0 +1,22 @@
+'use strict';
+
+const assert = require('node:assert/strict');
+const fs = require('node:fs');
+const path = require('node:path');
+const { validate } = require('..');
+
+for (const kind of ['valid', 'invalid']) {
+ const dir = path.join(__dirname, '..', 'fixtures', 'codes.model-plan', kind);
+ for (const file of fs.readdirSync(dir)) {
+ const value = JSON.parse(fs.readFileSync(path.join(dir, file), 'utf8'));
+ assert.equal(validate('codes.model-plan@1', value).valid, kind === 'valid', file);
+ }
+}
+
+const base = { repo: 'https://github.com/OpenVibers/OpenVibe.Codes', prompt: 'Improve the task' };
+const pair = require('../fixtures/codes.model-plan/valid/pair.json');
+assert.equal(validate('codes.task-start-request@1', { ...base, plan: pair }).valid, true);
+assert.equal(validate('codes.task-start-request@1', { ...base, preset: 'Balanced' }).valid, true);
+assert.equal(validate('codes.task-start-request@1', { ...base, plan: pair, preset: 'Balanced' }).valid, false);
+
+console.log('codes.model-plan@1: valid modes, invalid role, effort and ladder fixtures, task plan or preset');