openvibers/openvibe.contracts Commits

Contracts 0.406.0: release train for #444, #445, #446, #447 and #448 (#449)

OP OpenVibers committed 2 days ago · 5d74680261 · 85 files, +2359 −117

* Define public meme caption event for quests

* Clarify Meme caption event subject

* Define Codes model plans and task plan fields

* Regenerate Meme event TypeScript after wording change

* Contracts 0.405.0: delivery and retry on command results

* Define public model directory contracts

* Document Community reply targets and attachment references

* Document delivery safety for Run session commands

* Add task origin boundaries to Bot and Run contracts

* Merge remote-tracking branch 'origin/quest-meme-contract-1110' into release/0406

# Conflicts:
#	CHANGELOG.md
#	generated/openapi/actor.json
#	generated/openapi/ai.json
#	generated/openapi/bench.json
#	generated/openapi/billing.json
#	generated/openapi/blog.json
#	generated/openapi/bot.json
#	generated/openapi/chat.json
#	generated/openapi/codes.json
#	generated/openapi/community.json
#	generated/openapi/connect.json
#	generated/openapi/coupons.json
#	generated/openapi/deals.json
#	generated/openapi/design.json
#	generated/openapi/domains.json
#	generated/openapi/events.json
#	generated/openapi/exchange.json
#	generated/openapi/food.json
#	generated/openapi/games.json
#	generated/openapi/git.json
#	generated/openapi/host.json
#	generated/openapi/inventory.json
#	generated/openapi/live.json
#	generated/openapi/mail.json
#	generated/openapi/media-hub.json
#	generated/openapi/media.json
#	generated/openapi/network.json
#	generated/openapi/news.json
#	generated/openapi/openre.json
#	generated/openapi/play.json
#	generated/openapi/quest.json
#	generated/openapi/report.json
#	generated/openapi/reviews.json
#	generated/openapi/run.json
#	generated/openapi/search.json
#	generated/openapi/services.json
#	generated/openapi/sources.json
#	generated/openapi/space.json
#	generated/openapi/tips.json
#	generated/openapi/today.json
#	generated/openapi/tools.json
#	generated/openapi/trade.json
#	generated/openapi/vip.json
#	generated/openapi/vision.json
#	generated/openapi/watch.json
#	generated/openapi/wiki.json
#	generated/openapi/work.json
#	generated/openapi/zone.json
#	package-lock.json
#	package.json

* Merge remote-tracking branch 'origin/feat/codes-model-plan-contract' into release/0406

# Conflicts:
#	CHANGELOG.md

* Merge remote-tracking branch 'origin/cx/contracts-r2-delivery' into release/0406

# Conflicts:
#	CHANGELOG.md

* Merge remote-tracking branch 'origin/feat/361-model-directory-contracts' into release/0406

# Conflicts:
#	CHANGELOG.md
#	generated/openapi/actor.json
#	generated/openapi/ai.json
#	generated/openapi/bench.json
#	generated/openapi/billing.json
#	generated/openapi/blog.json
#	generated/openapi/bot.json
#	generated/openapi/chat.json
#	generated/openapi/codes.json
#	generated/openapi/community.json
#	generated/openapi/connect.json
#	generated/openapi/coupons.json
#	generated/openapi/deals.json
#	generated/openapi/design.json
#	generated/openapi/domains.json
#	generated/openapi/events.json
#	generated/openapi/exchange.json
#	generated/openapi/food.json
#	generated/openapi/games.json
#	generated/openapi/git.json
#	generated/openapi/host.json
#	generated/openapi/inventory.json
#	generated/openapi/live.json
#	generated/openapi/mail.json
#	generated/openapi/media-hub.json
#	generated/openapi/media.json
#	generated/openapi/network.json
#	generated/openapi/news.json
#	generated/openapi/openre.json
#	generated/openapi/play.json
#	generated/openapi/quest.json
#	generated/openapi/report.json
#	generated/openapi/reviews.json
#	generated/openapi/run.json
#	generated/openapi/search.json
#	generated/openapi/services.json
#	generated/openapi/sources.json
#	generated/openapi/space.json
#	generated/openapi/tips.json
#	generated/openapi/today.json
#	generated/openapi/tools.json
#	generated/openapi/trade.json
#	generated/openapi/vip.json
#	generated/openapi/vision.json
#	generated/openapi/watch.json
#	generated/openapi/wiki.json
#	generated/openapi/work.json
#	generated/openapi/zone.json
#	package-lock.json
#	package.json

