openvibers/openvibe.contracts Commits

0.272.0: network.dock.timer.write, so a first-party service can set a person's Dock timer (#281)

OP OpenVibers committed 12 days ago · 5631a62b4c · 59 files, +655 −87

Plan L48 R2: Vibe starts the person's focus timer where they are, and it counts
down in the Dock's pill on every OpenVibe site.

The capability is active, first-party and owned by the Network. Its route
(PUT /api/v1/people/:subject/dock/timer) takes network.dock-timer-request@1
(the minutes, or clear: true) and answers network.dock-result@1. The service
names the person and writes the timer and nothing else.

Additive: no existing contract changes.

Changes

ddiff --git a/CHANGELOG.md b/CHANGELOG.md
iindex d353652b..e547b893 100644
---- a/CHANGELOG.md
++++ b/CHANGELOG.md
@@@ -1,5 +1,13 @@
# Changelog
++## 0.272.0 — 2026-11-01
++
++- **`network.dock.timer.write`** (active, first-party; plan L48 R2): a first-party service sets or clears ONE
++ person's Dock timer in the Network, so Vibe can start a focus timer where the person is
++ ("Vibe, start a 25-minute focus timer"). `PUT /api/v1/people/:subject/dock/timer` takes
++ `network.dock-timer-request@1` (the minutes, or `clear: true`) and answers `network.dock-result@1`. The
++ service names the person and writes the timer and nothing else. The first holder is OpenVibe.Chat.
++
## 0.271.0 — 2026-11-01
- **`network.dock-state@1`** gains an optional `timer` (plan L48 R2): a timer, a focus block or the break after one,
ddiff --git a/contracts/catalog.json b/contracts/catalog.json
iindex d04e8eb5..226a0ac7 100644
---- a/contracts/catalog.json
++++ b/contracts/catalog.json
@@@ -7907,6 +7907,15 @@
"compatibility": "backward",
"status": "active"
},
++ {
++ "id": "network.dock-timer-request",
++ "version": "1.0.0",
++ "owner": "network",
++ "schema": "network/dock-timer-request.v1.json",
++ "visibility": "first-party",
++ "compatibility": "backward",
++ "status": "active"
++ },
{
"id": "network.consent",
"version": "1.0.0",
ddiff --git a/contracts/network/dock-timer-request.v1.json b/contracts/network/dock-timer-request.v1.json
nnew file mode 100644
iindex 00000000..ddacc89d
---- /dev/null
++++ b/contracts/network/dock-timer-request.v1.json
@@@ -0,0 +1,39 @@
++{
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/network/dock-timer-request.v1.json",
++ "title": "NetworkDockTimerRequest",
++ "description": "network.dock-timer-request@1: the body of PUT /api/v1/people/:subject/dock/timer on OpenVibe.Network (network.dock.timer.write): a first-party service sets or clears ONE person's Dock timer. { minutes } starts one (1 to 180 minutes), { clear: true } stops it. The service writes the timer and nothing else: the rest of the person's Dock state is never touched.",
++ "type": "object",
++ "additionalProperties": false,
++ "properties": {
++ "minutes": {
++ "type": "integer",
++ "minimum": 1,
++ "maximum": 180,
++ "description": "How long the timer runs, in minutes."
++ },
++ "kind": {
++ "enum": ["timer", "focus"],
++ "description": "A plain timer (the default), or a focus block, which alternates a focus round and a break by itself."
++ },
++ "label": {
++ "type": "string",
++ "maxLength": 60,
++ "description": "What it is for, in the person's own words."
++ },
++ "rounds": {
++ "type": "integer",
++ "minimum": 1,
++ "maximum": 12,
++ "description": "How many focus rounds in all (a focus timer only; 4 by default)."
++ },
++ "clear": {
++ "type": "boolean",
++ "description": "true stops the timer: there is none afterwards."
++ }
++ },
++ "oneOf": [
++ { "required": ["minutes"] },
++ { "required": ["clear"], "properties": { "clear": { "const": true } } }
++ ]
++}
ddiff --git a/fixtures/network.dock-timer-request/invalid/both.json b/fixtures/network.dock-timer-request/invalid/both.json
nnew file mode 100644
iindex 00000000..afd45140
---- /dev/null
++++ b/fixtures/network.dock-timer-request/invalid/both.json
@@@ -0,0 +1,4 @@
++{
++ "minutes": 25,
++ "clear": true
++}
ddiff --git a/fixtures/network.dock-timer-request/invalid/empty.json b/fixtures/network.dock-timer-request/invalid/empty.json
nnew file mode 100644
iindex 00000000..0967ef42
---- /dev/null
++++ b/fixtures/network.dock-timer-request/invalid/empty.json
@@@ -0,0 +1 @@
++{}
ddiff --git a/fixtures/network.dock-timer-request/invalid/too-many-minutes.json b/fixtures/network.dock-timer-request/invalid/too-many-minutes.json
nnew file mode 100644
iindex 00000000..56ae8267
---- /dev/null
++++ b/fixtures/network.dock-timer-request/invalid/too-many-minutes.json
@@@ -0,0 +1,3 @@
++{
++ "minutes": 200
++}
ddiff --git a/fixtures/network.dock-timer-request/invalid/unknown-field.json b/fixtures/network.dock-timer-request/invalid/unknown-field.json
nnew file mode 100644
iindex 00000000..f8abc049
---- /dev/null
++++ b/fixtures/network.dock-timer-request/invalid/unknown-field.json
@@@ -0,0 +1,4 @@
++{
++ "minutes": 25,
++ "colour": "blue"
++}
ddiff --git a/fixtures/network.dock-timer-request/invalid/zero-minutes.json b/fixtures/network.dock-timer-request/invalid/zero-minutes.json
nnew file mode 100644
iindex 00000000..67708202
---- /dev/null
++++ b/fixtures/network.dock-timer-request/invalid/zero-minutes.json
@@@ -0,0 +1,3 @@
++{
++ "minutes": 0
++}
ddiff --git a/fixtures/network.dock-timer-request/valid/focus.json b/fixtures/network.dock-timer-request/valid/focus.json
nnew file mode 100644
iindex 00000000..db9a13dc
---- /dev/null
++++ b/fixtures/network.dock-timer-request/valid/focus.json
@@@ -0,0 +1,6 @@
++{
++ "minutes": 25,
++ "kind": "focus",
++ "label": "Write the post",
++ "rounds": 4
++}
ddiff --git a/fixtures/network.dock-timer-request/valid/plain.json b/fixtures/network.dock-timer-request/valid/plain.json
nnew file mode 100644
iindex 00000000..12e74d3a
---- /dev/null
++++ b/fixtures/network.dock-timer-request/valid/plain.json
@@@ -0,0 +1,3 @@
++{
++ "minutes": 10
++}
ddiff --git a/fixtures/network.dock-timer-request/valid/stop.json b/fixtures/network.dock-timer-request/valid/stop.json
nnew file mode 100644
iindex 00000000..b694ca07
---- /dev/null
++++ b/fixtures/network.dock-timer-request/valid/stop.json
@@@ -0,0 +1,3 @@
++{
++ "clear": true
++}
ddiff --git a/generated/json-schema/bundle.json b/generated/json-schema/bundle.json
iindex 0269729e..a600314d 100644
---- a/generated/json-schema/bundle.json
++++ b/generated/json-schema/bundle.json
@@@ -89154,6 +89154,66 @@
}
}
},
++ "network.dock-timer-request": {
++ "version": "1.0.0",
++ "owner": "network",
++ "status": "active",
++ "schema": {
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/network/dock-timer-request.v1.json",
++ "title": "NetworkDockTimerRequest",
++ "description": "network.dock-timer-request@1: the body of PUT /api/v1/people/:subject/dock/timer on OpenVibe.Network (network.dock.timer.write): a first-party service sets or clears ONE person's Dock timer. { minutes } starts one (1 to 180 minutes), { clear: true } stops it. The service writes the timer and nothing else: the rest of the person's Dock state is never touched.",
++ "type": "object",
++ "additionalProperties": false,
++ "properties": {
++ "minutes": {
++ "type": "integer",
++ "minimum": 1,
++ "maximum": 180,
++ "description": "How long the timer runs, in minutes."
++ },
++ "kind": {
++ "enum": [
++ "timer",
++ "focus"
++ ],
++ "description": "A plain timer (the default), or a focus block, which alternates a focus round and a break by itself."
++ },
++ "label": {
++ "type": "string",
++ "maxLength": 60,
++ "description": "What it is for, in the person's own words."
++ },
++ "rounds": {
++ "type": "integer",
++ "minimum": 1,
++ "maximum": 12,
++ "description": "How many focus rounds in all (a focus timer only; 4 by default)."
++ },
++ "clear": {
++ "type": "boolean",
++ "description": "true stops the timer: there is none afterwards."
++ }
++ },
++ "oneOf": [
++ {
++ "required": [
++ "minutes"
++ ]
++ },
++ {
++ "required": [
++ "clear"
++ ],
++ "properties": {
++ "clear": {
++ "const": true
++ }
++ }
++ }
++ ]
++ }
++ },
"network.consent": {
"version": "1.0.0",
"owner": "network",
ddiff --git a/generated/openapi/actor.json b/generated/openapi/actor.json
iindex e877190c..7584422b 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.271.0",
-- "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.271.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.272.0",
++ "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.272.0): each operation lists the capabilities it performs; a token for the 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 a444da38..43808778 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.271.0",
-- "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.271.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.272.0",
++ "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.272.0): each operation lists the capabilities it performs; a token for the 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 33bc88cf..4586ddb1 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.271.0",
-- "description": "Routes of OpenVibe.Bench as the OpenVibe contracts describe them (openvibe-contracts 0.271.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.272.0",
++ "description": "Routes of OpenVibe.Bench as the OpenVibe contracts describe them (openvibe-contracts 0.272.0): each operation lists the capabilities it performs; a token for the 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 f8a1cf1f..e52cd56b 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.271.0",
-- "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.271.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.272.0",
++ "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.272.0): each operation lists the capabilities it performs; a token for the 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 6cb93d42..351e6114 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.271.0",
-- "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.271.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.272.0",
++ "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.272.0): each operation lists the capabilities it performs; a token for the 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 637b9d03..b1b57795 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.271.0",
-- "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.271.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.272.0",
++ "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.272.0): each operation lists the capabilities it performs; a token for the 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 da975f00..0d32ad20 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.271.0",
-- "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.271.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.272.0",
++ "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.272.0): each operation lists the capabilities it performs; a token for the 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 1f87f17a..e08c1eb1 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.271.0",
-- "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.271.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.272.0",
++ "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.272.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/community.json b/generated/openapi/community.json
iindex 7c648c31..d7aa3144 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.271.0",
-- "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.271.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.272.0",
++ "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.272.0): each operation lists the capabilities it performs; a token for the 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 4f959e12..dec45292 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.271.0",
-- "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.271.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.272.0",
++ "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.272.0): each operation lists the capabilities it performs; a token for the 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 9dfe229e..035f8457 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.271.0",
-- "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.271.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.272.0",
++ "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.272.0): each operation lists the capabilities it performs; a token for the 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 7a04d87b..dc6caecc 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.271.0",
-- "description": "Routes of OpenVibe.Domains as the OpenVibe contracts describe them (openvibe-contracts 0.271.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.272.0",
++ "description": "Routes of OpenVibe.Domains as the OpenVibe contracts describe them (openvibe-contracts 0.272.0): each operation lists the capabilities it performs; a token for the 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 011c6e90..ba78fe2e 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.271.0",
-- "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.271.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.272.0",
++ "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.272.0): each operation lists the capabilities it performs; a token for the 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 efd8c4ae..045ee9de 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.271.0",
-- "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.271.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.272.0",
++ "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.272.0): each operation lists the capabilities it performs; a token for the 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 684576fd..a8c73eaa 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.271.0",
-- "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.271.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.272.0",
++ "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.272.0): each operation lists the capabilities it performs; a token for the 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 0d8f3201..ab1a6991 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.271.0",
-- "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.271.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.272.0",
++ "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.272.0): each operation lists the capabilities it performs; a token for the 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 08cb3d3f..6be0adfc 100644
---- a/generated/openapi/index.json
++++ b/generated/openapi/index.json
@@@ -145,8 +145,8 @@
"service": "network",
"name": "OpenVibe.Network",
"origin": "https://openvibe.network",
-- "operations": 54,
-- "capabilities": 34
++ "operations": 55,
++ "capabilities": 35
},
{
"service": "news",
ddiff --git a/generated/openapi/inventory.json b/generated/openapi/inventory.json
iindex 22ecdd77..f7e60ef2 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.271.0",
-- "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.271.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.272.0",
++ "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.272.0): each operation lists the capabilities it performs; a token for the 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 f5a67ff0..c4418ef8 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.271.0",
-- "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.271.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.272.0",
++ "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.272.0): each operation lists the capabilities it performs; a token for the 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 74f84768..4a3e8f34 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.271.0",
-- "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.271.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.272.0",
++ "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.272.0): each operation lists the capabilities it performs; a token for the 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 4ce17ae6..ccc2615f 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.271.0",
-- "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.271.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.272.0",
++ "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.272.0): each operation lists the capabilities it performs; a token for the 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 ff7789bd..d69cdd9c 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.271.0",
-- "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.271.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.272.0",
++ "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.272.0): each operation lists the capabilities it performs; a token for the 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"
@@@ -1078,6 +1078,72 @@
}
}
},
++ "/api/v1/people/{subject}/dock/timer": {
++ "put": {
++ "operationId": "put_api_v1_people_subject_dock_timer",
++ "summary": "Set or clear one person's Dock timer in the Network (plan L48 R2): a first-party service such as OpenVibe.Chat's Vibe starts the person's focus timer where they are, and it counts down in the Dock's p",
++ "description": "**network.dock.timer.write** (first-party): Set or clear one person's Dock timer in the Network (plan L48 R2): a first-party service such as OpenVibe.Chat's Vibe starts the person's focus timer where they are, and it counts down in the Dock's pill on every OpenVibe site. The service names the person (the path) and writes the timer and nothing else: the rest of their Dock state is never touched.",
++ "tags": [
++ "network.dock"
++ ],
++ "x-openvibe-capabilities": [
++ "network.dock.timer.write"
++ ],
++ "x-openvibe-visibility": [
++ "first-party"
++ ],
++ "x-openvibe-quota-class": "network-dock-write",
++ "security": [
++ {
++ "openvibeToken": [
++ "network.dock.timer.write"
++ ]
++ }
++ ],
++ "requestBody": {
++ "required": false,
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/network.dock-timer-request.v1"
++ }
++ }
++ }
++ },
++ "parameters": [
++ {
++ "name": "subject",
++ "in": "path",
++ "required": true,
++ "schema": {
++ "type": "string"
++ }
++ }
++ ],
++ "responses": {
++ "2XX": {
++ "description": "Success",
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/network.dock-result.v1"
++ }
++ }
++ }
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ }
++ },
"/api/v1/resources": {
"get": {
"operationId": "get_api_v1_resources",
@@@ -4900,6 +4966,309 @@
}
}
},
++ "network.dock-result.v1": {
++ "title": "NetworkDockResult",
++ "description": "network.dock-result@1 (the Dock plan 2026-10-30, K-D1): what GET /api/v1/me/dock answers on OpenVibe.Network — the person's Dock state, the counts the pill's status dot is drawn from, and whether those counts are complete.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "state",
++ "counts",
++ "sources_partial"
++ ],
++ "properties": {
++ "state": {
++ "$ref": "#/components/schemas/network.dock-state.v1",
++ "description": "The person's Dock state: the stored one, or the default when they have never opened the Dock."
++ },
++ "counts": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "running",
++ "waiting",
++ "unread"
++ ],
++ "properties": {
++ "running": {
++ "type": "integer",
++ "minimum": 0,
++ "description": "How many of the person's agents are running."
++ },
++ "waiting": {
++ "type": "integer",
++ "minimum": 0,
++ "description": "How many need the person."
++ },
++ "unread": {
++ "type": "integer",
++ "minimum": 0,
++ "description": "How many notifications the person has not read."
++ }
++ }
++ },
++ "sources_partial": {
++ "type": "boolean",
++ "description": "True when an authority behind the counts did not answer, so the counts are lower than the truth."
++ }
++ }
++ },
++ "network.dock-state.v1": {
++ "title": "NetworkDockState",
++ "description": "network.dock-state@1 (the Dock plan 2026-10-30, K-D1): the state of one person's Dock — the little floating surface every OpenVibe site draws. It lives in the Network, not in the browser, because localStorage is per site and the Dock follows the person across every domain. GET /api/v1/me/dock and PUT /api/v1/me/dock on OpenVibe.Network.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "open",
++ "tab",
++ "pinned",
++ "agent",
++ "chat",
++ "place",
++ "updated_at"
++ ],
++ "properties": {
++ "open": {
++ "type": "boolean",
++ "description": "Whether the Dock is open (a sheet on a phone, a floating card on a desktop) or collapsed to its pill."
++ },
++ "tab": {
++ "enum": [
++ "vibe",
++ "agent",
++ "chats",
++ "activity"
++ ],
++ "description": "Which of the Dock's tabs shows: Vibe (the person's AI, plan L48 V2), the agents, the chats, the activity."
++ },
++ "pinned": {
++ "type": "boolean",
++ "description": "Keep the pill on screen even when nothing runs and nothing waits."
++ },
++ "agent": {
++ "type": [
++ "object",
++ "null"
++ ],
++ "additionalProperties": false,
++ "required": [
++ "service",
++ "id"
++ ],
++ "properties": {
++ "service": {
++ "enum": [
++ "actor",
++ "codes",
++ "run",
++ "desks"
++ ]
++ },
++ "id": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 80
++ }
++ },
++ "description": "The agent the Agent tab follows, or null when it follows none."
++ },
++ "chat": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "minLength": 1,
++ "maxLength": 80,
++ "description": "The conversation the Chats tab has open, or null."
++ },
++ "timer": {
++ "description": "The person's timer (plan L48 R2): it counts down in the Dock's pill on every site and rings at its end. Absent or null: none. A focus timer of rounds alternates focus and break by itself.",
++ "oneOf": [
++ {
++ "type": "null"
++ },
++ {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "kind",
++ "started_at",
++ "ends_at"
++ ],
++ "properties": {
++ "kind": {
++ "enum": [
++ "timer",
++ "focus",
++ "break"
++ ],
++ "description": "A plain timer, a focus block, or the break after one."
++ },
++ "label": {
++ "type": "string",
++ "maxLength": 60,
++ "description": "What it is for, in the person's words."
++ },
++ "started_at": {
++ "type": "string",
++ "format": "date-time"
++ },
++ "ends_at": {
++ "type": "string",
++ "format": "date-time"
++ },
++ "round": {
++ "type": "integer",
++ "minimum": 1,
++ "maximum": 12,
++ "description": "Which focus round this is."
++ },
++ "rounds": {
++ "type": "integer",
++ "minimum": 1,
++ "maximum": 12,
++ "description": "How many focus rounds in all."
++ },
++ "focus_min": {
++ "type": "integer",
++ "minimum": 1,
++ "maximum": 180,
++ "description": "A focus round's length, in minutes."
++ },
++ "break_min": {
++ "type": "integer",
++ "minimum": 1,
++ "maximum": 60,
++ "description": "A break's length, in minutes."
++ }
++ }
++ }
++ ]
++ },
++ "place": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "phone",
++ "desktop"
++ ],
++ "properties": {
++ "phone": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "corner"
++ ],
++ "properties": {
++ "corner": {
++ "enum": [
++ "bottom-right",
++ "bottom-left",
++ "top-right",
++ "top-left"
++ ]
++ }
++ },
++ "description": "Where the Dock sits on a phone."
++ },
++ "desktop": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "corner",
++ "width",
++ "height"
++ ],
++ "properties": {
++ "corner": {
++ "enum": [
++ "bottom-right",
++ "bottom-left",
++ "top-right",
++ "top-left"
++ ]
++ },
++ "width": {
++ "type": [
++ "integer",
++ "null"
++ ],
++ "minimum": 320,
++ "maximum": 720
++ },
++ "height": {
++ "type": [
++ "integer",
++ "null"
++ ],
++ "minimum": 360,
++ "maximum": 900
++ }
++ },
++ "description": "Where the Dock sits on a desktop, and how big it is (null: the site's own default size)."
++ }
++ }
++ },
++ "updated_at": {
++ "type": "string",
++ "format": "date-time",
++ "description": "When the state was last written."
++ }
++ }
++ },
++ "network.dock-timer-request.v1": {
++ "title": "NetworkDockTimerRequest",
++ "description": "network.dock-timer-request@1: the body of PUT /api/v1/people/:subject/dock/timer on OpenVibe.Network (network.dock.timer.write): a first-party service sets or clears ONE person's Dock timer. { minutes } starts one (1 to 180 minutes), { clear: true } stops it. The service writes the timer and nothing else: the rest of the person's Dock state is never touched.",
++ "type": "object",
++ "additionalProperties": false,
++ "properties": {
++ "minutes": {
++ "type": "integer",
++ "minimum": 1,
++ "maximum": 180,
++ "description": "How long the timer runs, in minutes."
++ },
++ "kind": {
++ "enum": [
++ "timer",
++ "focus"
++ ],
++ "description": "A plain timer (the default), or a focus block, which alternates a focus round and a break by itself."
++ },
++ "label": {
++ "type": "string",
++ "maxLength": 60,
++ "description": "What it is for, in the person's own words."
++ },
++ "rounds": {
++ "type": "integer",
++ "minimum": 1,
++ "maximum": 12,
++ "description": "How many focus rounds in all (a focus timer only; 4 by default)."
++ },
++ "clear": {
++ "type": "boolean",
++ "description": "true stops the timer: there is none afterwards."
++ }
++ },
++ "oneOf": [
++ {
++ "required": [
++ "minutes"
++ ]
++ },
++ {
++ "required": [
++ "clear"
++ ],
++ "properties": {
++ "clear": {
++ "const": true
++ }
++ }
++ }
++ ]
++ },
"network.follow-list-result.v1": {
"title": "NetworkFollowListResult",
"description": "network.follow-list-result@1 (ADR-030): a page of follows on OpenVibe.Network, newest first. GET /api/v1/me/follows (what the caller follows), GET /api/v1/follows/:type/:target/followers (who follows a target: the target's owner, or a service with network.follows.read). Lists are never public; counts are.",
ddiff --git a/generated/openapi/news.json b/generated/openapi/news.json
iindex 42e5cede..02d63bc1 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.271.0",
-- "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.271.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.272.0",
++ "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.272.0): each operation lists the capabilities it performs; a token for the 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 e3b9dc74..dd36b841 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.271.0",
-- "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.271.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.272.0",
++ "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.272.0): each operation lists the capabilities it performs; a token for the 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 845b30eb..9a98211c 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.271.0",
-- "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.271.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.272.0",
++ "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.272.0): each operation lists the capabilities it performs; a token for the 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 bbc8280e..1175200c 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.271.0",
-- "description": "Routes of OpenVibe.Quest as the OpenVibe contracts describe them (openvibe-contracts 0.271.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.272.0",
++ "description": "Routes of OpenVibe.Quest as the OpenVibe contracts describe them (openvibe-contracts 0.272.0): each operation lists the capabilities it performs; a token for the 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 0d7918e9..dc3dd481 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.271.0",
-- "description": "Routes of OpenVibe.Report as the OpenVibe contracts describe them (openvibe-contracts 0.271.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.272.0",
++ "description": "Routes of OpenVibe.Report as the OpenVibe contracts describe them (openvibe-contracts 0.272.0): each operation lists the capabilities it performs; a token for the 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 6f4eeb61..5658b28d 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.271.0",
-- "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.271.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.272.0",
++ "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.272.0): each operation lists the capabilities it performs; a token for the 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 a0d69188..7de66ec0 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.271.0",
-- "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.271.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.272.0",
++ "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.272.0): each operation lists the capabilities it performs; a token for the 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 ce50518d..feb4c192 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.271.0",
-- "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.271.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.272.0",
++ "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.272.0): each operation lists the capabilities it performs; a token for the 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 1d114e22..ad8f960e 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.271.0",
-- "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.271.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.272.0",
++ "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.272.0): each operation lists the capabilities it performs; a token for the 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 f05e87c0..873eb58e 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.271.0",
-- "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.271.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.272.0",
++ "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.272.0): each operation lists the capabilities it performs; a token for the 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 03d8cf46..f4579e8f 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.271.0",
-- "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.271.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.272.0",
++ "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.272.0): each operation lists the capabilities it performs; a token for the 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 2e58f041..623f41d7 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.271.0",
-- "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.271.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.272.0",
++ "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.272.0): each operation lists the capabilities it performs; a token for the 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 3e833c31..f78e375c 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.271.0",
-- "description": "Routes of OpenVibe.Today as the OpenVibe contracts describe them (openvibe-contracts 0.271.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.272.0",
++ "description": "Routes of OpenVibe.Today as the OpenVibe contracts describe them (openvibe-contracts 0.272.0): each operation lists the capabilities it performs; a token for the 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 fe1c4f59..0ad2aee0 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.271.0",
-- "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.271.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.272.0",
++ "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.272.0): each operation lists the capabilities it performs; a token for the 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 89477bb1..7c1b6ad5 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.271.0",
-- "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.271.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.272.0",
++ "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.272.0): each operation lists the capabilities it performs; a token for the 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 981818bc..3e101238 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.271.0",
-- "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.271.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.272.0",
++ "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.272.0): each operation lists the capabilities it performs; a token for the 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 9ab0c129..f4b67e7f 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.271.0",
-- "description": "Routes of OpenVibe.Vision as the OpenVibe contracts describe them (openvibe-contracts 0.271.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.272.0",
++ "description": "Routes of OpenVibe.Vision as the OpenVibe contracts describe them (openvibe-contracts 0.272.0): each operation lists the capabilities it performs; a token for the 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 5c8fb514..c2cbe420 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.271.0",
-- "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.271.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.272.0",
++ "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.272.0): each operation lists the capabilities it performs; a token for the 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 23b36831..a623aa0c 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.271.0",
-- "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.271.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.272.0",
++ "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.272.0): each operation lists the capabilities it performs; a token for the 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 4f4b69de..729f3dfb 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.271.0",
-- "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.271.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.272.0",
++ "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.272.0): each operation lists the capabilities it performs; a token for the 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 2adc93f0..0454739e 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.271.0",
-- "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.271.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.272.0",
++ "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.272.0): each operation lists the capabilities it performs; a token for the 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 17d3e8ee..8d568796 100644
---- a/generated/typescript/index.d.ts
++++ b/generated/typescript/index.d.ts
@@@ -264537,6 +264537,40 @@ export interface NetworkDockResult {
sources_partial: boolean;
}
++/** [email protected] (owner: network) */
++/**
++ * network.dock-timer-request@1: the body of PUT /api/v1/people/:subject/dock/timer on OpenVibe.Network (network.dock.timer.write): a first-party service sets or clears ONE person's Dock timer. { minutes } starts one (1 to 180 minutes), { clear: true } stops it. The service writes the timer and nothing else: the rest of the person's Dock state is never touched.
++ */
++export type NetworkDockTimerRequest = {
++ /**
++ * How long the timer runs, in minutes.
++ */
++ minutes?: number;
++ /**
++ * A plain timer (the default), or a focus block, which alternates a focus round and a break by itself.
++ */
++ kind?: "timer" | "focus";
++ /**
++ * What it is for, in the person's own words.
++ */
++ label?: string;
++ /**
++ * How many focus rounds in all (a focus timer only; 4 by default).
++ */
++ rounds?: number;
++ /**
++ * true stops the timer: there is none afterwards.
++ */
++ clear?: boolean;
++} & (
++ | {
++ [k: string]: unknown | undefined;
++ }
++ | {
++ clear: true;
++ }
++);
++
/** [email protected] (owner: network) */
/**
* network.consent@1 (L24, data and AI by consent, 2026-10-31): one person's choice for one purpose. Nothing a person makes is off-limits to AI or data use by design; each use is off until that person turns it on, here. The record is the proof of what was allowed, by whom, under which wording and when: a choice is turned off by setting revoked_at, never by deleting the row. Stored by OpenVibe.Network (consents, with every change in consent_events), read by a person at GET /api/v1/me/consent and by services through POST /internal/consent/check (capability network.consent.read). A service that cannot reach Network treats every purpose as off.
ddiff --git a/manifests/capabilities/network.dock.timer.write.json b/manifests/capabilities/network.dock.timer.write.json
nnew file mode 100644
iindex 00000000..63fcbd01
---- /dev/null
++++ b/manifests/capabilities/network.dock.timer.write.json
@@@ -0,0 +1,21 @@
++{
++ "id": "network.dock.timer.write",
++ "version": "1.0",
++ "owner": "network",
++ "status": "active",
++ "visibility": "first-party",
++ "description": "Set or clear one person's Dock timer in the Network (plan L48 R2): a first-party service such as OpenVibe.Chat's Vibe starts the person's focus timer where they are, and it counts down in the Dock's pill on every OpenVibe site. The service names the person (the path) and writes the timer and nothing else: the rest of their Dock state is never touched.",
++ "permissions": [
++ "network:dock"
++ ],
++ "resourceConstraints": [
++ "owner"
++ ],
++ "quotaClass": "network-dock-write",
++ "events": [],
++ "implementedBy": [
++ "PUT /api/v1/people/:subject/dock/timer"
++ ],
++ "inputSchema": "network.dock-timer-request@1",
++ "outputSchema": "network.dock-result@1"
++}
ddiff --git a/manifests/services/network.json b/manifests/services/network.json
iindex 2f6b39e8..b6c8d20a 100644
---- a/manifests/services/network.json
++++ b/manifests/services/network.json
@@@ -59,6 +59,7 @@
"network.coins.read",
"network.coins.transfer",
"network.confirmation.manage",
++ "network.dock.timer.write",
"network.follows.read",
"network.follows.write",
"network.integration.github.read",
ddiff --git a/package.json b/package.json
iindex 44194efb..cc6355a6 100644
---- a/package.json
++++ b/package.json
@@@ -1,6 +1,6 @@
{
"name": "openvibe-contracts",
-- "version": "0.271.0",
++ "version": "0.272.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",