openvibers/openvibe.contracts Commits

Contracts 0.162.0: codes.task.start/read/cancel (a service starts a coding task for a person on their own machine) (#119)

OP OpenVibers committed 30 days ago · a7da439877 · 65 files, +1620 −68

Plan T16/T17: OpenVibe.Actor routes coding work to OpenVibe.Codes. Today Actor's `codes` agent refuses ("hosted coding runs are not open yet"), but Codes now runs a task on a person's own machine (openvibe.codes/run, live since today).

**Capabilities (codes, first-party)**
- `codes.task.start`: `POST /api/v1/tasks`. A service names the person in `X-OV-Subject`.
  - Codes submits the task to Run as that person, in the project of their latest /run task. Without one: 409 `codes.no_project`.
  - Run places it only on that person's machine.
  - Marked sensitive.
- `codes.task.read`: `GET /api/v1/tasks/:id`.
- `codes.task.cancel`: `POST /api/v1/tasks/:id/cancel`.
- Only the service that started a task, for the same person, sees it.

**Contracts**
- `codes.task-start-request@1`: repo (https, no credentials), ref, prompt, agent, permission edit|full, push, pull_request, idempotency_key.
- `codes.task-start-result@1`.
- `codes.task@1`: state as Run's job, page URL, and once ended: ok, agents, summary, files, patch ≤ 256 KiB, push, cost_usd, duration_ms, error.
- Fixtures: valid and invalid for each.

**Also:** the `codes` service manifest lists the three capabilities. CHANGELOG 0.162.0; `generated/` regenerated.

**Checks**
- `node test/run.js`: 19,653 checks pass.
- `scripts/compat.js v0.161.0`: no breaking changes.

Changes

ddiff --git a/CHANGELOG.md b/CHANGELOG.md
iindex 97789496..07e91e01 100644
---- a/CHANGELOG.md
++++ b/CHANGELOG.md
@@@ -4,6 +4,18 @@ All notable changes to `openvibe-contracts`. Releases are git tags (`vX.Y.Z`) th
from `https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/<tag>`. Before v0.30.0,
the notes were in the tag and commit messages (`git tag -n1`).
++## 0.162.0 — 2026-10-14
++
++- **`codes.task.start`, `codes.task.read`, `codes.task.cancel`** (plan T16/T17): a first-party service starts a coding
++ task for a person on OpenVibe.Codes (`POST /api/v1/tasks`, the person in `X-OV-Subject`), reads it and cancels it.
++ - Codes runs the task on that person's own machine through OpenVibe.Run, in the project of their latest
++ openvibe.codes/run task. Without one: 409 `codes.no_project`.
++ - Only the service that started a task, for the same person, sees it.
++ - OpenVibe.Actor is the first caller: its `codes` agent routes coding work there instead of refusing it.
++- New contracts: `codes.task-start-request@1`, `codes.task-start-result@1`, `codes.task@1` (state, page URL, and once
++ ended: ok, summary, files, patch, push, cost on the person's own keys, duration).
++- Additive. `codes` declares the three capabilities in its service manifest.
++
## 0.161.0 — 2026-10-14
- **`platform.resource-offer@1`: `owner` for a user-owned offer** (plan T14, ADR-046). A person's own Node is offered with
ddiff --git a/contracts/catalog.json b/contracts/catalog.json
iindex baf4bfcd..4cebe9cc 100644
---- a/contracts/catalog.json
++++ b/contracts/catalog.json
@@@ -7128,6 +7128,33 @@
"visibility": "public",
"compatibility": "backward",
"status": "active"
++ },
++ {
++ "id": "codes.task-start-request",
++ "version": "1.0.0",
++ "owner": "codes",
++ "schema": "codes/task-start-request.v1.json",
++ "visibility": "first-party",
++ "compatibility": "backward",
++ "status": "active"
++ },
++ {
++ "id": "codes.task-start-result",
++ "version": "1.0.0",
++ "owner": "codes",
++ "schema": "codes/task-start-result.v1.json",
++ "visibility": "first-party",
++ "compatibility": "backward",
++ "status": "active"
++ },
++ {
++ "id": "codes.task",
++ "version": "1.0.0",
++ "owner": "codes",
++ "schema": "codes/task.v1.json",
++ "visibility": "first-party",
++ "compatibility": "backward",
++ "status": "active"
}
]
}
ddiff --git a/contracts/codes/task-start-request.v1.json b/contracts/codes/task-start-request.v1.json
nnew file mode 100644
iindex 00000000..84a18af4
---- /dev/null
++++ b/contracts/codes/task-start-request.v1.json
@@@ -0,0 +1,53 @@
++{
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/codes/task-start-request.v1.json",
++ "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: 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).",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "repo",
++ "prompt"
++ ],
++ "properties": {
++ "repo": {
++ "type": "string",
++ "format": "uri",
++ "pattern": "^https://[^\\s@/]+/[^\\s@]+$",
++ "maxLength": 300
++ },
++ "ref": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 200,
++ "pattern": "^[^\\s~^:?*\\[\\\\]+$"
++ },
++ "prompt": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 8000
++ },
++ "agent": {
++ "type": "string",
++ "pattern": "^[a-z][a-z0-9-]{1,40}$"
++ },
++ "permission": {
++ "enum": [
++ "edit",
++ "full"
++ ]
++ },
++ "push": {
++ "type": "boolean"
++ },
++ "pull_request": {
++ "type": "boolean"
++ },
++ "idempotency_key": {
++ "type": "string",
++ "minLength": 8,
++ "maxLength": 128,
++ "pattern": "^[A-Za-z0-9_.:-]+$"
++ }
++ }
++}
ddiff --git a/contracts/codes/task-start-result.v1.json b/contracts/codes/task-start-result.v1.json
nnew file mode 100644
iindex 00000000..91246050
---- /dev/null
++++ b/contracts/codes/task-start-result.v1.json
@@@ -0,0 +1,20 @@
++{
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/codes/task-start-result.v1.json",
++ "title": "CodesTaskStartResult",
++ "description": "codes.task-start-result@1: the answer of POST /api/v1/tasks (201 created, or 200 with created false for a repeated idempotency key).",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "task",
++ "created"
++ ],
++ "properties": {
++ "task": {
++ "$ref": "task.v1.json"
++ },
++ "created": {
++ "type": "boolean"
++ }
++ }
++}
ddiff --git a/contracts/codes/task.v1.json b/contracts/codes/task.v1.json
nnew file mode 100644
iindex 00000000..63194b92
---- /dev/null
++++ b/contracts/codes/task.v1.json
@@@ -0,0 +1,179 @@
++{
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/codes/task.v1.json",
++ "title": "CodesTask",
++ "description": "codes.task@1: a coding task on OpenVibe.Codes, as GET /api/v1/tasks/:id answers it (capability codes.task.read) and POST /api/v1/tasks creates it. STATE follows the OpenVibe.Run job that carries it: queued (waiting for one of the person's machines), placed, running, then succeeded, failed, cancelled or expired (no machine of theirs took it in time). URL is the task's page on openvibe.codes, where its owner follows it live. RESULT is present once it has ended: OK says whether the agents finished, SUMMARY what they said, FILES and PATCH the change (the patch at most 256 KiB, PATCH_TRUNCATED when cut), PUSH where it went when asked, COST_USD the model use on the person's own keys, DURATION_MS the time on their machine. ERROR says why a task that never ran ended (Run refused it, or the job failed before a result).",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "id",
++ "state",
++ "repo",
++ "url",
++ "created_at",
++ "updated_at"
++ ],
++ "properties": {
++ "id": {
++ "type": "string",
++ "pattern": "^tsk_[0-9A-HJKMNP-TV-Z]{26}$",
++ "description": "The Codes task id (tsk_ + ULID)."
++ },
++ "state": {
++ "enum": [
++ "queued",
++ "placed",
++ "running",
++ "succeeded",
++ "failed",
++ "cancelled",
++ "expired"
++ ]
++ },
++ "repo": {
++ "type": "string",
++ "maxLength": 300
++ },
++ "ref": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "maxLength": 200
++ },
++ "agent": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "maxLength": 41
++ },
++ "url": {
++ "type": "string",
++ "format": "uri",
++ "pattern": "^https://"
++ },
++ "created_at": {
++ "type": "string",
++ "format": "date-time"
++ },
++ "updated_at": {
++ "type": "string",
++ "format": "date-time"
++ },
++ "error": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "maxLength": 1000
++ },
++ "result": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "ok"
++ ],
++ "properties": {
++ "ok": {
++ "type": "boolean"
++ },
++ "agents": {
++ "type": "array",
++ "maxItems": 20,
++ "items": {
++ "type": "string",
++ "maxLength": 41
++ }
++ },
++ "summary": {
++ "type": "string",
++ "maxLength": 4000
++ },
++ "files": {
++ "type": "array",
++ "maxItems": 2000,
++ "items": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "path"
++ ],
++ "properties": {
++ "path": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 500
++ },
++ "added": {
++ "type": [
++ "integer",
++ "null"
++ ],
++ "minimum": 0
++ },
++ "removed": {
++ "type": [
++ "integer",
++ "null"
++ ],
++ "minimum": 0
++ }
++ }
++ }
++ },
++ "patch": {
++ "type": "string",
++ "maxLength": 262144
++ },
++ "patch_truncated": {
++ "type": "boolean"
++ },
++ "push": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "pushed"
++ ],
++ "properties": {
++ "pushed": {
++ "type": "boolean"
++ },
++ "branch": {
++ "type": "string",
++ "maxLength": 200
++ },
++ "branch_url": {
++ "type": "string",
++ "format": "uri"
++ },
++ "pull_request": {
++ "type": "string",
++ "format": "uri"
++ },
++ "pull_request_error": {
++ "type": "string",
++ "maxLength": 500
++ },
++ "reason": {
++ "type": "string",
++ "maxLength": 500
++ }
++ }
++ },
++ "cost_usd": {
++ "type": "number",
++ "minimum": 0
++ },
++ "duration_ms": {
++ "type": "integer",
++ "minimum": 0
++ },
++ "error": {
++ "type": "string",
++ "maxLength": 1000
++ }
++ }
++ }
++ }
++}
ddiff --git a/fixtures/codes.task-start-request/invalid/blank-prompt.json b/fixtures/codes.task-start-request/invalid/blank-prompt.json
nnew file mode 100644
iindex 00000000..f7b947a1
---- /dev/null
++++ b/fixtures/codes.task-start-request/invalid/blank-prompt.json
@@@ -0,0 +1,4 @@
++{
++ "repo": "https://github.com/octocat/Hello-World",
++ "prompt": ""
++}
ddiff --git a/fixtures/codes.task-start-request/invalid/credentials-in-url.json b/fixtures/codes.task-start-request/invalid/credentials-in-url.json
nnew file mode 100644
iindex 00000000..2cf774a1
---- /dev/null
++++ b/fixtures/codes.task-start-request/invalid/credentials-in-url.json
@@@ -0,0 +1,4 @@
++{
++ "repo": "https://user:[email protected]/octocat/Hello-World",
++ "prompt": "x"
++}
ddiff --git a/fixtures/codes.task-start-request/invalid/not-https.json b/fixtures/codes.task-start-request/invalid/not-https.json
nnew file mode 100644
iindex 00000000..5327fa5c
---- /dev/null
++++ b/fixtures/codes.task-start-request/invalid/not-https.json
@@@ -0,0 +1,4 @@
++{
++ "repo": "[email protected]:octocat/Hello-World.git",
++ "prompt": "x"
++}
ddiff --git a/fixtures/codes.task-start-request/invalid/project-not-here.json b/fixtures/codes.task-start-request/invalid/project-not-here.json
nnew file mode 100644
iindex 00000000..2e50413c
---- /dev/null
++++ b/fixtures/codes.task-start-request/invalid/project-not-here.json
@@@ -0,0 +1,5 @@
++{
++ "repo": "https://github.com/octocat/Hello-World",
++ "prompt": "x",
++ "project": "prj_01M4XE52PGJDVR1KZ1AG9VYW3Q"
++}
ddiff --git a/fixtures/codes.task-start-request/invalid/unknown-permission.json b/fixtures/codes.task-start-request/invalid/unknown-permission.json
nnew file mode 100644
iindex 00000000..88faf83d
---- /dev/null
++++ b/fixtures/codes.task-start-request/invalid/unknown-permission.json
@@@ -0,0 +1,5 @@
++{
++ "repo": "https://github.com/octocat/Hello-World",
++ "prompt": "x",
++ "permission": "root"
++}
ddiff --git a/fixtures/codes.task-start-request/valid/full.json b/fixtures/codes.task-start-request/valid/full.json
nnew file mode 100644
iindex 00000000..79076196
---- /dev/null
++++ b/fixtures/codes.task-start-request/valid/full.json
@@@ -0,0 +1,10 @@
++{
++ "repo": "https://github.com/octocat/Hello-World",
++ "ref": "master",
++ "prompt": "Fix the failing test and run the suite.",
++ "agent": "deepseek",
++ "permission": "full",
++ "push": true,
++ "pull_request": true,
++ "idempotency_key": "act_01M4XF00000000000000000000:step-2"
++}
ddiff --git a/fixtures/codes.task-start-request/valid/minimal.json b/fixtures/codes.task-start-request/valid/minimal.json
nnew file mode 100644
iindex 00000000..7340fb2c
---- /dev/null
++++ b/fixtures/codes.task-start-request/valid/minimal.json
@@@ -0,0 +1,4 @@
++{
++ "repo": "https://github.com/octocat/Hello-World",
++ "prompt": "Add a line to the README."
++}
ddiff --git a/fixtures/codes.task-start-result/invalid/bad-task.json b/fixtures/codes.task-start-result/invalid/bad-task.json
nnew file mode 100644
iindex 00000000..8eb48034
---- /dev/null
++++ b/fixtures/codes.task-start-result/invalid/bad-task.json
@@@ -0,0 +1,13 @@
++{
++ "task": {
++ "id": "tsk_01M4XEV0JT93CAYTXVD6V0QW1E",
++ "state": "nope",
++ "repo": "https://github.com/octocat/Hello-World",
++ "ref": null,
++ "agent": "deepseek",
++ "url": "https://openvibe.codes/run/tasks/tsk_01M4XEV0JT93CAYTXVD6V0QW1E",
++ "created_at": "2026-10-14T15:00:00.000Z",
++ "updated_at": "2026-10-14T15:00:00.000Z"
++ },
++ "created": true
++}
ddiff --git a/fixtures/codes.task-start-result/invalid/no-created.json b/fixtures/codes.task-start-result/invalid/no-created.json
nnew file mode 100644
iindex 00000000..d851295b
---- /dev/null
++++ b/fixtures/codes.task-start-result/invalid/no-created.json
@@@ -0,0 +1,12 @@
++{
++ "task": {
++ "id": "tsk_01M4XEV0JT93CAYTXVD6V0QW1E",
++ "state": "queued",
++ "repo": "https://github.com/octocat/Hello-World",
++ "ref": null,
++ "agent": "deepseek",
++ "url": "https://openvibe.codes/run/tasks/tsk_01M4XEV0JT93CAYTXVD6V0QW1E",
++ "created_at": "2026-10-14T15:00:00.000Z",
++ "updated_at": "2026-10-14T15:00:00.000Z"
++ }
++}
ddiff --git a/fixtures/codes.task-start-result/valid/created.json b/fixtures/codes.task-start-result/valid/created.json
nnew file mode 100644
iindex 00000000..283f2bf5
---- /dev/null
++++ b/fixtures/codes.task-start-result/valid/created.json
@@@ -0,0 +1,13 @@
++{
++ "task": {
++ "id": "tsk_01M4XEV0JT93CAYTXVD6V0QW1E",
++ "state": "queued",
++ "repo": "https://github.com/octocat/Hello-World",
++ "ref": null,
++ "agent": "deepseek",
++ "url": "https://openvibe.codes/run/tasks/tsk_01M4XEV0JT93CAYTXVD6V0QW1E",
++ "created_at": "2026-10-14T15:00:00.000Z",
++ "updated_at": "2026-10-14T15:00:00.000Z"
++ },
++ "created": true
++}
ddiff --git a/fixtures/codes.task-start-result/valid/repeated.json b/fixtures/codes.task-start-result/valid/repeated.json
nnew file mode 100644
iindex 00000000..4038d5d2
---- /dev/null
++++ b/fixtures/codes.task-start-result/valid/repeated.json
@@@ -0,0 +1,34 @@
++{
++ "task": {
++ "id": "tsk_01M4XEV0JT93CAYTXVD6V0QW1E",
++ "state": "succeeded",
++ "repo": "https://github.com/octocat/Hello-World",
++ "ref": null,
++ "agent": "deepseek",
++ "url": "https://openvibe.codes/run/tasks/tsk_01M4XEV0JT93CAYTXVD6V0QW1E",
++ "created_at": "2026-10-14T15:00:00.000Z",
++ "updated_at": "2026-10-14T15:01:12.000Z",
++ "result": {
++ "ok": true,
++ "agents": [
++ "deepseek"
++ ],
++ "summary": "Appended the line.",
++ "files": [
++ {
++ "path": "README",
++ "added": 1,
++ "removed": 0
++ }
++ ],
++ "patch": "diff --git a/README b/README\n--- a/README\n+++ b/README\n@@ -1 +1,2 @@\n Hello World!\n+Edited.\n",
++ "cost_usd": 0.0011,
++ "duration_ms": 4200,
++ "push": {
++ "pushed": false,
++ "reason": "no GITHUB_TOKEN on this machine"
++ }
++ }
++ },
++ "created": false
++}
ddiff --git a/fixtures/codes.task/invalid/bad-id.json b/fixtures/codes.task/invalid/bad-id.json
nnew file mode 100644
iindex 00000000..f65ee7a1
---- /dev/null
++++ b/fixtures/codes.task/invalid/bad-id.json
@@@ -0,0 +1,10 @@
++{
++ "id": "task_1",
++ "state": "queued",
++ "repo": "https://github.com/octocat/Hello-World",
++ "ref": null,
++ "agent": "deepseek",
++ "url": "https://openvibe.codes/run/tasks/tsk_01M4XEV0JT93CAYTXVD6V0QW1E",
++ "created_at": "2026-10-14T15:00:00.000Z",
++ "updated_at": "2026-10-14T15:00:00.000Z"
++}
ddiff --git a/fixtures/codes.task/invalid/http-url.json b/fixtures/codes.task/invalid/http-url.json
nnew file mode 100644
iindex 00000000..890039a4
---- /dev/null
++++ b/fixtures/codes.task/invalid/http-url.json
@@@ -0,0 +1,10 @@
++{
++ "id": "tsk_01M4XEV0JT93CAYTXVD6V0QW1E",
++ "state": "queued",
++ "repo": "https://github.com/octocat/Hello-World",
++ "ref": null,
++ "agent": "deepseek",
++ "url": "http://openvibe.codes/run/tasks/tsk_01M4XEV0JT93CAYTXVD6V0QW1E",
++ "created_at": "2026-10-14T15:00:00.000Z",
++ "updated_at": "2026-10-14T15:00:00.000Z"
++}
ddiff --git a/fixtures/codes.task/invalid/result-without-ok.json b/fixtures/codes.task/invalid/result-without-ok.json
nnew file mode 100644
iindex 00000000..a42464f6
---- /dev/null
++++ b/fixtures/codes.task/invalid/result-without-ok.json
@@@ -0,0 +1,13 @@
++{
++ "id": "tsk_01M4XEV0JT93CAYTXVD6V0QW1E",
++ "state": "succeeded",
++ "repo": "https://github.com/octocat/Hello-World",
++ "ref": null,
++ "agent": "deepseek",
++ "url": "https://openvibe.codes/run/tasks/tsk_01M4XEV0JT93CAYTXVD6V0QW1E",
++ "created_at": "2026-10-14T15:00:00.000Z",
++ "updated_at": "2026-10-14T15:00:00.000Z",
++ "result": {
++ "summary": "x"
++ }
++}
ddiff --git a/fixtures/codes.task/invalid/unknown-state.json b/fixtures/codes.task/invalid/unknown-state.json
nnew file mode 100644
iindex 00000000..4d131884
---- /dev/null
++++ b/fixtures/codes.task/invalid/unknown-state.json
@@@ -0,0 +1,10 @@
++{
++ "id": "tsk_01M4XEV0JT93CAYTXVD6V0QW1E",
++ "state": "paused",
++ "repo": "https://github.com/octocat/Hello-World",
++ "ref": null,
++ "agent": "deepseek",
++ "url": "https://openvibe.codes/run/tasks/tsk_01M4XEV0JT93CAYTXVD6V0QW1E",
++ "created_at": "2026-10-14T15:00:00.000Z",
++ "updated_at": "2026-10-14T15:00:00.000Z"
++}
ddiff --git a/fixtures/codes.task/valid/failed-before-running.json b/fixtures/codes.task/valid/failed-before-running.json
nnew file mode 100644
iindex 00000000..4910d49f
---- /dev/null
++++ b/fixtures/codes.task/valid/failed-before-running.json
@@@ -0,0 +1,11 @@
++{
++ "id": "tsk_01M4XEV0JT93CAYTXVD6V0QW1E",
++ "state": "failed",
++ "repo": "https://github.com/octocat/Hello-World",
++ "ref": null,
++ "agent": "deepseek",
++ "url": "https://openvibe.codes/run/tasks/tsk_01M4XEV0JT93CAYTXVD6V0QW1E",
++ "created_at": "2026-10-14T15:00:00.000Z",
++ "updated_at": "2026-10-14T15:00:00.000Z",
++ "error": "run.job.unplaceable: no machine of yours runs code jobs"
++}
ddiff --git a/fixtures/codes.task/valid/queued.json b/fixtures/codes.task/valid/queued.json
nnew file mode 100644
iindex 00000000..4e44bb32
---- /dev/null
++++ b/fixtures/codes.task/valid/queued.json
@@@ -0,0 +1,10 @@
++{
++ "id": "tsk_01M4XEV0JT93CAYTXVD6V0QW1E",
++ "state": "queued",
++ "repo": "https://github.com/octocat/Hello-World",
++ "ref": null,
++ "agent": "deepseek",
++ "url": "https://openvibe.codes/run/tasks/tsk_01M4XEV0JT93CAYTXVD6V0QW1E",
++ "created_at": "2026-10-14T15:00:00.000Z",
++ "updated_at": "2026-10-14T15:00:00.000Z"
++}
ddiff --git a/fixtures/codes.task/valid/succeeded.json b/fixtures/codes.task/valid/succeeded.json
nnew file mode 100644
iindex 00000000..902660ef
---- /dev/null
++++ b/fixtures/codes.task/valid/succeeded.json
@@@ -0,0 +1,31 @@
++{
++ "id": "tsk_01M4XEV0JT93CAYTXVD6V0QW1E",
++ "state": "succeeded",
++ "repo": "https://github.com/octocat/Hello-World",
++ "ref": null,
++ "agent": "deepseek",
++ "url": "https://openvibe.codes/run/tasks/tsk_01M4XEV0JT93CAYTXVD6V0QW1E",
++ "created_at": "2026-10-14T15:00:00.000Z",
++ "updated_at": "2026-10-14T15:01:12.000Z",
++ "result": {
++ "ok": true,
++ "agents": [
++ "deepseek"
++ ],
++ "summary": "Appended the line.",
++ "files": [
++ {
++ "path": "README",
++ "added": 1,
++ "removed": 0
++ }
++ ],
++ "patch": "diff --git a/README b/README\n--- a/README\n+++ b/README\n@@ -1 +1,2 @@\n Hello World!\n+Edited.\n",
++ "cost_usd": 0.0011,
++ "duration_ms": 4200,
++ "push": {
++ "pushed": false,
++ "reason": "no GITHUB_TOKEN on this machine"
++ }
++ }
++}
ddiff --git a/generated/json-schema/bundle.json b/generated/json-schema/bundle.json
iindex 6f6bdce7..ba2c976c 100644
---- a/generated/json-schema/bundle.json
++++ b/generated/json-schema/bundle.json
@@@ -79685,6 +79685,273 @@
}
]
}
++ },
++ "codes.task-start-request": {
++ "version": "1.0.0",
++ "owner": "codes",
++ "status": "active",
++ "schema": {
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/codes/task-start-request.v1.json",
++ "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: 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).",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "repo",
++ "prompt"
++ ],
++ "properties": {
++ "repo": {
++ "type": "string",
++ "format": "uri",
++ "pattern": "^https://[^\\s@/]+/[^\\s@]+$",
++ "maxLength": 300
++ },
++ "ref": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 200,
++ "pattern": "^[^\\s~^:?*\\[\\\\]+$"
++ },
++ "prompt": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 8000
++ },
++ "agent": {
++ "type": "string",
++ "pattern": "^[a-z][a-z0-9-]{1,40}$"
++ },
++ "permission": {
++ "enum": [
++ "edit",
++ "full"
++ ]
++ },
++ "push": {
++ "type": "boolean"
++ },
++ "pull_request": {
++ "type": "boolean"
++ },
++ "idempotency_key": {
++ "type": "string",
++ "minLength": 8,
++ "maxLength": 128,
++ "pattern": "^[A-Za-z0-9_.:-]+$"
++ }
++ }
++ }
++ },
++ "codes.task-start-result": {
++ "version": "1.0.0",
++ "owner": "codes",
++ "status": "active",
++ "schema": {
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/codes/task-start-result.v1.json",
++ "title": "CodesTaskStartResult",
++ "description": "codes.task-start-result@1: the answer of POST /api/v1/tasks (201 created, or 200 with created false for a repeated idempotency key).",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "task",
++ "created"
++ ],
++ "properties": {
++ "task": {
++ "$ref": "task.v1.json"
++ },
++ "created": {
++ "type": "boolean"
++ }
++ }
++ }
++ },
++ "codes.task": {
++ "version": "1.0.0",
++ "owner": "codes",
++ "status": "active",
++ "schema": {
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/codes/task.v1.json",
++ "title": "CodesTask",
++ "description": "codes.task@1: a coding task on OpenVibe.Codes, as GET /api/v1/tasks/:id answers it (capability codes.task.read) and POST /api/v1/tasks creates it. STATE follows the OpenVibe.Run job that carries it: queued (waiting for one of the person's machines), placed, running, then succeeded, failed, cancelled or expired (no machine of theirs took it in time). URL is the task's page on openvibe.codes, where its owner follows it live. RESULT is present once it has ended: OK says whether the agents finished, SUMMARY what they said, FILES and PATCH the change (the patch at most 256 KiB, PATCH_TRUNCATED when cut), PUSH where it went when asked, COST_USD the model use on the person's own keys, DURATION_MS the time on their machine. ERROR says why a task that never ran ended (Run refused it, or the job failed before a result).",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "id",
++ "state",
++ "repo",
++ "url",
++ "created_at",
++ "updated_at"
++ ],
++ "properties": {
++ "id": {
++ "type": "string",
++ "pattern": "^tsk_[0-9A-HJKMNP-TV-Z]{26}$",
++ "description": "The Codes task id (tsk_ + ULID)."
++ },
++ "state": {
++ "enum": [
++ "queued",
++ "placed",
++ "running",
++ "succeeded",
++ "failed",
++ "cancelled",
++ "expired"
++ ]
++ },
++ "repo": {
++ "type": "string",
++ "maxLength": 300
++ },
++ "ref": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "maxLength": 200
++ },
++ "agent": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "maxLength": 41
++ },
++ "url": {
++ "type": "string",
++ "format": "uri",
++ "pattern": "^https://"
++ },
++ "created_at": {
++ "type": "string",
++ "format": "date-time"
++ },
++ "updated_at": {
++ "type": "string",
++ "format": "date-time"
++ },
++ "error": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "maxLength": 1000
++ },
++ "result": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "ok"
++ ],
++ "properties": {
++ "ok": {
++ "type": "boolean"
++ },
++ "agents": {
++ "type": "array",
++ "maxItems": 20,
++ "items": {
++ "type": "string",
++ "maxLength": 41
++ }
++ },
++ "summary": {
++ "type": "string",
++ "maxLength": 4000
++ },
++ "files": {
++ "type": "array",
++ "maxItems": 2000,
++ "items": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "path"
++ ],
++ "properties": {
++ "path": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 500
++ },
++ "added": {
++ "type": [
++ "integer",
++ "null"
++ ],
++ "minimum": 0
++ },
++ "removed": {
++ "type": [
++ "integer",
++ "null"
++ ],
++ "minimum": 0
++ }
++ }
++ }
++ },
++ "patch": {
++ "type": "string",
++ "maxLength": 262144
++ },
++ "patch_truncated": {
++ "type": "boolean"
++ },
++ "push": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "pushed"
++ ],
++ "properties": {
++ "pushed": {
++ "type": "boolean"
++ },
++ "branch": {
++ "type": "string",
++ "maxLength": 200
++ },
++ "branch_url": {
++ "type": "string",
++ "format": "uri"
++ },
++ "pull_request": {
++ "type": "string",
++ "format": "uri"
++ },
++ "pull_request_error": {
++ "type": "string",
++ "maxLength": 500
++ },
++ "reason": {
++ "type": "string",
++ "maxLength": 500
++ }
++ }
++ },
++ "cost_usd": {
++ "type": "number",
++ "minimum": 0
++ },
++ "duration_ms": {
++ "type": "integer",
++ "minimum": 0
++ },
++ "error": {
++ "type": "string",
++ "maxLength": 1000
++ }
++ }
++ }
++ }
++ }
}
}
}
ddiff --git a/generated/openapi/actor.json b/generated/openapi/actor.json
iindex b88c8540..e91403df 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.161.0",
-- "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.161.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.162.0",
++ "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.162.0): each operation lists the capabilities it performs; a token for the 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 76df3763..b8455681 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.161.0",
-- "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.161.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.162.0",
++ "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.162.0): each operation lists the capabilities it performs; a token for the 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 4b69e95f..fe875db9 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.161.0",
-- "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.161.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.162.0",
++ "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.162.0): each operation lists the capabilities it performs; a token for the 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 f5140a82..e2bf24b4 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.161.0",
-- "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.161.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.162.0",
++ "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.162.0): each operation lists the capabilities it performs; a token for the 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 c8812d86..4759a65a 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.161.0",
-- "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.161.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.162.0",
++ "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.162.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/chat.json b/generated/openapi/chat.json
iindex e956335a..79b6ec4c 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.161.0",
-- "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.161.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.162.0",
++ "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.162.0): each operation lists the capabilities it performs; a token for the 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
nnew file mode 100644
iindex 00000000..1c1e3835
---- /dev/null
++++ b/generated/openapi/codes.json
@@@ -0,0 +1,512 @@
++{
++ "openapi": "3.1.0",
++ "jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
++ "info": {
++ "title": "OpenVibe.Codes API",
++ "version": "0.162.0",
++ "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.162.0): each operation lists the capabilities it performs; a token for the 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"
++ }
++ },
++ "servers": [
++ {
++ "url": "https://openvibe.codes"
++ }
++ ],
++ "paths": {
++ "/api/v1/tasks": {
++ "post": {
++ "operationId": "post_api_v1_tasks",
++ "summary": "Start a coding task for a person on their own machine: POST /api/v1/tasks on OpenVibe.Codes, as a first-party service naming the person in X-OV-Subject (OpenVibe.Actor routes coding work here, plan T1",
++ "description": "**codes.task.start** (first-party): Start a coding task for a person on their own machine: POST /api/v1/tasks on OpenVibe.Codes, as a first-party service naming the person in X-OV-Subject (OpenVibe.Actor routes coding work here, plan T17). Codes submits it to OpenVibe.Run as that person, in the project of their latest openvibe.codes/run task, and Run places it only on a machine of theirs (platform.resource-offer@1 owner). The person pays nothing to OpenVibe for it: the model use is on their own machine's keys.",
++ "tags": [
++ "codes.task"
++ ],
++ "x-openvibe-capabilities": [
++ "codes.task.start"
++ ],
++ "x-openvibe-visibility": [
++ "first-party"
++ ],
++ "x-openvibe-quota-class": "codes-task-start",
++ "security": [
++ {
++ "openvibeToken": [
++ "codes.task.start"
++ ]
++ }
++ ],
++ "requestBody": {
++ "required": false,
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/codes.task-start-request.v1"
++ }
++ }
++ }
++ },
++ "responses": {
++ "2XX": {
++ "description": "Success",
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/codes.task-start-result.v1"
++ }
++ }
++ }
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ }
++ },
++ "/api/v1/tasks/{id}": {
++ "get": {
++ "operationId": "get_api_v1_tasks_id",
++ "summary": "Read a coding task started through codes.task.start: GET /api/v1/tasks/:id on OpenVibe.Codes, as the service that started it, naming the same person in X-OV-Subject.",
++ "description": "**codes.task.read** (first-party): Read a coding task started through codes.task.start: GET /api/v1/tasks/:id on OpenVibe.Codes, as the service that started it, naming the same person in X-OV-Subject. Another service's task, or another person's, is 404.",
++ "tags": [
++ "codes.task"
++ ],
++ "x-openvibe-capabilities": [
++ "codes.task.read"
++ ],
++ "x-openvibe-visibility": [
++ "first-party"
++ ],
++ "x-openvibe-quota-class": "codes-read",
++ "security": [
++ {
++ "openvibeToken": [
++ "codes.task.read"
++ ]
++ }
++ ],
++ "parameters": [
++ {
++ "name": "id",
++ "in": "path",
++ "required": true,
++ "schema": {
++ "type": "string"
++ }
++ }
++ ],
++ "responses": {
++ "2XX": {
++ "description": "Success",
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/codes.task.v1"
++ }
++ }
++ }
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ }
++ },
++ "/api/v1/tasks/{id}/cancel": {
++ "post": {
++ "operationId": "post_api_v1_tasks_id_cancel",
++ "summary": "Cancel a coding task started through codes.task.start that has not ended: POST /api/v1/tasks/:id/cancel on OpenVibe.Codes, as the service that started it, naming the same person in X-OV-Subject.",
++ "description": "**codes.task.cancel** (first-party): Cancel a coding task started through codes.task.start that has not ended: POST /api/v1/tasks/:id/cancel on OpenVibe.Codes, as the service that started it, naming the same person in X-OV-Subject. Codes cancels the Run job; the task ends cancelled (an ended one is answered as it is).",
++ "tags": [
++ "codes.task"
++ ],
++ "x-openvibe-capabilities": [
++ "codes.task.cancel"
++ ],
++ "x-openvibe-visibility": [
++ "first-party"
++ ],
++ "x-openvibe-quota-class": "codes-task-start",
++ "security": [
++ {
++ "openvibeToken": [
++ "codes.task.cancel"
++ ]
++ }
++ ],
++ "parameters": [
++ {
++ "name": "id",
++ "in": "path",
++ "required": true,
++ "schema": {
++ "type": "string"
++ }
++ }
++ ],
++ "responses": {
++ "2XX": {
++ "description": "Success",
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/codes.task.v1"
++ }
++ }
++ }
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ }
++ }
++ },
++ "components": {
++ "schemas": {
++ "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: 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).",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "repo",
++ "prompt"
++ ],
++ "properties": {
++ "repo": {
++ "type": "string",
++ "format": "uri",
++ "pattern": "^https://[^\\s@/]+/[^\\s@]+$",
++ "maxLength": 300
++ },
++ "ref": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 200,
++ "pattern": "^[^\\s~^:?*\\[\\\\]+$"
++ },
++ "prompt": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 8000
++ },
++ "agent": {
++ "type": "string",
++ "pattern": "^[a-z][a-z0-9-]{1,40}$"
++ },
++ "permission": {
++ "enum": [
++ "edit",
++ "full"
++ ]
++ },
++ "push": {
++ "type": "boolean"
++ },
++ "pull_request": {
++ "type": "boolean"
++ },
++ "idempotency_key": {
++ "type": "string",
++ "minLength": 8,
++ "maxLength": 128,
++ "pattern": "^[A-Za-z0-9_.:-]+$"
++ }
++ }
++ },
++ "codes.task-start-result.v1": {
++ "title": "CodesTaskStartResult",
++ "description": "codes.task-start-result@1: the answer of POST /api/v1/tasks (201 created, or 200 with created false for a repeated idempotency key).",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "task",
++ "created"
++ ],
++ "properties": {
++ "task": {
++ "$ref": "#/components/schemas/codes.task.v1"
++ },
++ "created": {
++ "type": "boolean"
++ }
++ }
++ },
++ "codes.task.v1": {
++ "title": "CodesTask",
++ "description": "codes.task@1: a coding task on OpenVibe.Codes, as GET /api/v1/tasks/:id answers it (capability codes.task.read) and POST /api/v1/tasks creates it. STATE follows the OpenVibe.Run job that carries it: queued (waiting for one of the person's machines), placed, running, then succeeded, failed, cancelled or expired (no machine of theirs took it in time). URL is the task's page on openvibe.codes, where its owner follows it live. RESULT is present once it has ended: OK says whether the agents finished, SUMMARY what they said, FILES and PATCH the change (the patch at most 256 KiB, PATCH_TRUNCATED when cut), PUSH where it went when asked, COST_USD the model use on the person's own keys, DURATION_MS the time on their machine. ERROR says why a task that never ran ended (Run refused it, or the job failed before a result).",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "id",
++ "state",
++ "repo",
++ "url",
++ "created_at",
++ "updated_at"
++ ],
++ "properties": {
++ "id": {
++ "type": "string",
++ "pattern": "^tsk_[0-9A-HJKMNP-TV-Z]{26}$",
++ "description": "The Codes task id (tsk_ + ULID)."
++ },
++ "state": {
++ "enum": [
++ "queued",
++ "placed",
++ "running",
++ "succeeded",
++ "failed",
++ "cancelled",
++ "expired"
++ ]
++ },
++ "repo": {
++ "type": "string",
++ "maxLength": 300
++ },
++ "ref": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "maxLength": 200
++ },
++ "agent": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "maxLength": 41
++ },
++ "url": {
++ "type": "string",
++ "format": "uri",
++ "pattern": "^https://"
++ },
++ "created_at": {
++ "type": "string",
++ "format": "date-time"
++ },
++ "updated_at": {
++ "type": "string",
++ "format": "date-time"
++ },
++ "error": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "maxLength": 1000
++ },
++ "result": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "ok"
++ ],
++ "properties": {
++ "ok": {
++ "type": "boolean"
++ },
++ "agents": {
++ "type": "array",
++ "maxItems": 20,
++ "items": {
++ "type": "string",
++ "maxLength": 41
++ }
++ },
++ "summary": {
++ "type": "string",
++ "maxLength": 4000
++ },
++ "files": {
++ "type": "array",
++ "maxItems": 2000,
++ "items": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "path"
++ ],
++ "properties": {
++ "path": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 500
++ },
++ "added": {
++ "type": [
++ "integer",
++ "null"
++ ],
++ "minimum": 0
++ },
++ "removed": {
++ "type": [
++ "integer",
++ "null"
++ ],
++ "minimum": 0
++ }
++ }
++ }
++ },
++ "patch": {
++ "type": "string",
++ "maxLength": 262144
++ },
++ "patch_truncated": {
++ "type": "boolean"
++ },
++ "push": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "pushed"
++ ],
++ "properties": {
++ "pushed": {
++ "type": "boolean"
++ },
++ "branch": {
++ "type": "string",
++ "maxLength": 200
++ },
++ "branch_url": {
++ "type": "string",
++ "format": "uri"
++ },
++ "pull_request": {
++ "type": "string",
++ "format": "uri"
++ },
++ "pull_request_error": {
++ "type": "string",
++ "maxLength": 500
++ },
++ "reason": {
++ "type": "string",
++ "maxLength": 500
++ }
++ }
++ },
++ "cost_usd": {
++ "type": "number",
++ "minimum": 0
++ },
++ "duration_ms": {
++ "type": "integer",
++ "minimum": 0
++ },
++ "error": {
++ "type": "string",
++ "maxLength": 1000
++ }
++ }
++ }
++ }
++ },
++ "errors.problem.v1": {
++ "title": "Problem",
++ "description": "RFC 9457 problem details (application/problem+json) with a stable OpenVibe error code and trace identifiers. The legacy 'error' string is allowed during migration so existing clients keep working.",
++ "type": "object",
++ "required": [
++ "type",
++ "title",
++ "status",
++ "code"
++ ],
++ "additionalProperties": true,
++ "properties": {
++ "type": {
++ "type": "string",
++ "format": "uri-reference"
++ },
++ "title": {
++ "type": "string",
++ "minLength": 1
++ },
++ "status": {
++ "type": "integer",
++ "minimum": 400,
++ "maximum": 599
++ },
++ "detail": {
++ "type": "string"
++ },
++ "instance": {
++ "type": "string",
++ "format": "uri-reference"
++ },
++ "code": {
++ "type": "string",
++ "pattern": "^[a-z][a-z0-9_]*(\\.[a-z0-9_]+)*$"
++ },
++ "request_id": {
++ "type": "string"
++ },
++ "trace_id": {
++ "type": "string",
++ "pattern": "^[0-9a-f]{32}$"
++ },
++ "errors": {
++ "type": "array",
++ "items": {
++ "type": "object",
++ "required": [
++ "message"
++ ],
++ "properties": {
++ "path": {
++ "type": "string"
++ },
++ "message": {
++ "type": "string"
++ }
++ }
++ }
++ },
++ "error": {
++ "type": "string",
++ "description": "Deprecated compatibility field: same text as title/detail for clients that read {error}."
++ }
++ }
++ }
++ },
++ "securitySchemes": {
++ "openvibeToken": {
++ "type": "http",
++ "scheme": "bearer",
++ "bearerFormat": "JWT",
++ "description": "An OpenVibe Network token for this service: a person's token, an app token (client credentials, audience of the service) or a first-party service token. Its `cap` claim must include the capability the operation names."
++ }
++ }
++ }
++}
ddiff --git a/generated/openapi/community.json b/generated/openapi/community.json
iindex 2990c95e..9c10c93f 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.161.0",
-- "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.161.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.162.0",
++ "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.162.0): each operation lists the capabilities it performs; a token for the 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 614869c7..00735c63 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.161.0",
-- "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.161.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.162.0",
++ "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.162.0): each operation lists the capabilities it performs; a token for the 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 f406d128..02d23fe1 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.161.0",
-- "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.161.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.162.0",
++ "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.162.0): each operation lists the capabilities it performs; a token for the 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 65fc3fd3..4288e627 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.161.0",
-- "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.161.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.162.0",
++ "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.162.0): each operation lists the capabilities it performs; a token for the 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 e363d7d0..de5408af 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.161.0",
-- "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.161.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.162.0",
++ "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.162.0): each operation lists the capabilities it performs; a token for the 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 f6b8b94d..d0cc2e6d 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.161.0",
-- "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.161.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.162.0",
++ "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.162.0): each operation lists the capabilities it performs; a token for the 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 adbba8dd..829f331c 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.161.0",
-- "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.161.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.162.0",
++ "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.162.0): each operation lists the capabilities it performs; a token for the 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/index.json b/generated/openapi/index.json
iindex 2ed3687e..56c66ed4 100644
---- a/generated/openapi/index.json
++++ b/generated/openapi/index.json
@@@ -43,6 +43,13 @@
"operations": 24,
"capabilities": 13
},
++ {
++ "service": "codes",
++ "name": "OpenVibe.Codes",
++ "origin": "https://openvibe.codes",
++ "operations": 3,
++ "capabilities": 3
++ },
{
"service": "community",
"name": "OpenVibe.Community",
ddiff --git a/generated/openapi/inventory.json b/generated/openapi/inventory.json
iindex 97ac11af..8ab1eff1 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.161.0",
-- "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.161.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.162.0",
++ "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.162.0): each operation lists the capabilities it performs; a token for the 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 2dd08a7e..277af7e5 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.161.0",
-- "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.161.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.162.0",
++ "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.162.0): each operation lists the capabilities it performs; a token for the 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 2274c0ce..98078adb 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.161.0",
-- "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.161.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.162.0",
++ "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.162.0): each operation lists the capabilities it performs; a token for the 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 745a3de1..da221134 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.161.0",
-- "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.161.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.162.0",
++ "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.162.0): each operation lists the capabilities it performs; a token for the 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 de99ade4..704f7743 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.161.0",
-- "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.161.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.162.0",
++ "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.162.0): each operation lists the capabilities it performs; a token for the 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 ef724bdd..2068b18c 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.161.0",
-- "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.161.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.162.0",
++ "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.162.0): each operation lists the capabilities it performs; a token for the 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 58e68335..b1f91a9e 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.161.0",
-- "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.161.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.162.0",
++ "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.162.0): each operation lists the capabilities it performs; a token for the 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 399c170f..5ef7c4ba 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.161.0",
-- "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.161.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.162.0",
++ "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.162.0): each operation lists the capabilities it performs; a token for the 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 1c1f6254..fde04994 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.161.0",
-- "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.161.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.162.0",
++ "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.162.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/search.json b/generated/openapi/search.json
iindex 00007069..3eafdefa 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.161.0",
-- "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.161.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.162.0",
++ "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.162.0): each operation lists the capabilities it performs; a token for the 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 10241d4d..63c42879 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.161.0",
-- "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.161.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.162.0",
++ "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.162.0): each operation lists the capabilities it performs; a token for the 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 548f5216..ed776ba1 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.161.0",
-- "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.161.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.162.0",
++ "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.162.0): each operation lists the capabilities it performs; a token for the 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 c75719ef..77e3d8f5 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.161.0",
-- "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.161.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.162.0",
++ "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.162.0): each operation lists the capabilities it performs; a token for the 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 2fcab092..0294201c 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.161.0",
-- "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.161.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.162.0",
++ "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.162.0): each operation lists the capabilities it performs; a token for the 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 c1f9c341..608d15e7 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.161.0",
-- "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.161.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.162.0",
++ "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.162.0): each operation lists the capabilities it performs; a token for the 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 59e9025e..e34ccb53 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.161.0",
-- "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.161.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.162.0",
++ "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.162.0): each operation lists the capabilities it performs; a token for the 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 7d0d2ea8..06970965 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.161.0",
-- "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.161.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.162.0",
++ "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.162.0): each operation lists the capabilities it performs; a token for the 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 97fc699e..a2292ac6 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.161.0",
-- "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.161.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.162.0",
++ "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.162.0): each operation lists the capabilities it performs; a token for the 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 b02a1c4d..d274fdc0 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.161.0",
-- "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.161.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.162.0",
++ "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.162.0): each operation lists the capabilities it performs; a token for the 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 bca99544..69cac649 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.161.0",
-- "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.161.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.162.0",
++ "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.162.0): each operation lists the capabilities it performs; a token for the 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 924f92ab..5929fc76 100644
---- a/generated/typescript/index.d.ts
++++ b/generated/typescript/index.d.ts
@@@ -176945,3 +176945,207 @@ export type VideoPlaylistManageResult =
added_at: string;
}[];
};
++
++/** [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: 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).
++ */
++export interface CodesTaskStartRequest {
++ repo: string;
++ ref?: string;
++ prompt: string;
++ agent?: string;
++ permission?: "edit" | "full";
++ push?: boolean;
++ pull_request?: boolean;
++ idempotency_key?: string;
++}
++
++/** [email protected] (owner: codes) */
++/**
++ * codes.task-start-result@1: the answer of POST /api/v1/tasks (201 created, or 200 with created false for a repeated idempotency key).
++ */
++export interface CodesTaskStartResult {
++ task: CodesTask;
++ created: boolean;
++}
++
++/** [email protected] (owner: codes) */
++/**
++ * codes.task@1: a coding task on OpenVibe.Codes, as GET /api/v1/tasks/:id answers it (capability codes.task.read) and POST /api/v1/tasks creates it. STATE follows the OpenVibe.Run job that carries it: queued (waiting for one of the person's machines), placed, running, then succeeded, failed, cancelled or expired (no machine of theirs took it in time). URL is the task's page on openvibe.codes, where its owner follows it live. RESULT is present once it has ended: OK says whether the agents finished, SUMMARY what they said, FILES and PATCH the change (the patch at most 256 KiB, PATCH_TRUNCATED when cut), PUSH where it went when asked, COST_USD the model use on the person's own keys, DURATION_MS the time on their machine. ERROR says why a task that never ran ended (Run refused it, or the job failed before a result).
++ */
++export interface CodesTask {
++ /**
++ * The Codes task id (tsk_ + ULID).
++ */
++ id: string;
++ state: "queued" | "placed" | "running" | "succeeded" | "failed" | "cancelled" | "expired";
++ repo: string;
++ ref?: string | null;
++ agent?: string | null;
++ url: string;
++ created_at: string;
++ updated_at: string;
++ error?: string | null;
++ result?: {
++ ok: boolean;
++ /**
++ * @maxItems 20
++ */
++ agents?:
++ | []
++ | [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]
++ | [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, 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,
++ 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,
++ 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,
++ 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
++ ];
++ summary?: string;
++ /**
++ * @maxItems 2000
++ */
++ files?: {
++ path: string;
++ added?: number | null;
++ removed?: number | null;
++ }[];
++ patch?: string;
++ patch_truncated?: boolean;
++ push?: {
++ pushed: boolean;
++ branch?: string;
++ branch_url?: string;
++ pull_request?: string;
++ pull_request_error?: string;
++ reason?: string;
++ };
++ cost_usd?: number;
++ duration_ms?: number;
++ error?: string;
++ };
++}
ddiff --git a/manifests/capabilities/codes.task.cancel.json b/manifests/capabilities/codes.task.cancel.json
nnew file mode 100644
iindex 00000000..8e883f32
---- /dev/null
++++ b/manifests/capabilities/codes.task.cancel.json
@@@ -0,0 +1,21 @@
++{
++ "id": "codes.task.cancel",
++ "version": "1.0",
++ "owner": "codes",
++ "status": "active",
++ "visibility": "first-party",
++ "description": "Cancel a coding task started through codes.task.start that has not ended: POST /api/v1/tasks/:id/cancel on OpenVibe.Codes, as the service that started it, naming the same person in X-OV-Subject. Codes cancels the Run job; the task ends cancelled (an ended one is answered as it is).",
++ "inputSchema": "common.no-body@1",
++ "outputSchema": "codes.task@1",
++ "permissions": [
++ "codes:tasks:cancel"
++ ],
++ "resourceConstraints": [
++ "owner"
++ ],
++ "quotaClass": "codes-task-start",
++ "events": [],
++ "implementedBy": [
++ "POST /api/v1/tasks/:id/cancel"
++ ]
++}
ddiff --git a/manifests/capabilities/codes.task.read.json b/manifests/capabilities/codes.task.read.json
nnew file mode 100644
iindex 00000000..61d05119
---- /dev/null
++++ b/manifests/capabilities/codes.task.read.json
@@@ -0,0 +1,21 @@
++{
++ "id": "codes.task.read",
++ "version": "1.0",
++ "owner": "codes",
++ "status": "active",
++ "visibility": "first-party",
++ "description": "Read a coding task started through codes.task.start: GET /api/v1/tasks/:id on OpenVibe.Codes, as the service that started it, naming the same person in X-OV-Subject. Another service's task, or another person's, is 404.",
++ "inputSchema": "common.no-body@1",
++ "outputSchema": "codes.task@1",
++ "permissions": [
++ "codes:tasks:read"
++ ],
++ "resourceConstraints": [
++ "owner"
++ ],
++ "quotaClass": "codes-read",
++ "events": [],
++ "implementedBy": [
++ "GET /api/v1/tasks/:id"
++ ]
++}
ddiff --git a/manifests/capabilities/codes.task.start.json b/manifests/capabilities/codes.task.start.json
nnew file mode 100644
iindex 00000000..140d553c
---- /dev/null
++++ b/manifests/capabilities/codes.task.start.json
@@@ -0,0 +1,22 @@
++{
++ "id": "codes.task.start",
++ "version": "1.0",
++ "owner": "codes",
++ "status": "active",
++ "visibility": "first-party",
++ "sensitive": true,
++ "description": "Start a coding task for a person on their own machine: POST /api/v1/tasks on OpenVibe.Codes, as a first-party service naming the person in X-OV-Subject (OpenVibe.Actor routes coding work here, plan T17). Codes submits it to OpenVibe.Run as that person, in the project of their latest openvibe.codes/run task, and Run places it only on a machine of theirs (platform.resource-offer@1 owner). The person pays nothing to OpenVibe for it: the model use is on their own machine's keys.",
++ "inputSchema": "codes.task-start-request@1",
++ "outputSchema": "codes.task-start-result@1",
++ "permissions": [
++ "codes:tasks:start"
++ ],
++ "resourceConstraints": [
++ "owner"
++ ],
++ "quotaClass": "codes-task-start",
++ "events": [],
++ "implementedBy": [
++ "POST /api/v1/tasks"
++ ]
++}
ddiff --git a/manifests/services/codes.json b/manifests/services/codes.json
iindex b38608f0..ff6ebd7e 100644
---- a/manifests/services/codes.json
++++ b/manifests/services/codes.json
@@@ -26,7 +26,11 @@
"legalProfile": "ugc",
"position": 22
},
-- "capabilities": [],
++ "capabilities": [
++ "codes.task.start",
++ "codes.task.read",
++ "codes.task.cancel"
++ ],
"eventsProduced": [],
"eventsConsumed": [],
"namespacesOwned": [
ddiff --git a/package.json b/package.json
iindex 2b846d49..d6094de8 100644
---- a/package.json
++++ b/package.json
@@@ -1,6 +1,6 @@
{
"name": "openvibe-contracts",
-- "version": "0.161.0",
++ "version": "0.162.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",