* Merge remote-tracking branch 'origin/contracts/comment-reply-target-r3' into release/0406

# Conflicts:
#	CHANGELOG.md

* Contracts 0.406.0: release train for #444, #445, #446, #447 and #448

Changes

ddiff --git a/CHANGELOG.md b/CHANGELOG.md
iindex 4d0f3532..81167d5f 100644
---- a/CHANGELOG.md
++++ b/CHANGELOG.md
@@@ -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-11
This release train carries the contract work that was waiting on the owner's release. One line per carried pull request:
ddiff --git a/README.md b/README.md
iindex 079ed73d..38b2b943 100644
---- a/README.md
++++ b/README.md
@@@ -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).
ddiff --git a/contracts/ai/model-directory-entry.v1.json b/contracts/ai/model-directory-entry.v1.json
nnew file mode 100644
iindex 00000000..e57699df
---- /dev/null
++++ b/contracts/ai/model-directory-entry.v1.json
@@@ -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"]}
++ }
++}
ddiff --git a/contracts/ai/model-directory-list.v1.json b/contracts/ai/model-directory-list.v1.json
nnew file mode 100644
iindex 00000000..14f8a3aa
---- /dev/null
++++ b/contracts/ai/model-directory-list.v1.json
@@@ -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"}}
++ }
++}
ddiff --git a/contracts/bot/command-result.v1.json b/contracts/bot/command-result.v1.json
iindex 665ead76..42fbdd6d 100644
---- a/contracts/bot/command-result.v1.json
++++ b/contracts/bot/command-result.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
++ }
++ }
}
}
}
ddiff --git a/contracts/bot/command.v1.json b/contracts/bot/command.v1.json
iindex 727f47e2..e0b66912 100644
---- a/contracts/bot/command.v1.json
++++ b/contracts/bot/command.v1.json
@@@ -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,
ddiff --git a/contracts/bot/desk-lease-create-request.v1.json b/contracts/bot/desk-lease-create-request.v1.json
iindex 7b898c8a..2528f484 100644
---- a/contracts/bot/desk-lease-create-request.v1.json
++++ b/contracts/bot/desk-lease-create-request.v1.json
@@@ -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."
}
}
}
ddiff --git a/contracts/catalog.json b/contracts/catalog.json
iindex 6bd41794..e65e03da 100644
---- a/contracts/catalog.json
++++ b/contracts/catalog.json
@@@ -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",
ddiff --git a/contracts/codes/model-plan.v1.json b/contracts/codes/model-plan.v1.json
nnew file mode 100644
iindex 00000000..bfc4dcad
---- /dev/null
++++ b/contracts/codes/model-plan.v1.json
@@@ -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"] } } } }
++ ]
++}
ddiff --git a/contracts/codes/task-start-request.v1.json b/contracts/codes/task-start-request.v1.json
iindex fa0e4643..2dc6277d 100644
---- a/contracts/codes/task-start-request.v1.json
++++ b/contracts/codes/task-start-request.v1.json
@@@ -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"] }
}
ddiff --git a/contracts/codes/task.v2.json b/contracts/codes/task.v2.json
iindex 671e9d66..ab5429c5 100644
---- a/contracts/codes/task.v2.json
++++ b/contracts/codes/task.v2.json
@@@ -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",
ddiff --git a/contracts/community/comment-write-request.v1.json b/contracts/community/comment-write-request.v1.json
iindex 70cd62ad..cb4e9fbf 100644
---- a/contracts/community/comment-write-request.v1.json
++++ b/contracts/community/comment-write-request.v1.json
@@@ -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"
++ }
}
}
},
ddiff --git a/contracts/community/comment.v1.json b/contracts/community/comment.v1.json
iindex 05f08f9b..1fad8dd2 100644
---- a/contracts/community/comment.v1.json
++++ b/contracts/community/comment.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"
++ }
}
}
}
ddiff --git a/contracts/events/payloads/meme.caption.created.v1.json b/contracts/events/payloads/meme.caption.created.v1.json
nnew file mode 100644
iindex 00000000..36828e73
---- /dev/null
++++ b/contracts/events/payloads/meme.caption.created.v1.json
@@@ -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" }
++ }
++}
ddiff --git a/contracts/run/session-control-result.v1.json b/contracts/run/session-control-result.v1.json
iindex 0fd7d592..3ca5f1c8 100644
---- a/contracts/run/session-control-result.v1.json
++++ b/contracts/run/session-control-result.v1.json
@@@ -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"
}
ddiff --git a/contracts/run/session-create-request.v1.json b/contracts/run/session-create-request.v1.json
iindex c5ec267f..206bcda7 100644
---- a/contracts/run/session-create-request.v1.json
++++ b/contracts/run/session-create-request.v1.json
@@@ -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"
},
ddiff --git a/fixtures/ai.model-directory-entry/invalid/spotted-routable.json b/fixtures/ai.model-directory-entry/invalid/spotted-routable.json
nnew file mode 100644
iindex 00000000..cca0c3ee
---- /dev/null
++++ b/fixtures/ai.model-directory-entry/invalid/spotted-routable.json
@@@ -0,0 +1,8 @@
++{
++ "id": "arena/anonymous-silver",
++ "provider": "arena",
++ "model": "anonymous-silver",
++ "name": "anonymous-silver",
++ "status": "spotted",
++ "routing_enabled": true
++}
ddiff --git a/fixtures/ai.model-directory-entry/valid/spotted.json b/fixtures/ai.model-directory-entry/valid/spotted.json
nnew file mode 100644
iindex 00000000..74ca3c1d
---- /dev/null
++++ b/fixtures/ai.model-directory-entry/valid/spotted.json
@@@ -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"}]
++}
ddiff --git a/fixtures/ai.model-directory-list/invalid/missing-count.json b/fixtures/ai.model-directory-list/invalid/missing-count.json
nnew file mode 100644
iindex 00000000..8e3e1dc4
---- /dev/null
++++ b/fixtures/ai.model-directory-list/invalid/missing-count.json
@@@ -0,0 +1,3 @@
++{
++ "models": []
++}
ddiff --git a/fixtures/ai.model-directory-list/valid/two.json b/fixtures/ai.model-directory-list/valid/two.json
nnew file mode 100644
iindex 00000000..843fb84a
---- /dev/null
++++ b/fixtures/ai.model-directory-list/valid/two.json
@@@ -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}
++ ]
++}
ddiff --git a/fixtures/bot.command-result/invalid/bad-delivery.json b/fixtures/bot.command-result/invalid/bad-delivery.json
nnew file mode 100644
iindex 00000000..ff874321
---- /dev/null
++++ b/fixtures/bot.command-result/invalid/bad-delivery.json
@@@ -0,0 +1,12 @@
++{
++ "v": 1,
++ "seq": 17,
++ "ts": 1759600000017,
++ "type": "command_result",
++ "id": "op-11",
++ "result": "ack",
++ "delivery": "maybe",
++ "retry": {
++ "safe": true
++ }
++}
ddiff --git a/fixtures/bot.command-result/valid/delivered-no-retry.json b/fixtures/bot.command-result/valid/delivered-no-retry.json
nnew file mode 100644
iindex 00000000..edf6d21d
---- /dev/null
++++ b/fixtures/bot.command-result/valid/delivered-no-retry.json
@@@ -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"
++ }
++}
ddiff --git a/fixtures/bot.command-result/valid/not-delivered-retry.json b/fixtures/bot.command-result/valid/not-delivered-retry.json
nnew file mode 100644
iindex 00000000..2b6bfb0d
---- /dev/null
++++ b/fixtures/bot.command-result/valid/not-delivered-retry.json
@@@ -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"
++ }
++}
ddiff --git a/fixtures/codes.model-plan/invalid/bad-effort.json b/fixtures/codes.model-plan/invalid/bad-effort.json
nnew file mode 100644
iindex 00000000..f3bb5d9c
---- /dev/null
++++ b/fixtures/codes.model-plan/invalid/bad-effort.json
@@@ -0,0 +1 @@
++{"mode":"single","roles":[{"role":"builder","model":"auto","effort":"ultra"}],"checks":{"tests":true}}
ddiff --git a/fixtures/codes.model-plan/invalid/council-one-sample.json b/fixtures/codes.model-plan/invalid/council-one-sample.json
nnew file mode 100644
iindex 00000000..b3058bfb
---- /dev/null
++++ b/fixtures/codes.model-plan/invalid/council-one-sample.json
@@@ -0,0 +1 @@
++{"mode":"council","roles":[{"role":"planner","model":"auto","effort":"high","samples":1},{"role":"builder","model":"auto","effort":"high"}],"checks":{"tests":true}}
ddiff --git a/fixtures/codes.model-plan/invalid/escalate-no-ladder.json b/fixtures/codes.model-plan/invalid/escalate-no-ladder.json
nnew file mode 100644
iindex 00000000..7c719d36
---- /dev/null
++++ b/fixtures/codes.model-plan/invalid/escalate-no-ladder.json
@@@ -0,0 +1 @@
++{"mode":"escalate","roles":[{"role":"builder","model":"auto","effort":"low"}],"checks":{"tests":true}}
ddiff --git a/fixtures/codes.model-plan/invalid/pair-no-reviewer.json b/fixtures/codes.model-plan/invalid/pair-no-reviewer.json
nnew file mode 100644
iindex 00000000..87b82033
---- /dev/null
++++ b/fixtures/codes.model-plan/invalid/pair-no-reviewer.json
@@@ -0,0 +1 @@
++{"mode":"pair","roles":[{"role":"builder","model":"auto","effort":"high"}],"checks":{"tests":true}}
ddiff --git a/fixtures/codes.model-plan/valid/council.json b/fixtures/codes.model-plan/valid/council.json
nnew file mode 100644
iindex 00000000..1f2f259e
---- /dev/null
++++ b/fixtures/codes.model-plan/valid/council.json
@@@ -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}}
ddiff --git a/fixtures/codes.model-plan/valid/escalate.json b/fixtures/codes.model-plan/valid/escalate.json
nnew file mode 100644
iindex 00000000..222dd255
---- /dev/null
++++ b/fixtures/codes.model-plan/valid/escalate.json
@@@ -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}}
ddiff --git a/fixtures/codes.model-plan/valid/pair.json b/fixtures/codes.model-plan/valid/pair.json
nnew file mode 100644
iindex 00000000..173b8587
---- /dev/null
++++ b/fixtures/codes.model-plan/valid/pair.json
@@@ -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}}
ddiff --git a/fixtures/meme.caption.created/invalid/with-text.json b/fixtures/meme.caption.created/invalid/with-text.json
nnew file mode 100644
iindex 00000000..220d289b
---- /dev/null
++++ b/fixtures/meme.caption.created/invalid/with-text.json
@@@ -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"
++}
ddiff --git a/fixtures/meme.caption.created/valid/public.json b/fixtures/meme.caption.created/valid/public.json
nnew file mode 100644
iindex 00000000..6a21daed
---- /dev/null
++++ b/fixtures/meme.caption.created/valid/public.json
@@@ -0,0 +1,5 @@
++{
++ "caption_id": "mcp_01M516F1WX5NN6C0EMW2V0G8Y9",
++ "owner": { "type": "user", "id": "usr_01J8Z3V9Q6N1X2Y3Z4A5B6C7D8" },
++ "created_at": "2026-11-11T03:00:00.000Z"
++}
ddiff --git a/generated/json-schema/bundle.json b/generated/json-schema/bundle.json
iindex 39960920..9d334c69 100644
---- a/generated/json-schema/bundle.json
++++ b/generated/json-schema/bundle.json
@@@ -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",
ddiff --git a/generated/openapi/actor.json b/generated/openapi/actor.json
iindex ce9a6dd3..06f16f6b 100644
---- a/generated/openapi/actor.json
++++ b/generated/openapi/actor.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Actor API",
-- "version": "0.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"
ddiff --git a/generated/openapi/ai.json b/generated/openapi/ai.json
iindex 20286b3f..4f3cc081 100644
---- a/generated/openapi/ai.json
++++ b/generated/openapi/ai.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.AI API",
-- "version": "0.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"
ddiff --git a/generated/openapi/bench.json b/generated/openapi/bench.json
iindex 4da9dd92..e510a2b7 100644
---- a/generated/openapi/bench.json
++++ b/generated/openapi/bench.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Bench API",
-- "version": "0.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"
ddiff --git a/generated/openapi/billing.json b/generated/openapi/billing.json
iindex 4f7c73d4..246fab20 100644
---- a/generated/openapi/billing.json
++++ b/generated/openapi/billing.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Billing API",
-- "version": "0.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"
ddiff --git a/generated/openapi/blog.json b/generated/openapi/blog.json
iindex 46f52610..488b9c15 100644
---- a/generated/openapi/blog.json
++++ b/generated/openapi/blog.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Blog API",
-- "version": "0.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"
ddiff --git a/generated/openapi/bot.json b/generated/openapi/bot.json
iindex 2a59e052..8e9cc872 100644
---- a/generated/openapi/bot.json
++++ b/generated/openapi/bot.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Bot API",
-- "version": "0.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."
}
}
},
ddiff --git a/generated/openapi/chat.json b/generated/openapi/chat.json
iindex 19626e0e..62f9adb4 100644
---- a/generated/openapi/chat.json
++++ b/generated/openapi/chat.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Chat API",
-- "version": "0.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"
ddiff --git a/generated/openapi/codes.json b/generated/openapi/codes.json
iindex 1f4058dd..6a3de10d 100644
---- a/generated/openapi/codes.json
++++ b/generated/openapi/codes.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Codes API",
-- "version": "0.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",
ddiff --git a/generated/openapi/community.json b/generated/openapi/community.json
iindex 8e34e79d..bd77ce62 100644
---- a/generated/openapi/community.json
++++ b/generated/openapi/community.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Community API",
-- "version": "0.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"
++ }
}
}
},
ddiff --git a/generated/openapi/connect.json b/generated/openapi/connect.json
iindex 43ba37bd..692242b0 100644
---- a/generated/openapi/connect.json
++++ b/generated/openapi/connect.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe Connect API",
-- "version": "0.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"
ddiff --git a/generated/openapi/coupons.json b/generated/openapi/coupons.json
iindex 6043b8b0..70556a74 100644
---- a/generated/openapi/coupons.json
++++ b/generated/openapi/coupons.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Coupons API",
-- "version": "0.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"
ddiff --git a/generated/openapi/deals.json b/generated/openapi/deals.json
iindex 15e6a3dc..95bf3a75 100644
---- a/generated/openapi/deals.json
++++ b/generated/openapi/deals.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Deals API",
-- "version": "0.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"
ddiff --git a/generated/openapi/design.json b/generated/openapi/design.json
iindex 64564f44..a2f1edf0 100644
---- a/generated/openapi/design.json
++++ b/generated/openapi/design.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Design API",
-- "version": "0.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"
ddiff --git a/generated/openapi/domains.json b/generated/openapi/domains.json
iindex 675b2d03..0992a910 100644
---- a/generated/openapi/domains.json
++++ b/generated/openapi/domains.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Domains API",
-- "version": "0.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"
ddiff --git a/generated/openapi/events.json b/generated/openapi/events.json
iindex c4afce29..e2202444 100644
---- a/generated/openapi/events.json
++++ b/generated/openapi/events.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Events API",
-- "version": "0.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"
ddiff --git a/generated/openapi/exchange.json b/generated/openapi/exchange.json
iindex 12a7abba..6abfe99c 100644
---- a/generated/openapi/exchange.json
++++ b/generated/openapi/exchange.json
@@@ -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"
ddiff --git a/generated/openapi/food.json b/generated/openapi/food.json
iindex 07cc9276..296ede05 100644
---- a/generated/openapi/food.json
++++ b/generated/openapi/food.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Food API",
-- "version": "0.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"
ddiff --git a/generated/openapi/games.json b/generated/openapi/games.json
iindex 7ec3a49d..925714a8 100644
---- a/generated/openapi/games.json
++++ b/generated/openapi/games.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Games API",
-- "version": "0.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"
ddiff --git a/generated/openapi/git.json b/generated/openapi/git.json
iindex 08f65dba..ed8e31f6 100644
---- a/generated/openapi/git.json
++++ b/generated/openapi/git.json
@@@ -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"
ddiff --git a/generated/openapi/host.json b/generated/openapi/host.json
iindex 537bab68..2296a9da 100644
---- a/generated/openapi/host.json
++++ b/generated/openapi/host.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Host API",
-- "version": "0.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"
ddiff --git a/generated/openapi/inventory.json b/generated/openapi/inventory.json
iindex 6ec1ca55..55f7e124 100644
---- a/generated/openapi/inventory.json
++++ b/generated/openapi/inventory.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Inventory API",
-- "version": "0.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"
ddiff --git a/generated/openapi/live.json b/generated/openapi/live.json
iindex a79efc25..509dfba1 100644
---- a/generated/openapi/live.json
++++ b/generated/openapi/live.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Live API",
-- "version": "0.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"
ddiff --git a/generated/openapi/mail.json b/generated/openapi/mail.json
iindex f1640dec..3637294b 100644
---- a/generated/openapi/mail.json
++++ b/generated/openapi/mail.json
@@@ -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"
ddiff --git a/generated/openapi/media-hub.json b/generated/openapi/media-hub.json
iindex 422a9603..a4e38077 100644
---- a/generated/openapi/media-hub.json
++++ b/generated/openapi/media-hub.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.MediaHub API",
-- "version": "0.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"
ddiff --git a/generated/openapi/media.json b/generated/openapi/media.json
iindex 0cd05435..d49494b1 100644
---- a/generated/openapi/media.json
++++ b/generated/openapi/media.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Media API",
-- "version": "0.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"
ddiff --git a/generated/openapi/network.json b/generated/openapi/network.json
iindex 222a1971..e2c0e9e5 100644
---- a/generated/openapi/network.json
++++ b/generated/openapi/network.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Network API",
-- "version": "0.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"
ddiff --git a/generated/openapi/news.json b/generated/openapi/news.json
iindex 103ebf94..005a1e45 100644
---- a/generated/openapi/news.json
++++ b/generated/openapi/news.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.News API",
-- "version": "0.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"
ddiff --git a/generated/openapi/openre.json b/generated/openapi/openre.json
iindex e610cc15..11800e47 100644
---- a/generated/openapi/openre.json
++++ b/generated/openapi/openre.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenRestream API",
-- "version": "0.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"
ddiff --git a/generated/openapi/play.json b/generated/openapi/play.json
iindex bc401fb3..a1d42658 100644
---- a/generated/openapi/play.json
++++ b/generated/openapi/play.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Play API",
-- "version": "0.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"
ddiff --git a/generated/openapi/quest.json b/generated/openapi/quest.json
iindex 597f55a4..bc85f748 100644
---- a/generated/openapi/quest.json
++++ b/generated/openapi/quest.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Quest API",
-- "version": "0.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"
ddiff --git a/generated/openapi/report.json b/generated/openapi/report.json
iindex 1811900a..a34ce6fc 100644
---- a/generated/openapi/report.json
++++ b/generated/openapi/report.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Report API",
-- "version": "0.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"
ddiff --git a/generated/openapi/reviews.json b/generated/openapi/reviews.json
iindex d892ee39..c18ac479 100644
---- a/generated/openapi/reviews.json
++++ b/generated/openapi/reviews.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Reviews API",
-- "version": "0.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"
ddiff --git a/generated/openapi/run.json b/generated/openapi/run.json
iindex f7c901d0..3e347e8b 100644
---- a/generated/openapi/run.json
++++ b/generated/openapi/run.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Run API",
-- "version": "0.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"
},
ddiff --git a/generated/openapi/search.json b/generated/openapi/search.json
iindex 8fb38b1c..81c553e7 100644
---- a/generated/openapi/search.json
++++ b/generated/openapi/search.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Search API",
-- "version": "0.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"
ddiff --git a/generated/openapi/services.json b/generated/openapi/services.json
iindex bcb390f3..e6a11da6 100644
---- a/generated/openapi/services.json
++++ b/generated/openapi/services.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Services API",
-- "version": "0.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"
ddiff --git a/generated/openapi/sources.json b/generated/openapi/sources.json
iindex b05189f9..904fa548 100644
---- a/generated/openapi/sources.json
++++ b/generated/openapi/sources.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Sources API",
-- "version": "0.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"
ddiff --git a/generated/openapi/space.json b/generated/openapi/space.json
iindex b01f4de6..b77f0afa 100644
---- a/generated/openapi/space.json
++++ b/generated/openapi/space.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Space API",
-- "version": "0.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"
ddiff --git a/generated/openapi/tips.json b/generated/openapi/tips.json
iindex 6cedad86..56e31cc1 100644
---- a/generated/openapi/tips.json
++++ b/generated/openapi/tips.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Tips API",
-- "version": "0.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"
ddiff --git a/generated/openapi/today.json b/generated/openapi/today.json
iindex 1a39d244..8aab6152 100644
---- a/generated/openapi/today.json
++++ b/generated/openapi/today.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Today API",
-- "version": "0.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"
ddiff --git a/generated/openapi/tools.json b/generated/openapi/tools.json
iindex 102f66db..37150d0c 100644
---- a/generated/openapi/tools.json
++++ b/generated/openapi/tools.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Tools API",
-- "version": "0.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"
ddiff --git a/generated/openapi/trade.json b/generated/openapi/trade.json
iindex 00eee3ef..4c1faa83 100644
---- a/generated/openapi/trade.json
++++ b/generated/openapi/trade.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Trade API",
-- "version": "0.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"
ddiff --git a/generated/openapi/vip.json b/generated/openapi/vip.json
iindex 2bb4044d..655fb789 100644
---- a/generated/openapi/vip.json
++++ b/generated/openapi/vip.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.VIP API",
-- "version": "0.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"
ddiff --git a/generated/openapi/vision.json b/generated/openapi/vision.json
iindex 902c35bf..ed9ec007 100644
---- a/generated/openapi/vision.json
++++ b/generated/openapi/vision.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Vision API",
-- "version": "0.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"
ddiff --git a/generated/openapi/watch.json b/generated/openapi/watch.json
iindex 73df9f1d..646ec6f8 100644
---- a/generated/openapi/watch.json
++++ b/generated/openapi/watch.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Watch API",
-- "version": "0.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"
ddiff --git a/generated/openapi/wiki.json b/generated/openapi/wiki.json
iindex 5343b42a..bdd59594 100644
---- a/generated/openapi/wiki.json
++++ b/generated/openapi/wiki.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Wiki API",
-- "version": "0.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"
ddiff --git a/generated/openapi/work.json b/generated/openapi/work.json
iindex 13f64e55..cb2a8d62 100644
---- a/generated/openapi/work.json
++++ b/generated/openapi/work.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Work API",
-- "version": "0.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"
ddiff --git a/generated/openapi/zone.json b/generated/openapi/zone.json
iindex 563d3517..fc766d32 100644
---- a/generated/openapi/zone.json
++++ b/generated/openapi/zone.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Zone API",
-- "version": "0.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"
ddiff --git a/generated/typescript/index.d.ts b/generated/typescript/index.d.ts
iindex ff90fc0a..590c5588 100644
---- a/generated/typescript/index.d.ts
++++ b/generated/typescript/index.d.ts
@@@ -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.
ddiff --git a/manifests/services/meme.json b/manifests/services/meme.json
iindex 50f7d6d4..328b7ac3 100644
---- a/manifests/services/meme.json
++++ b/manifests/services/meme.json
@@@ -16,7 +16,7 @@
"publicSite": "service"
},
"capabilities": [],
-- "eventsProduced": [],
++ "eventsProduced": ["meme.caption.created"],
"eventsConsumed": [],
"namespacesOwned": [
"meme.*"
ddiff --git a/package-lock.json b/package-lock.json
iindex d65928c0..7d27f968 100644
---- a/package-lock.json
++++ b/package-lock.json
@@@ -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",
ddiff --git a/package.json b/package.json
iindex b3c17b56..091262bb 100644
---- a/package.json
++++ b/package.json
@@@ -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",
ddiff --git a/test/codes-model-plan.test.js b/test/codes-model-plan.test.js
nnew file mode 100644
iindex 00000000..d52abc49
---- /dev/null
++++ b/test/codes-model-plan.test.js
@@@ -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');