openvibers/openvibe.contracts Commits

0.267.0: today.reminder.write, so a first-party service (Vibe) can set a person's reminders (#276)

OP OpenVibers committed 12 days ago · 6b26ba0c9f · 61 files, +1151 −86

Changes

ddiff --git a/CHANGELOG.md b/CHANGELOG.md
iindex 84f65fa0..75fdf7e8 100644
---- a/CHANGELOG.md
++++ b/CHANGELOG.md
@@@ -1,5 +1,12 @@
# Changelog
++## 0.267.0 — 2026-11-01
++
++- `today.reminder.write` (active, first-party; plan L48): a first-party service sets, lists, snoozes, stops and removes a
++ person's own reminders on OpenVibe.Today for that person, named with X-OV-Subject (`POST /api/v1/reminders/parse`,
++ `GET|POST /api/v1/reminders`, `POST /api/v1/reminders/:id/done|snooze`, `DELETE /api/v1/reminders/:id`). The first
++ holder is OpenVibe.Chat, for Vibe's "remind me…".
++
## 0.266.0 — 2026-10-31
- **`space.app.claimed`** (plan 5.9, OpenVibe.Space): a guest draft (a space with no owner, edited with a secret
ddiff --git a/contracts/catalog.json b/contracts/catalog.json
iindex b01e38e6..16c8e5a2 100644
---- a/contracts/catalog.json
++++ b/contracts/catalog.json
@@@ -8599,6 +8599,24 @@
"visibility": "first-party",
"compatibility": "backward",
"status": "active"
++ },
++ {
++ "id": "today.reminder-request",
++ "version": "1.0.0",
++ "owner": "today",
++ "schema": "today/reminder-request.v1.json",
++ "visibility": "first-party",
++ "compatibility": "backward",
++ "status": "active"
++ },
++ {
++ "id": "today.reminder-result",
++ "version": "1.0.0",
++ "owner": "today",
++ "schema": "today/reminder-result.v1.json",
++ "visibility": "first-party",
++ "compatibility": "backward",
++ "status": "active"
}
]
}
ddiff --git a/contracts/today/reminder-request.v1.json b/contracts/today/reminder-request.v1.json
nnew file mode 100644
iindex 00000000..dd95750a
---- /dev/null
++++ b/contracts/today/reminder-request.v1.json
@@@ -0,0 +1,15 @@
++{
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/today/reminder-request.v1.json",
++ "title": "TodayReminderRequest",
++ "description": "today.reminder-request@1: the body of POST /api/v1/reminders and POST /api/v1/reminders/parse on OpenVibe.Today (today.reminder.write; the acting person). The reminder is plain words, parsed by Today into a rule in the person's time zone (\"stretch every 2 hours from 9 to 5\", \"take my meds every day at 9 am and 9 pm\", \"pay rent on the 1st of every month\"). POST /api/v1/reminders/:id/snooze takes { minutes } alone.",
++ "type": "object",
++ "additionalProperties": false,
++ "properties": {
++ "text": { "type": "string", "minLength": 1, "maxLength": 500, "description": "What to remind the person of, and when, in their own words." },
++ "tz": { "type": "string", "maxLength": 64, "description": "The person's IANA time zone (America/Chicago); an unknown zone is read as UTC." },
++ "url": { "type": ["string", "null"], "maxLength": 2000, "description": "Where the reminder came from: an https link kept on it and opened from the notification. Anything else is dropped." },
++ "source": { "type": "string", "pattern": "^[a-z][a-z0-9-]{1,30}$", "description": "The site that set it (vibe, live, work…), shown to the person." },
++ "minutes": { "type": "integer", "minimum": 5, "maximum": 10080, "description": "Snooze only: how long, from now." }
++ }
++}
ddiff --git a/contracts/today/reminder-result.v1.json b/contracts/today/reminder-result.v1.json
nnew file mode 100644
iindex 00000000..5096d650
---- /dev/null
++++ b/contracts/today/reminder-result.v1.json
@@@ -0,0 +1,37 @@
++{
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/today/reminder-result.v1.json",
++ "title": "TodayReminderResult",
++ "description": "today.reminder-result@1: answers of the reminder routes on OpenVibe.Today. POST /api/v1/reminders/parse → a preview (title, rule, tz, next_at, summary); POST /api/v1/reminders, /:id/done and /:id/snooze → one reminder; GET /api/v1/reminders → { reminders }. A refusal is 422 { error } in words the person can act on (\"Say when: …\").",
++ "type": "object",
++ "properties": {
++ "reminders": { "type": "array", "items": { "$ref": "#/$defs/reminder" } },
++ "id": { "type": "string", "pattern": "^rem_[0-9A-HJKMNP-TV-Z]{26}$" },
++ "title": { "type": "string" },
++ "summary": { "type": "string", "description": "The rule in words: \"Every 2 hours, 9 am–5 pm\"." },
++ "next_at": { "type": ["string", "null"], "format": "date-time" },
++ "error": { "type": "string" }
++ },
++ "$defs": {
++ "reminder": {
++ "type": "object",
++ "required": ["id", "title", "summary", "status", "next_at", "repeats"],
++ "properties": {
++ "id": { "type": "string", "pattern": "^rem_[0-9A-HJKMNP-TV-Z]{26}$" },
++ "title": { "type": "string" },
++ "said": { "type": "string" },
++ "rule": { "type": "object", "description": "once { at } | daily { times, days? } | interval { minutes, from?, to?, days?, start? } | monthly { day, time }" },
++ "tz": { "type": "string" },
++ "url": { "type": ["string", "null"] },
++ "source": { "type": "string" },
++ "status": { "enum": ["active", "done"] },
++ "next_at": { "type": ["string", "null"], "format": "date-time" },
++ "last_sent_at": { "type": ["string", "null"], "format": "date-time" },
++ "sent_count": { "type": "integer", "minimum": 0 },
++ "summary": { "type": "string" },
++ "repeats": { "type": "boolean" },
++ "created_at": { "type": ["string", "null"], "format": "date-time" }
++ }
++ }
++ }
++}
ddiff --git a/fixtures/today.reminder-request/invalid/snooze-too-short.json b/fixtures/today.reminder-request/invalid/snooze-too-short.json
nnew file mode 100644
iindex 00000000..3315a74b
---- /dev/null
++++ b/fixtures/today.reminder-request/invalid/snooze-too-short.json
@@@ -0,0 +1 @@
++{ "minutes": 1 }
ddiff --git a/fixtures/today.reminder-request/invalid/unknown-field.json b/fixtures/today.reminder-request/invalid/unknown-field.json
nnew file mode 100644
iindex 00000000..883b183a
---- /dev/null
++++ b/fixtures/today.reminder-request/invalid/unknown-field.json
@@@ -0,0 +1 @@
++{ "text": "water the plants every evening", "subject": "usr_01J8Z3Q4R5S6T7V8W9X0Y1Z2N1" }
ddiff --git a/fixtures/today.reminder-request/valid/from-vibe.json b/fixtures/today.reminder-request/valid/from-vibe.json
nnew file mode 100644
iindex 00000000..c00cd52f
---- /dev/null
++++ b/fixtures/today.reminder-request/valid/from-vibe.json
@@@ -0,0 +1 @@
++{ "text": "remind me to call mom on Sunday at 6pm", "tz": "Europe/Berlin", "url": "https://openvibe.chat/vibe", "source": "vibe" }
ddiff --git a/fixtures/today.reminder-request/valid/plain-words.json b/fixtures/today.reminder-request/valid/plain-words.json
nnew file mode 100644
iindex 00000000..eb841d14
---- /dev/null
++++ b/fixtures/today.reminder-request/valid/plain-words.json
@@@ -0,0 +1 @@
++{ "text": "stretch every 2 hours from 9 to 5", "tz": "America/Chicago" }
ddiff --git a/fixtures/today.reminder-request/valid/snooze.json b/fixtures/today.reminder-request/valid/snooze.json
nnew file mode 100644
iindex 00000000..dd43164d
---- /dev/null
++++ b/fixtures/today.reminder-request/valid/snooze.json
@@@ -0,0 +1 @@
++{ "minutes": 60 }
ddiff --git a/fixtures/today.reminder-result/invalid/bad-status.json b/fixtures/today.reminder-result/invalid/bad-status.json
nnew file mode 100644
iindex 00000000..57e74862
---- /dev/null
++++ b/fixtures/today.reminder-result/invalid/bad-status.json
@@@ -0,0 +1 @@
++{ "reminders": [ { "id": "rem_01J8Z3Q4R5S6T7V8W9X0Y1Z2N1", "title": "Stretch", "summary": "Every 2 hours", "status": "paused", "next_at": null, "repeats": true } ] }
ddiff --git a/fixtures/today.reminder-result/valid/list.json b/fixtures/today.reminder-result/valid/list.json
nnew file mode 100644
iindex 00000000..4737ee93
---- /dev/null
++++ b/fixtures/today.reminder-result/valid/list.json
@@@ -0,0 +1 @@
++{ "reminders": [ { "id": "rem_01J8Z3Q4R5S6T7V8W9X0Y1Z2N1", "title": "Stretch", "said": "stretch every 2 hours from 9 to 5", "rule": { "kind": "interval", "minutes": 120, "from": "09:00", "to": "17:00" }, "tz": "America/Chicago", "url": null, "source": "today", "status": "active", "next_at": "2026-11-02T15:00:00.000Z", "last_sent_at": null, "sent_count": 0, "summary": "Every 2 hours, 9 am–5 pm", "repeats": true, "created_at": "2026-11-01T22:00:00.000Z" } ] }
ddiff --git a/fixtures/today.reminder-result/valid/refused.json b/fixtures/today.reminder-result/valid/refused.json
nnew file mode 100644
iindex 00000000..785fe40f
---- /dev/null
++++ b/fixtures/today.reminder-result/valid/refused.json
@@@ -0,0 +1 @@
++{ "error": "Say when: \"at 3pm\", \"tomorrow morning\", \"every day at 9\" or \"in 20 minutes\"." }
ddiff --git a/generated/json-schema/bundle.json b/generated/json-schema/bundle.json
iindex aea55d71..b4f69fba 100644
---- a/generated/json-schema/bundle.json
++++ b/generated/json-schema/bundle.json
@@@ -96240,6 +96240,170 @@
}
}
}
++ },
++ "today.reminder-request": {
++ "version": "1.0.0",
++ "owner": "today",
++ "status": "active",
++ "schema": {
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/today/reminder-request.v1.json",
++ "title": "TodayReminderRequest",
++ "description": "today.reminder-request@1: the body of POST /api/v1/reminders and POST /api/v1/reminders/parse on OpenVibe.Today (today.reminder.write; the acting person). The reminder is plain words, parsed by Today into a rule in the person's time zone (\"stretch every 2 hours from 9 to 5\", \"take my meds every day at 9 am and 9 pm\", \"pay rent on the 1st of every month\"). POST /api/v1/reminders/:id/snooze takes { minutes } alone.",
++ "type": "object",
++ "additionalProperties": false,
++ "properties": {
++ "text": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 500,
++ "description": "What to remind the person of, and when, in their own words."
++ },
++ "tz": {
++ "type": "string",
++ "maxLength": 64,
++ "description": "The person's IANA time zone (America/Chicago); an unknown zone is read as UTC."
++ },
++ "url": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "maxLength": 2000,
++ "description": "Where the reminder came from: an https link kept on it and opened from the notification. Anything else is dropped."
++ },
++ "source": {
++ "type": "string",
++ "pattern": "^[a-z][a-z0-9-]{1,30}$",
++ "description": "The site that set it (vibe, live, work…), shown to the person."
++ },
++ "minutes": {
++ "type": "integer",
++ "minimum": 5,
++ "maximum": 10080,
++ "description": "Snooze only: how long, from now."
++ }
++ }
++ }
++ },
++ "today.reminder-result": {
++ "version": "1.0.0",
++ "owner": "today",
++ "status": "active",
++ "schema": {
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/today/reminder-result.v1.json",
++ "title": "TodayReminderResult",
++ "description": "today.reminder-result@1: answers of the reminder routes on OpenVibe.Today. POST /api/v1/reminders/parse → a preview (title, rule, tz, next_at, summary); POST /api/v1/reminders, /:id/done and /:id/snooze → one reminder; GET /api/v1/reminders → { reminders }. A refusal is 422 { error } in words the person can act on (\"Say when: …\").",
++ "type": "object",
++ "properties": {
++ "reminders": {
++ "type": "array",
++ "items": {
++ "$ref": "#/$defs/reminder"
++ }
++ },
++ "id": {
++ "type": "string",
++ "pattern": "^rem_[0-9A-HJKMNP-TV-Z]{26}$"
++ },
++ "title": {
++ "type": "string"
++ },
++ "summary": {
++ "type": "string",
++ "description": "The rule in words: \"Every 2 hours, 9 am–5 pm\"."
++ },
++ "next_at": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "format": "date-time"
++ },
++ "error": {
++ "type": "string"
++ }
++ },
++ "$defs": {
++ "reminder": {
++ "type": "object",
++ "required": [
++ "id",
++ "title",
++ "summary",
++ "status",
++ "next_at",
++ "repeats"
++ ],
++ "properties": {
++ "id": {
++ "type": "string",
++ "pattern": "^rem_[0-9A-HJKMNP-TV-Z]{26}$"
++ },
++ "title": {
++ "type": "string"
++ },
++ "said": {
++ "type": "string"
++ },
++ "rule": {
++ "type": "object",
++ "description": "once { at } | daily { times, days? } | interval { minutes, from?, to?, days?, start? } | monthly { day, time }"
++ },
++ "tz": {
++ "type": "string"
++ },
++ "url": {
++ "type": [
++ "string",
++ "null"
++ ]
++ },
++ "source": {
++ "type": "string"
++ },
++ "status": {
++ "enum": [
++ "active",
++ "done"
++ ]
++ },
++ "next_at": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "format": "date-time"
++ },
++ "last_sent_at": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "format": "date-time"
++ },
++ "sent_count": {
++ "type": "integer",
++ "minimum": 0
++ },
++ "summary": {
++ "type": "string"
++ },
++ "repeats": {
++ "type": "boolean"
++ },
++ "created_at": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "format": "date-time"
++ }
++ }
++ }
++ }
++ }
}
}
}
ddiff --git a/generated/openapi/actor.json b/generated/openapi/actor.json
iindex acb67680..41309113 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.266.0",
-- "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.266.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.267.0",
++ "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.267.0): each operation lists the capabilities it performs; a token for the 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 f27b9752..cd8cd975 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.266.0",
-- "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.266.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.267.0",
++ "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.267.0): each operation lists the capabilities it performs; a token for the 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 82ef82eb..c3c4c915 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.266.0",
-- "description": "Routes of OpenVibe.Bench as the OpenVibe contracts describe them (openvibe-contracts 0.266.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.267.0",
++ "description": "Routes of OpenVibe.Bench as the OpenVibe contracts describe them (openvibe-contracts 0.267.0): each operation lists the capabilities it performs; a token for the 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 93976596..f804c7b7 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.266.0",
-- "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.266.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.267.0",
++ "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.267.0): each operation lists the capabilities it performs; a token for the 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 058be6d4..8a06aec0 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.266.0",
-- "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.266.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.267.0",
++ "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.267.0): each operation lists the capabilities it performs; a token for the 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 a02b6839..b11d4b37 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.266.0",
-- "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.266.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.267.0",
++ "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.267.0): each operation lists the capabilities it performs; a token for the 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 59b39ad7..7d445b14 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.266.0",
-- "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.266.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.267.0",
++ "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.267.0): each operation lists the capabilities it performs; a token for the 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 46fffa9a..86250d18 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.266.0",
-- "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.266.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.267.0",
++ "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.267.0): each operation lists the capabilities it performs; a token for the 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 ebd20249..55ee8527 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.266.0",
-- "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.266.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.267.0",
++ "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.267.0): each operation lists the capabilities it performs; a token for the 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 67e182eb..4e45f11a 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.266.0",
-- "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.266.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.267.0",
++ "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.267.0): each operation lists the capabilities it performs; a token for the 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 b1b0b2df..4ccf2a90 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.266.0",
-- "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.266.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.267.0",
++ "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.267.0): each operation lists the capabilities it performs; a token for the 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 cc6a7208..0ae89016 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.266.0",
-- "description": "Routes of OpenVibe.Domains as the OpenVibe contracts describe them (openvibe-contracts 0.266.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.267.0",
++ "description": "Routes of OpenVibe.Domains as the OpenVibe contracts describe them (openvibe-contracts 0.267.0): each operation lists the capabilities it performs; a token for the 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 d96c5f15..c35c47e9 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.266.0",
-- "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.266.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.267.0",
++ "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.267.0): each operation lists the capabilities it performs; a token for the 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 0de70866..5810e355 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.266.0",
-- "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.266.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.267.0",
++ "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.267.0): each operation lists the capabilities it performs; a token for the 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 a504b9c0..86c4f532 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.266.0",
-- "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.266.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.267.0",
++ "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.267.0): each operation lists the capabilities it performs; a token for the 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 934841a0..71f42232 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.266.0",
-- "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.266.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.267.0",
++ "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.267.0): each operation lists the capabilities it performs; a token for the 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 22c42bbc..ba2de9b7 100644
---- a/generated/openapi/index.json
++++ b/generated/openapi/index.json
@@@ -232,6 +232,13 @@
"operations": 27,
"capabilities": 19
},
++ {
++ "service": "today",
++ "name": "OpenVibe.Today",
++ "origin": "https://openvibe.today",
++ "operations": 6,
++ "capabilities": 1
++ },
{
"service": "tools",
"name": "OpenVibe.Tools",
ddiff --git a/generated/openapi/inventory.json b/generated/openapi/inventory.json
iindex 9fe7b8ed..1bd1db11 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.266.0",
-- "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.266.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.267.0",
++ "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.267.0): each operation lists the capabilities it performs; a token for the 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 209b0dde..7508f83a 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.266.0",
-- "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.266.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.267.0",
++ "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.267.0): each operation lists the capabilities it performs; a token for the 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 a4593750..45ea430a 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.266.0",
-- "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.266.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.267.0",
++ "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.267.0): each operation lists the capabilities it performs; a token for the 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 eda05fad..409233cd 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.266.0",
-- "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.266.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.267.0",
++ "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.267.0): each operation lists the capabilities it performs; a token for the 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 4895c8a5..733d2fae 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.266.0",
-- "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.266.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.267.0",
++ "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.267.0): each operation lists the capabilities it performs; a token for the 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 cd776934..f127e59e 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.266.0",
-- "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.266.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.267.0",
++ "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.267.0): each operation lists the capabilities it performs; a token for the 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 6951c258..f354e55a 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.266.0",
-- "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.266.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.267.0",
++ "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.267.0): each operation lists the capabilities it performs; a token for the 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 87ce36d2..de49e9df 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.266.0",
-- "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.266.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.267.0",
++ "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.267.0): each operation lists the capabilities it performs; a token for the 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 b5729740..a159b966 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.266.0",
-- "description": "Routes of OpenVibe.Quest as the OpenVibe contracts describe them (openvibe-contracts 0.266.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.267.0",
++ "description": "Routes of OpenVibe.Quest as the OpenVibe contracts describe them (openvibe-contracts 0.267.0): each operation lists the capabilities it performs; a token for the 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 ab607c1c..6e1c9fe5 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.266.0",
-- "description": "Routes of OpenVibe.Report as the OpenVibe contracts describe them (openvibe-contracts 0.266.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.267.0",
++ "description": "Routes of OpenVibe.Report as the OpenVibe contracts describe them (openvibe-contracts 0.267.0): each operation lists the capabilities it performs; a token for the 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 117fb67d..bf224169 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.266.0",
-- "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.266.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.267.0",
++ "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.267.0): each operation lists the capabilities it performs; a token for the 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 7cce737e..999e76f1 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.266.0",
-- "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.266.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.267.0",
++ "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.267.0): each operation lists the capabilities it performs; a token for the 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 5fb5e800..932d96a7 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.266.0",
-- "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.266.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.267.0",
++ "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.267.0): each operation lists the capabilities it performs; a token for the 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 bd00e2d7..ccfa302f 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.266.0",
-- "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.266.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.267.0",
++ "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.267.0): each operation lists the capabilities it performs; a token for the 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 ba960850..68c6fa36 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.266.0",
-- "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.266.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.267.0",
++ "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.267.0): each operation lists the capabilities it performs; a token for the 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 ad089bd8..45cc87f4 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.266.0",
-- "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.266.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.267.0",
++ "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.267.0): each operation lists the capabilities it performs; a token for the 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 3d29f9bc..94f8f45e 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.266.0",
-- "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.266.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.267.0",
++ "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.267.0): each operation lists the capabilities it performs; a token for the 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
nnew file mode 100644
iindex 00000000..47d84fcf
---- /dev/null
++++ b/generated/openapi/today.json
@@@ -0,0 +1,720 @@
++{
++ "openapi": "3.1.0",
++ "jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
++ "info": {
++ "title": "OpenVibe.Today API",
++ "version": "0.267.0",
++ "description": "Routes of OpenVibe.Today as the OpenVibe contracts describe them (openvibe-contracts 0.267.0): each operation lists the capabilities it performs; a token for the 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.today"
++ }
++ ],
++ "paths": {
++ "/api/v1/reminders": {
++ "get": {
++ "operationId": "get_api_v1_reminders",
++ "summary": "Set, list, snooze, stop and remove a person's own reminders on OpenVibe.Today, for that person (plan L48): a first-party service such as OpenVibe.Chat's Vibe names the person with X-OV-Subject, and ev",
++ "description": "**today.reminder.write** (first-party): Set, list, snooze, stop and remove a person's own reminders on OpenVibe.Today, for that person (plan L48): a first-party service such as OpenVibe.Chat's Vibe names the person with X-OV-Subject, and every route answers only that person's reminders. A reminder is plain words parsed by Today (\"stretch every 2 hours from 9 to 5\") and keeps the https link and the source site that set it.",
++ "tags": [
++ "today.reminder"
++ ],
++ "x-openvibe-capabilities": [
++ "today.reminder.write"
++ ],
++ "x-openvibe-visibility": [
++ "first-party"
++ ],
++ "x-openvibe-quota-class": "today-write",
++ "security": [
++ {
++ "openvibeToken": [
++ "today.reminder.write"
++ ]
++ }
++ ],
++ "x-openvibe-input": {
++ "$ref": "#/components/schemas/today.reminder-request.v1"
++ },
++ "parameters": [
++ {
++ "name": "text",
++ "in": "query",
++ "required": false,
++ "schema": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 500,
++ "description": "What to remind the person of, and when, in their own words."
++ },
++ "description": "What to remind the person of, and when, in their own words."
++ },
++ {
++ "name": "tz",
++ "in": "query",
++ "required": false,
++ "schema": {
++ "type": "string",
++ "maxLength": 64,
++ "description": "The person's IANA time zone (America/Chicago); an unknown zone is read as UTC."
++ },
++ "description": "The person's IANA time zone (America/Chicago); an unknown zone is read as UTC."
++ },
++ {
++ "name": "url",
++ "in": "query",
++ "required": false,
++ "schema": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "maxLength": 2000,
++ "description": "Where the reminder came from: an https link kept on it and opened from the notification. Anything else is dropped."
++ },
++ "description": "Where the reminder came from: an https link kept on it and opened from the notification. Anything else is dropped."
++ },
++ {
++ "name": "source",
++ "in": "query",
++ "required": false,
++ "schema": {
++ "type": "string",
++ "pattern": "^[a-z][a-z0-9-]{1,30}$",
++ "description": "The site that set it (vibe, live, work…), shown to the person."
++ },
++ "description": "The site that set it (vibe, live, work…), shown to the person."
++ },
++ {
++ "name": "minutes",
++ "in": "query",
++ "required": false,
++ "schema": {
++ "type": "integer",
++ "minimum": 5,
++ "maximum": 10080,
++ "description": "Snooze only: how long, from now."
++ },
++ "description": "Snooze only: how long, from now."
++ }
++ ],
++ "responses": {
++ "2XX": {
++ "description": "Success",
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/today.reminder-result.v1"
++ }
++ }
++ }
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ },
++ "post": {
++ "operationId": "post_api_v1_reminders",
++ "summary": "Set, list, snooze, stop and remove a person's own reminders on OpenVibe.Today, for that person (plan L48): a first-party service such as OpenVibe.Chat's Vibe names the person with X-OV-Subject, and ev",
++ "description": "**today.reminder.write** (first-party): Set, list, snooze, stop and remove a person's own reminders on OpenVibe.Today, for that person (plan L48): a first-party service such as OpenVibe.Chat's Vibe names the person with X-OV-Subject, and every route answers only that person's reminders. A reminder is plain words parsed by Today (\"stretch every 2 hours from 9 to 5\") and keeps the https link and the source site that set it.",
++ "tags": [
++ "today.reminder"
++ ],
++ "x-openvibe-capabilities": [
++ "today.reminder.write"
++ ],
++ "x-openvibe-visibility": [
++ "first-party"
++ ],
++ "x-openvibe-quota-class": "today-write",
++ "security": [
++ {
++ "openvibeToken": [
++ "today.reminder.write"
++ ]
++ }
++ ],
++ "requestBody": {
++ "required": false,
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/today.reminder-request.v1"
++ }
++ }
++ }
++ },
++ "responses": {
++ "2XX": {
++ "description": "Success",
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/today.reminder-result.v1"
++ }
++ }
++ }
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ }
++ },
++ "/api/v1/reminders/{id}": {
++ "delete": {
++ "operationId": "delete_api_v1_reminders_id",
++ "summary": "Set, list, snooze, stop and remove a person's own reminders on OpenVibe.Today, for that person (plan L48): a first-party service such as OpenVibe.Chat's Vibe names the person with X-OV-Subject, and ev",
++ "description": "**today.reminder.write** (first-party): Set, list, snooze, stop and remove a person's own reminders on OpenVibe.Today, for that person (plan L48): a first-party service such as OpenVibe.Chat's Vibe names the person with X-OV-Subject, and every route answers only that person's reminders. A reminder is plain words parsed by Today (\"stretch every 2 hours from 9 to 5\") and keeps the https link and the source site that set it.",
++ "tags": [
++ "today.reminder"
++ ],
++ "x-openvibe-capabilities": [
++ "today.reminder.write"
++ ],
++ "x-openvibe-visibility": [
++ "first-party"
++ ],
++ "x-openvibe-quota-class": "today-write",
++ "security": [
++ {
++ "openvibeToken": [
++ "today.reminder.write"
++ ]
++ }
++ ],
++ "x-openvibe-input": {
++ "$ref": "#/components/schemas/today.reminder-request.v1"
++ },
++ "parameters": [
++ {
++ "name": "id",
++ "in": "path",
++ "required": true,
++ "schema": {
++ "type": "string"
++ }
++ },
++ {
++ "name": "text",
++ "in": "query",
++ "required": false,
++ "schema": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 500,
++ "description": "What to remind the person of, and when, in their own words."
++ },
++ "description": "What to remind the person of, and when, in their own words."
++ },
++ {
++ "name": "tz",
++ "in": "query",
++ "required": false,
++ "schema": {
++ "type": "string",
++ "maxLength": 64,
++ "description": "The person's IANA time zone (America/Chicago); an unknown zone is read as UTC."
++ },
++ "description": "The person's IANA time zone (America/Chicago); an unknown zone is read as UTC."
++ },
++ {
++ "name": "url",
++ "in": "query",
++ "required": false,
++ "schema": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "maxLength": 2000,
++ "description": "Where the reminder came from: an https link kept on it and opened from the notification. Anything else is dropped."
++ },
++ "description": "Where the reminder came from: an https link kept on it and opened from the notification. Anything else is dropped."
++ },
++ {
++ "name": "source",
++ "in": "query",
++ "required": false,
++ "schema": {
++ "type": "string",
++ "pattern": "^[a-z][a-z0-9-]{1,30}$",
++ "description": "The site that set it (vibe, live, work…), shown to the person."
++ },
++ "description": "The site that set it (vibe, live, work…), shown to the person."
++ },
++ {
++ "name": "minutes",
++ "in": "query",
++ "required": false,
++ "schema": {
++ "type": "integer",
++ "minimum": 5,
++ "maximum": 10080,
++ "description": "Snooze only: how long, from now."
++ },
++ "description": "Snooze only: how long, from now."
++ }
++ ],
++ "responses": {
++ "2XX": {
++ "description": "Success",
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/today.reminder-result.v1"
++ }
++ }
++ }
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ }
++ },
++ "/api/v1/reminders/{id}/done": {
++ "post": {
++ "operationId": "post_api_v1_reminders_id_done",
++ "summary": "Set, list, snooze, stop and remove a person's own reminders on OpenVibe.Today, for that person (plan L48): a first-party service such as OpenVibe.Chat's Vibe names the person with X-OV-Subject, and ev",
++ "description": "**today.reminder.write** (first-party): Set, list, snooze, stop and remove a person's own reminders on OpenVibe.Today, for that person (plan L48): a first-party service such as OpenVibe.Chat's Vibe names the person with X-OV-Subject, and every route answers only that person's reminders. A reminder is plain words parsed by Today (\"stretch every 2 hours from 9 to 5\") and keeps the https link and the source site that set it.",
++ "tags": [
++ "today.reminder"
++ ],
++ "x-openvibe-capabilities": [
++ "today.reminder.write"
++ ],
++ "x-openvibe-visibility": [
++ "first-party"
++ ],
++ "x-openvibe-quota-class": "today-write",
++ "security": [
++ {
++ "openvibeToken": [
++ "today.reminder.write"
++ ]
++ }
++ ],
++ "requestBody": {
++ "required": false,
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/today.reminder-request.v1"
++ }
++ }
++ }
++ },
++ "parameters": [
++ {
++ "name": "id",
++ "in": "path",
++ "required": true,
++ "schema": {
++ "type": "string"
++ }
++ }
++ ],
++ "responses": {
++ "2XX": {
++ "description": "Success",
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/today.reminder-result.v1"
++ }
++ }
++ }
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ }
++ },
++ "/api/v1/reminders/{id}/snooze": {
++ "post": {
++ "operationId": "post_api_v1_reminders_id_snooze",
++ "summary": "Set, list, snooze, stop and remove a person's own reminders on OpenVibe.Today, for that person (plan L48): a first-party service such as OpenVibe.Chat's Vibe names the person with X-OV-Subject, and ev",
++ "description": "**today.reminder.write** (first-party): Set, list, snooze, stop and remove a person's own reminders on OpenVibe.Today, for that person (plan L48): a first-party service such as OpenVibe.Chat's Vibe names the person with X-OV-Subject, and every route answers only that person's reminders. A reminder is plain words parsed by Today (\"stretch every 2 hours from 9 to 5\") and keeps the https link and the source site that set it.",
++ "tags": [
++ "today.reminder"
++ ],
++ "x-openvibe-capabilities": [
++ "today.reminder.write"
++ ],
++ "x-openvibe-visibility": [
++ "first-party"
++ ],
++ "x-openvibe-quota-class": "today-write",
++ "security": [
++ {
++ "openvibeToken": [
++ "today.reminder.write"
++ ]
++ }
++ ],
++ "requestBody": {
++ "required": false,
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/today.reminder-request.v1"
++ }
++ }
++ }
++ },
++ "parameters": [
++ {
++ "name": "id",
++ "in": "path",
++ "required": true,
++ "schema": {
++ "type": "string"
++ }
++ }
++ ],
++ "responses": {
++ "2XX": {
++ "description": "Success",
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/today.reminder-result.v1"
++ }
++ }
++ }
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ }
++ },
++ "/api/v1/reminders/parse": {
++ "post": {
++ "operationId": "post_api_v1_reminders_parse",
++ "summary": "Set, list, snooze, stop and remove a person's own reminders on OpenVibe.Today, for that person (plan L48): a first-party service such as OpenVibe.Chat's Vibe names the person with X-OV-Subject, and ev",
++ "description": "**today.reminder.write** (first-party): Set, list, snooze, stop and remove a person's own reminders on OpenVibe.Today, for that person (plan L48): a first-party service such as OpenVibe.Chat's Vibe names the person with X-OV-Subject, and every route answers only that person's reminders. A reminder is plain words parsed by Today (\"stretch every 2 hours from 9 to 5\") and keeps the https link and the source site that set it.",
++ "tags": [
++ "today.reminder"
++ ],
++ "x-openvibe-capabilities": [
++ "today.reminder.write"
++ ],
++ "x-openvibe-visibility": [
++ "first-party"
++ ],
++ "x-openvibe-quota-class": "today-write",
++ "security": [
++ {
++ "openvibeToken": [
++ "today.reminder.write"
++ ]
++ }
++ ],
++ "requestBody": {
++ "required": false,
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/today.reminder-request.v1"
++ }
++ }
++ }
++ },
++ "responses": {
++ "2XX": {
++ "description": "Success",
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/today.reminder-result.v1"
++ }
++ }
++ }
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ }
++ }
++ },
++ "components": {
++ "schemas": {
++ "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}."
++ }
++ }
++ },
++ "today.reminder-request.v1": {
++ "title": "TodayReminderRequest",
++ "description": "today.reminder-request@1: the body of POST /api/v1/reminders and POST /api/v1/reminders/parse on OpenVibe.Today (today.reminder.write; the acting person). The reminder is plain words, parsed by Today into a rule in the person's time zone (\"stretch every 2 hours from 9 to 5\", \"take my meds every day at 9 am and 9 pm\", \"pay rent on the 1st of every month\"). POST /api/v1/reminders/:id/snooze takes { minutes } alone.",
++ "type": "object",
++ "additionalProperties": false,
++ "properties": {
++ "text": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 500,
++ "description": "What to remind the person of, and when, in their own words."
++ },
++ "tz": {
++ "type": "string",
++ "maxLength": 64,
++ "description": "The person's IANA time zone (America/Chicago); an unknown zone is read as UTC."
++ },
++ "url": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "maxLength": 2000,
++ "description": "Where the reminder came from: an https link kept on it and opened from the notification. Anything else is dropped."
++ },
++ "source": {
++ "type": "string",
++ "pattern": "^[a-z][a-z0-9-]{1,30}$",
++ "description": "The site that set it (vibe, live, work…), shown to the person."
++ },
++ "minutes": {
++ "type": "integer",
++ "minimum": 5,
++ "maximum": 10080,
++ "description": "Snooze only: how long, from now."
++ }
++ }
++ },
++ "today.reminder-result.v1": {
++ "title": "TodayReminderResult",
++ "description": "today.reminder-result@1: answers of the reminder routes on OpenVibe.Today. POST /api/v1/reminders/parse → a preview (title, rule, tz, next_at, summary); POST /api/v1/reminders, /:id/done and /:id/snooze → one reminder; GET /api/v1/reminders → { reminders }. A refusal is 422 { error } in words the person can act on (\"Say when: …\").",
++ "type": "object",
++ "properties": {
++ "reminders": {
++ "type": "array",
++ "items": {
++ "$ref": "#/components/schemas/today.reminder-result.v1/$defs/reminder"
++ }
++ },
++ "id": {
++ "type": "string",
++ "pattern": "^rem_[0-9A-HJKMNP-TV-Z]{26}$"
++ },
++ "title": {
++ "type": "string"
++ },
++ "summary": {
++ "type": "string",
++ "description": "The rule in words: \"Every 2 hours, 9 am–5 pm\"."
++ },
++ "next_at": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "format": "date-time"
++ },
++ "error": {
++ "type": "string"
++ }
++ },
++ "$defs": {
++ "reminder": {
++ "type": "object",
++ "required": [
++ "id",
++ "title",
++ "summary",
++ "status",
++ "next_at",
++ "repeats"
++ ],
++ "properties": {
++ "id": {
++ "type": "string",
++ "pattern": "^rem_[0-9A-HJKMNP-TV-Z]{26}$"
++ },
++ "title": {
++ "type": "string"
++ },
++ "said": {
++ "type": "string"
++ },
++ "rule": {
++ "type": "object",
++ "description": "once { at } | daily { times, days? } | interval { minutes, from?, to?, days?, start? } | monthly { day, time }"
++ },
++ "tz": {
++ "type": "string"
++ },
++ "url": {
++ "type": [
++ "string",
++ "null"
++ ]
++ },
++ "source": {
++ "type": "string"
++ },
++ "status": {
++ "enum": [
++ "active",
++ "done"
++ ]
++ },
++ "next_at": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "format": "date-time"
++ },
++ "last_sent_at": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "format": "date-time"
++ },
++ "sent_count": {
++ "type": "integer",
++ "minimum": 0
++ },
++ "summary": {
++ "type": "string"
++ },
++ "repeats": {
++ "type": "boolean"
++ },
++ "created_at": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "format": "date-time"
++ }
++ }
++ }
++ }
++ }
++ },
++ "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/tools.json b/generated/openapi/tools.json
iindex 9af97bae..d67dcf06 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.266.0",
-- "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.266.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.267.0",
++ "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.267.0): each operation lists the capabilities it performs; a token for the 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 f4e2e528..bc056127 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.266.0",
-- "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.266.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.267.0",
++ "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.267.0): each operation lists the capabilities it performs; a token for the 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 41d109a9..0cc41284 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.266.0",
-- "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.266.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.267.0",
++ "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.267.0): each operation lists the capabilities it performs; a token for the 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 24b0a944..f6fa5e0f 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.266.0",
-- "description": "Routes of OpenVibe.Vision as the OpenVibe contracts describe them (openvibe-contracts 0.266.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.267.0",
++ "description": "Routes of OpenVibe.Vision as the OpenVibe contracts describe them (openvibe-contracts 0.267.0): each operation lists the capabilities it performs; a token for the 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 b28cedcc..ffa504f5 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.266.0",
-- "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.266.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.267.0",
++ "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.267.0): each operation lists the capabilities it performs; a token for the 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 35a1f3e5..f996f68d 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.266.0",
-- "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.266.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.267.0",
++ "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.267.0): each operation lists the capabilities it performs; a token for the 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 8ba45508..cf63adb2 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.266.0",
-- "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.266.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.267.0",
++ "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.267.0): each operation lists the capabilities it performs; a token for the 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 04b5e07c..3c31c47d 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.266.0",
-- "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.266.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.267.0",
++ "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.267.0): each operation lists the capabilities it performs; a token for the 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 2199faf7..de55c765 100644
---- a/generated/typescript/index.d.ts
++++ b/generated/typescript/index.d.ts
@@@ -281874,3 +281874,64 @@ export interface AiCredentialFailedPayload {
*/
error: string;
}
++
++/** [email protected] (owner: today) */
++/**
++ * today.reminder-request@1: the body of POST /api/v1/reminders and POST /api/v1/reminders/parse on OpenVibe.Today (today.reminder.write; the acting person). The reminder is plain words, parsed by Today into a rule in the person's time zone ("stretch every 2 hours from 9 to 5", "take my meds every day at 9 am and 9 pm", "pay rent on the 1st of every month"). POST /api/v1/reminders/:id/snooze takes { minutes } alone.
++ */
++export interface TodayReminderRequest {
++ /**
++ * What to remind the person of, and when, in their own words.
++ */
++ text?: string;
++ /**
++ * The person's IANA time zone (America/Chicago); an unknown zone is read as UTC.
++ */
++ tz?: string;
++ /**
++ * Where the reminder came from: an https link kept on it and opened from the notification. Anything else is dropped.
++ */
++ url?: string | null;
++ /**
++ * The site that set it (vibe, live, work…), shown to the person.
++ */
++ source?: string;
++ /**
++ * Snooze only: how long, from now.
++ */
++ minutes?: number;
++}
++
++/** [email protected] (owner: today) */
++/**
++ * today.reminder-result@1: answers of the reminder routes on OpenVibe.Today. POST /api/v1/reminders/parse → a preview (title, rule, tz, next_at, summary); POST /api/v1/reminders, /:id/done and /:id/snooze → one reminder; GET /api/v1/reminders → { reminders }. A refusal is 422 { error } in words the person can act on ("Say when: …").
++ */
++export interface TodayReminderResult {
++ reminders?: {
++ id: string;
++ title: string;
++ said?: string;
++ /**
++ * once { at } | daily { times, days? } | interval { minutes, from?, to?, days?, start? } | monthly { day, time }
++ */
++ rule?: {};
++ tz?: string;
++ url?: string | null;
++ source?: string;
++ status: "active" | "done";
++ next_at: string | null;
++ last_sent_at?: string | null;
++ sent_count?: number;
++ summary: string;
++ repeats: boolean;
++ created_at?: string | null;
++ }[];
++ id?: string;
++ title?: string;
++ /**
++ * The rule in words: "Every 2 hours, 9 am–5 pm".
++ */
++ summary?: string;
++ next_at?: string | null;
++ error?: string;
++}
ddiff --git a/manifests/capabilities/today.reminder.write.json b/manifests/capabilities/today.reminder.write.json
nnew file mode 100644
iindex 00000000..3f0511a2
---- /dev/null
++++ b/manifests/capabilities/today.reminder.write.json
@@@ -0,0 +1,26 @@
++{
++ "id": "today.reminder.write",
++ "version": "1.0",
++ "owner": "today",
++ "status": "active",
++ "visibility": "first-party",
++ "description": "Set, list, snooze, stop and remove a person's own reminders on OpenVibe.Today, for that person (plan L48): a first-party service such as OpenVibe.Chat's Vibe names the person with X-OV-Subject, and every route answers only that person's reminders. A reminder is plain words parsed by Today (\"stretch every 2 hours from 9 to 5\") and keeps the https link and the source site that set it.",
++ "permissions": [
++ "today:write"
++ ],
++ "resourceConstraints": [
++ "owner"
++ ],
++ "quotaClass": "today-write",
++ "events": [],
++ "implementedBy": [
++ "POST /api/v1/reminders/parse",
++ "GET /api/v1/reminders",
++ "POST /api/v1/reminders",
++ "POST /api/v1/reminders/:id/done",
++ "POST /api/v1/reminders/:id/snooze",
++ "DELETE /api/v1/reminders/:id"
++ ],
++ "inputSchema": "today.reminder-request@1",
++ "outputSchema": "today.reminder-result@1"
++}
ddiff --git a/manifests/services/today.json b/manifests/services/today.json
iindex 968eb573..d1d05fa1 100644
---- a/manifests/services/today.json
++++ b/manifests/services/today.json
@@@ -15,7 +15,9 @@
"state": "live",
"publicSite": "service"
},
-- "capabilities": [],
++ "capabilities": [
++ "today.reminder.write"
++ ],
"eventsProduced": [
"today.event.scheduled",
"today.event.updated",
ddiff --git a/package-lock.json b/package-lock.json
iindex b245db4b..201ad79d 100644
---- a/package-lock.json
++++ b/package-lock.json
@@@ -1,12 +1,12 @@
{
"name": "openvibe-contracts",
-- "version": "0.266.0",
++ "version": "0.267.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "openvibe-contracts",
-- "version": "0.266.0",
++ "version": "0.267.0",
"license": "AGPL-3.0-only",
"dependencies": {
"ajv": "^8.17.1",
ddiff --git a/package.json b/package.json
iindex 250c0e2b..da1f9140 100644
---- a/package.json
++++ b/package.json
@@@ -1,6 +1,6 @@
{
"name": "openvibe-contracts",
-- "version": "0.266.0",
++ "version": "0.267.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",