openvibers/openvibe.contracts Commits
0.257.0: notification push accepts a canonical subject (#266)
Changes
@@@ -1,5 +1,15 @@# Changelog++## 0.259.0 — 2026-10-31++++- **`network.notification-push-request@1` addresses a person by subject as well as by user id (F1, familiar faces).**++ Vision sends a named person a consent request and Cam sends the camera owner an event alert; both know the++ canonical `usr_` subject from the token and never hold the numeric Network user id. `POST++ /internal/notifications/push` accepts `{ subject }` as an alternative to `{ user_id }` (unknown subject: 404), and++ `POST /internal/notifications/push-bulk` accepts `{ subjects }` as an alternative to `{ user_ids }` (unknown++ subjects are skipped). The rest of the body and every other rule is unchanged; `subject` is not the actor++ (`actor_subject` still carries the block check). Two valid fixtures prove the subject forms.++## 0.258.0 — 2026-10-31- **Labels and choices** (L1, `OpenVibe_Consent_Plan_2026-10-31.md` §"Labels and choices"): light rules, not bans.@@@ -2,13 +2,108 @@"$schema": "https://json-schema.org/draft/2020-12/schema","$id": "https://openvibe.network/contracts/network/notification-push-request.v1.json","title": "NetworkNotificationPushRequest",-- "description": "network.notification-push-request@1: bodies of network.notifications.push on OpenVibe.Network (a service token holding the capability, or the internal key). POST /internal/notifications/push: { user_id, type?, title?, message?, … } creates one notification (400 { error: user_id required } without user_id). POST /internal/notifications/push-bulk: { user_ids, …same fields } creates it for each recipient (400 without a non-empty user_ids, or with more than 1000). Recipients are Network user ids. Unknown fields are ignored; 503 when the notification service is not running. The other /internal/notifications/* routes (unread, mark-read, resolve-users) take the internal key only and are not part of this capability.",++ "description": "network.notification-push-request@1: bodies of network.notifications.push on OpenVibe.Network (a service token holding the capability). POST /internal/notifications/push: { user_id | subject, type?, title?, message?, \u2026 } creates one notification (400 without user_id or subject; 404 for an unknown subject). POST /internal/notifications/push-bulk: { user_ids | subjects, \u2026same fields } creates it for each recipient (400 without a non-empty user_ids or subjects, or with more than 1000). Recipients are Network user ids or canonical usr_ subjects; a subject resolves to its account, so a service that knows the person by subject (Vision's consent request, Cam's event alert) need not hold the numeric id. Unknown fields are ignored; 503 when the notification service is not running. The other /internal/notifications/* routes (unread, mark-read, resolve-users) take the internal key only and are not part of this capability.","anyOf": [{"type": "object",++ "properties": {++ "user_id": {++ "type": [++ "integer",++ "string"++ ],++ "description": "A Network user id (already translated from the caller's own ids)."++ },++ "type": {++ "type": "string",++ "description": "A notification type from openvibe-shared/notifications (STREAM_LIVE, FOLLOW, MENTION, \u2026); it supplies the default category, priority, icon and title. Stored as GENERIC when absent."++ },++ "title": {++ "type": "string",++ "description": "Default: the type's title, else \"Notification\"."++ },++ "message": {++ "type": [++ "string",++ "null"++ ]++ },++ "icon": {++ "type": "string",++ "description": "Default: the type's icon."++ },++ "sender_id": {++ "type": [++ "integer",++ "string",++ "null"++ ],++ "description": "The actor's Network user id; with no actor_subject, a recipient who blocked this person gets nothing."++ },++ "sender_name": {++ "type": [++ "string",++ "null"++ ]++ },++ "sender_avatar": {++ "type": [++ "string",++ "null"++ ]++ },++ "service": {++ "type": "string",++ "description": "The sending service. A service token may only name its own (svc:live \u2192 live); anything else is 403 capability.owner_denied."++ },++ "url": {++ "type": [++ "string",++ "null"++ ],++ "description": "Where the notification leads."++ },++ "priority": {++ "type": "string",++ "description": "low, normal, high or critical (openvibe-shared PRIORITY); default the type's, else normal."++ },++ "category": {++ "type": "string",++ "description": "Default: the type's category, else system. A recipient who switched the category off gets nothing; moderation, system and admin notices are never hidden by a block."++ },++ "rich_content": {++ "description": "Any JSON value, stored and returned as given."++ },++ "expires_at": {++ "type": [++ "string",++ "null"++ ],++ "description": "When it may be deleted (SQLite datetime, UTC)."++ },++ "actor_subject": {++ "type": [++ "string",++ "null"++ ],++ "pattern": "^usr_",++ "description": "The actor as a usr_ subject for the block check; null: no known person (no block check)."++ },++ "subject": {++ "type": [++ "string",++ "null"++ ],++ "pattern": "^usr_[0-9A-HJKMNP-TV-Z]{26}$",++ "description": "The recipient as a canonical usr_ subject, instead of user_id. It resolves to that person's Network account; an unknown subject is 404 and creates nothing."++ }++ },"required": ["user_id"-- ],++ ]++ },++ {++ "type": "object","properties": {"user_id": {"type": [@@@ -19,7 +114,7 @@},"type": {"type": "string",-- "description": "A notification type from openvibe-shared/notifications (STREAM_LIVE, FOLLOW, MENTION, …); it supplies the default category, priority, icon and title. Stored as GENERIC when absent."++ "description": "A notification type from openvibe-shared/notifications (STREAM_LIVE, FOLLOW, MENTION, \u2026); it supplies the default category, priority, icon and title. Stored as GENERIC when absent."},"title": {"type": "string",@@@ -57,7 +152,7 @@},"service": {"type": "string",-- "description": "The sending service. A service token may only name its own (svc:live → live); anything else is 403 capability.owner_denied."++ "description": "The sending service. A service token may only name its own (svc:live \u2192 live); anything else is 403 capability.owner_denied."},"url": {"type": [@@@ -91,14 +186,128 @@],"pattern": "^usr_","description": "The actor as a usr_ subject for the block check; null: no known person (no block check)."++ },++ "subject": {++ "type": [++ "string",++ "null"++ ],++ "pattern": "^usr_[0-9A-HJKMNP-TV-Z]{26}$",++ "description": "The recipient as a canonical usr_ subject, instead of user_id. It resolves to that person's Network account; an unknown subject is 404 and creates nothing."}-- }++ },++ "required": [++ "subject"++ ]},{"type": "object",++ "properties": {++ "user_ids": {++ "type": "array",++ "minItems": 1,++ "maxItems": 1000,++ "items": {++ "type": [++ "integer",++ "string"++ ],++ "description": "A Network user id (already translated from the caller's own ids)."++ }++ },++ "type": {++ "type": "string",++ "description": "A notification type from openvibe-shared/notifications (STREAM_LIVE, FOLLOW, MENTION, \u2026); it supplies the default category, priority, icon and title. Stored as GENERIC when absent."++ },++ "title": {++ "type": "string",++ "description": "Default: the type's title, else \"Notification\"."++ },++ "message": {++ "type": [++ "string",++ "null"++ ]++ },++ "icon": {++ "type": "string",++ "description": "Default: the type's icon."++ },++ "sender_id": {++ "type": [++ "integer",++ "string",++ "null"++ ],++ "description": "The actor's Network user id; with no actor_subject, a recipient who blocked this person gets nothing."++ },++ "sender_name": {++ "type": [++ "string",++ "null"++ ]++ },++ "sender_avatar": {++ "type": [++ "string",++ "null"++ ]++ },++ "service": {++ "type": "string",++ "description": "The sending service. A service token may only name its own (svc:live \u2192 live); anything else is 403 capability.owner_denied."++ },++ "url": {++ "type": [++ "string",++ "null"++ ],++ "description": "Where the notification leads."++ },++ "priority": {++ "type": "string",++ "description": "low, normal, high or critical (openvibe-shared PRIORITY); default the type's, else normal."++ },++ "category": {++ "type": "string",++ "description": "Default: the type's category, else system. A recipient who switched the category off gets nothing; moderation, system and admin notices are never hidden by a block."++ },++ "rich_content": {++ "description": "Any JSON value, stored and returned as given."++ },++ "expires_at": {++ "type": [++ "string",++ "null"++ ],++ "description": "When it may be deleted (SQLite datetime, UTC)."++ },++ "actor_subject": {++ "type": [++ "string",++ "null"++ ],++ "pattern": "^usr_",++ "description": "The actor as a usr_ subject for the block check; null: no known person (no block check)."++ },++ "subjects": {++ "type": "array",++ "minItems": 1,++ "maxItems": 1000,++ "uniqueItems": true,++ "items": {++ "type": "string",++ "pattern": "^usr_[0-9A-HJKMNP-TV-Z]{26}$"++ },++ "description": "Recipients as canonical usr_ subjects, instead of user_ids. Unknown subjects are skipped; at least one recipient is required."++ }++ },"required": ["user_ids"-- ],++ ]++ },++ {++ "type": "object","properties": {"user_ids": {"type": "array",@@@ -114,7 +323,7 @@},"type": {"type": "string",-- "description": "A notification type from openvibe-shared/notifications (STREAM_LIVE, FOLLOW, MENTION, …); it supplies the default category, priority, icon and title. Stored as GENERIC when absent."++ "description": "A notification type from openvibe-shared/notifications (STREAM_LIVE, FOLLOW, MENTION, \u2026); it supplies the default category, priority, icon and title. Stored as GENERIC when absent."},"title": {"type": "string",@@@ -152,7 +361,7 @@},"service": {"type": "string",-- "description": "The sending service. A service token may only name its own (svc:live → live); anything else is 403 capability.owner_denied."++ "description": "The sending service. A service token may only name its own (svc:live \u2192 live); anything else is 403 capability.owner_denied."},"url": {"type": [@@@ -186,8 +395,22 @@],"pattern": "^usr_","description": "The actor as a usr_ subject for the block check; null: no known person (no block check)."++ },++ "subjects": {++ "type": "array",++ "minItems": 1,++ "maxItems": 1000,++ "uniqueItems": true,++ "items": {++ "type": "string",++ "pattern": "^usr_[0-9A-HJKMNP-TV-Z]{26}$"++ },++ "description": "Recipients as canonical usr_ subjects, instead of user_ids. Unknown subjects are skipped; at least one recipient is required."}-- }++ },++ "required": [++ "subjects"++ ]}]}nnew file mode 100644@@@ -0,0 +1,8 @@++{++ "subjects": [++ "usr_01JAB2C3D4E5F6G7H8J9K0MNPR",++ "usr_01JAB2C3D4E5F6G7H8J9K0MNPQ"++ ],++ "title": "A camera has news",++ "service": "cam"++}nnew file mode 100644@@@ -0,0 +1,8 @@++{++ "subject": "usr_01JAB2C3D4E5F6G7H8J9K0MNPR",++ "type": "CAM_EVENT",++ "category": "cam",++ "title": "Package left",++ "service": "cam",++ "url": "https://openvibe.cam/my/cameras/cam_01JAB2C3D4E5F6G7H8J9K0MNPR"++}@@@ -30169,13 +30169,108 @@"$schema": "https://json-schema.org/draft/2020-12/schema","$id": "https://openvibe.network/contracts/network/notification-push-request.v1.json","title": "NetworkNotificationPushRequest",-- "description": "network.notification-push-request@1: bodies of network.notifications.push on OpenVibe.Network (a service token holding the capability, or the internal key). POST /internal/notifications/push: { user_id, type?, title?, message?, … } creates one notification (400 { error: user_id required } without user_id). POST /internal/notifications/push-bulk: { user_ids, …same fields } creates it for each recipient (400 without a non-empty user_ids, or with more than 1000). Recipients are Network user ids. Unknown fields are ignored; 503 when the notification service is not running. The other /internal/notifications/* routes (unread, mark-read, resolve-users) take the internal key only and are not part of this capability.",++ "description": "network.notification-push-request@1: bodies of network.notifications.push on OpenVibe.Network (a service token holding the capability). POST /internal/notifications/push: { user_id | subject, type?, title?, message?, … } creates one notification (400 without user_id or subject; 404 for an unknown subject). POST /internal/notifications/push-bulk: { user_ids | subjects, …same fields } creates it for each recipient (400 without a non-empty user_ids or subjects, or with more than 1000). Recipients are Network user ids or canonical usr_ subjects; a subject resolves to its account, so a service that knows the person by subject (Vision's consent request, Cam's event alert) need not hold the numeric id. Unknown fields are ignored; 503 when the notification service is not running. The other /internal/notifications/* routes (unread, mark-read, resolve-users) take the internal key only and are not part of this capability.","anyOf": [{"type": "object",++ "properties": {++ "user_id": {++ "type": [++ "integer",++ "string"++ ],++ "description": "A Network user id (already translated from the caller's own ids)."++ },++ "type": {++ "type": "string",++ "description": "A notification type from openvibe-shared/notifications (STREAM_LIVE, FOLLOW, MENTION, …); it supplies the default category, priority, icon and title. Stored as GENERIC when absent."++ },++ "title": {++ "type": "string",++ "description": "Default: the type's title, else \"Notification\"."++ },++ "message": {++ "type": [++ "string",++ "null"++ ]++ },++ "icon": {++ "type": "string",++ "description": "Default: the type's icon."++ },++ "sender_id": {++ "type": [++ "integer",++ "string",++ "null"++ ],++ "description": "The actor's Network user id; with no actor_subject, a recipient who blocked this person gets nothing."++ },++ "sender_name": {++ "type": [++ "string",++ "null"++ ]++ },++ "sender_avatar": {++ "type": [++ "string",++ "null"++ ]++ },++ "service": {++ "type": "string",++ "description": "The sending service. A service token may only name its own (svc:live → live); anything else is 403 capability.owner_denied."++ },++ "url": {++ "type": [++ "string",++ "null"++ ],++ "description": "Where the notification leads."++ },++ "priority": {++ "type": "string",++ "description": "low, normal, high or critical (openvibe-shared PRIORITY); default the type's, else normal."++ },++ "category": {++ "type": "string",++ "description": "Default: the type's category, else system. A recipient who switched the category off gets nothing; moderation, system and admin notices are never hidden by a block."++ },++ "rich_content": {++ "description": "Any JSON value, stored and returned as given."++ },++ "expires_at": {++ "type": [++ "string",++ "null"++ ],++ "description": "When it may be deleted (SQLite datetime, UTC)."++ },++ "actor_subject": {++ "type": [++ "string",++ "null"++ ],++ "pattern": "^usr_",++ "description": "The actor as a usr_ subject for the block check; null: no known person (no block check)."++ },++ "subject": {++ "type": [++ "string",++ "null"++ ],++ "pattern": "^usr_[0-9A-HJKMNP-TV-Z]{26}$",++ "description": "The recipient as a canonical usr_ subject, instead of user_id. It resolves to that person's Network account; an unknown subject is 404 and creates nothing."++ }++ },"required": ["user_id"-- ],++ ]++ },++ {++ "type": "object","properties": {"user_id": {"type": [@@@ -30258,14 +30353,128 @@],"pattern": "^usr_","description": "The actor as a usr_ subject for the block check; null: no known person (no block check)."++ },++ "subject": {++ "type": [++ "string",++ "null"++ ],++ "pattern": "^usr_[0-9A-HJKMNP-TV-Z]{26}$",++ "description": "The recipient as a canonical usr_ subject, instead of user_id. It resolves to that person's Network account; an unknown subject is 404 and creates nothing."}-- }++ },++ "required": [++ "subject"++ ]},{"type": "object",++ "properties": {++ "user_ids": {++ "type": "array",++ "minItems": 1,++ "maxItems": 1000,++ "items": {++ "type": [++ "integer",++ "string"++ ],++ "description": "A Network user id (already translated from the caller's own ids)."++ }++ },++ "type": {++ "type": "string",++ "description": "A notification type from openvibe-shared/notifications (STREAM_LIVE, FOLLOW, MENTION, …); it supplies the default category, priority, icon and title. Stored as GENERIC when absent."++ },++ "title": {++ "type": "string",++ "description": "Default: the type's title, else \"Notification\"."++ },++ "message": {++ "type": [++ "string",++ "null"++ ]++ },++ "icon": {++ "type": "string",++ "description": "Default: the type's icon."++ },++ "sender_id": {++ "type": [++ "integer",++ "string",++ "null"++ ],++ "description": "The actor's Network user id; with no actor_subject, a recipient who blocked this person gets nothing."++ },++ "sender_name": {++ "type": [++ "string",++ "null"++ ]++ },++ "sender_avatar": {++ "type": [++ "string",++ "null"++ ]++ },++ "service": {++ "type": "string",++ "description": "The sending service. A service token may only name its own (svc:live → live); anything else is 403 capability.owner_denied."++ },++ "url": {++ "type": [++ "string",++ "null"++ ],++ "description": "Where the notification leads."++ },++ "priority": {++ "type": "string",++ "description": "low, normal, high or critical (openvibe-shared PRIORITY); default the type's, else normal."++ },++ "category": {++ "type": "string",++ "description": "Default: the type's category, else system. A recipient who switched the category off gets nothing; moderation, system and admin notices are never hidden by a block."++ },++ "rich_content": {++ "description": "Any JSON value, stored and returned as given."++ },++ "expires_at": {++ "type": [++ "string",++ "null"++ ],++ "description": "When it may be deleted (SQLite datetime, UTC)."++ },++ "actor_subject": {++ "type": [++ "string",++ "null"++ ],++ "pattern": "^usr_",++ "description": "The actor as a usr_ subject for the block check; null: no known person (no block check)."++ },++ "subjects": {++ "type": "array",++ "minItems": 1,++ "maxItems": 1000,++ "uniqueItems": true,++ "items": {++ "type": "string",++ "pattern": "^usr_[0-9A-HJKMNP-TV-Z]{26}$"++ },++ "description": "Recipients as canonical usr_ subjects, instead of user_ids. Unknown subjects are skipped; at least one recipient is required."++ }++ },"required": ["user_ids"-- ],++ ]++ },++ {++ "type": "object","properties": {"user_ids": {"type": "array",@@@ -30353,8 +30562,22 @@],"pattern": "^usr_","description": "The actor as a usr_ subject for the block check; null: no known person (no block check)."++ },++ "subjects": {++ "type": "array",++ "minItems": 1,++ "maxItems": 1000,++ "uniqueItems": true,++ "items": {++ "type": "string",++ "pattern": "^usr_[0-9A-HJKMNP-TV-Z]{26}$"++ },++ "description": "Recipients as canonical usr_ subjects, instead of user_ids. Unknown subjects are skipped; at least one recipient is required."}-- }++ },++ "required": [++ "subjects"++ ]}]}@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Actor API",-- "version": "0.258.0",-- "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.258.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.259.0",++ "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.259.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.AI API",-- "version": "0.258.0",-- "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.258.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.259.0",++ "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.259.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Bench API",-- "version": "0.258.0",-- "description": "Routes of OpenVibe.Bench as the OpenVibe contracts describe them (openvibe-contracts 0.258.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.259.0",++ "description": "Routes of OpenVibe.Bench as the OpenVibe contracts describe them (openvibe-contracts 0.259.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Billing API",-- "version": "0.258.0",-- "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.258.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.259.0",++ "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.259.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Blog API",-- "version": "0.258.0",-- "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.258.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.259.0",++ "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.259.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Bot API",-- "version": "0.258.0",-- "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.258.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.259.0",++ "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.259.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Chat API",-- "version": "0.258.0",-- "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.258.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.259.0",++ "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.259.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Codes API",-- "version": "0.258.0",-- "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.258.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.259.0",++ "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.259.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Community API",-- "version": "0.258.0",-- "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.258.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.259.0",++ "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.259.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Coupons API",-- "version": "0.258.0",-- "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.258.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.259.0",++ "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.259.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Deals API",-- "version": "0.258.0",-- "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.258.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.259.0",++ "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.259.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Domains API",-- "version": "0.258.0",-- "description": "Routes of OpenVibe.Domains as the OpenVibe contracts describe them (openvibe-contracts 0.258.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.259.0",++ "description": "Routes of OpenVibe.Domains as the OpenVibe contracts describe them (openvibe-contracts 0.259.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Events API",-- "version": "0.258.0",-- "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.258.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.259.0",++ "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.259.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Food API",-- "version": "0.258.0",-- "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.258.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.259.0",++ "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.259.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Games API",-- "version": "0.258.0",-- "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.258.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.259.0",++ "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.259.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Host API",-- "version": "0.258.0",-- "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.258.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.259.0",++ "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.259.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Inventory API",-- "version": "0.258.0",-- "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.258.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.259.0",++ "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.259.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Live API",-- "version": "0.258.0",-- "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.258.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.259.0",++ "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.259.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.MediaHub API",-- "version": "0.258.0",-- "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.258.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.259.0",++ "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.259.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Media API",-- "version": "0.258.0",-- "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.258.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.259.0",++ "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.259.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Network API",-- "version": "0.258.0",-- "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.258.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.259.0",++ "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.259.0): each operation lists the capabilities it performs; a token for the 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"@@@ -5201,13 +5201,108 @@},"network.notification-push-request.v1": {"title": "NetworkNotificationPushRequest",-- "description": "network.notification-push-request@1: bodies of network.notifications.push on OpenVibe.Network (a service token holding the capability, or the internal key). POST /internal/notifications/push: { user_id, type?, title?, message?, … } creates one notification (400 { error: user_id required } without user_id). POST /internal/notifications/push-bulk: { user_ids, …same fields } creates it for each recipient (400 without a non-empty user_ids, or with more than 1000). Recipients are Network user ids. Unknown fields are ignored; 503 when the notification service is not running. The other /internal/notifications/* routes (unread, mark-read, resolve-users) take the internal key only and are not part of this capability.",++ "description": "network.notification-push-request@1: bodies of network.notifications.push on OpenVibe.Network (a service token holding the capability). POST /internal/notifications/push: { user_id | subject, type?, title?, message?, … } creates one notification (400 without user_id or subject; 404 for an unknown subject). POST /internal/notifications/push-bulk: { user_ids | subjects, …same fields } creates it for each recipient (400 without a non-empty user_ids or subjects, or with more than 1000). Recipients are Network user ids or canonical usr_ subjects; a subject resolves to its account, so a service that knows the person by subject (Vision's consent request, Cam's event alert) need not hold the numeric id. Unknown fields are ignored; 503 when the notification service is not running. The other /internal/notifications/* routes (unread, mark-read, resolve-users) take the internal key only and are not part of this capability.","anyOf": [{"type": "object",++ "properties": {++ "user_id": {++ "type": [++ "integer",++ "string"++ ],++ "description": "A Network user id (already translated from the caller's own ids)."++ },++ "type": {++ "type": "string",++ "description": "A notification type from openvibe-shared/notifications (STREAM_LIVE, FOLLOW, MENTION, …); it supplies the default category, priority, icon and title. Stored as GENERIC when absent."++ },++ "title": {++ "type": "string",++ "description": "Default: the type's title, else \"Notification\"."++ },++ "message": {++ "type": [++ "string",++ "null"++ ]++ },++ "icon": {++ "type": "string",++ "description": "Default: the type's icon."++ },++ "sender_id": {++ "type": [++ "integer",++ "string",++ "null"++ ],++ "description": "The actor's Network user id; with no actor_subject, a recipient who blocked this person gets nothing."++ },++ "sender_name": {++ "type": [++ "string",++ "null"++ ]++ },++ "sender_avatar": {++ "type": [++ "string",++ "null"++ ]++ },++ "service": {++ "type": "string",++ "description": "The sending service. A service token may only name its own (svc:live → live); anything else is 403 capability.owner_denied."++ },++ "url": {++ "type": [++ "string",++ "null"++ ],++ "description": "Where the notification leads."++ },++ "priority": {++ "type": "string",++ "description": "low, normal, high or critical (openvibe-shared PRIORITY); default the type's, else normal."++ },++ "category": {++ "type": "string",++ "description": "Default: the type's category, else system. A recipient who switched the category off gets nothing; moderation, system and admin notices are never hidden by a block."++ },++ "rich_content": {++ "description": "Any JSON value, stored and returned as given."++ },++ "expires_at": {++ "type": [++ "string",++ "null"++ ],++ "description": "When it may be deleted (SQLite datetime, UTC)."++ },++ "actor_subject": {++ "type": [++ "string",++ "null"++ ],++ "pattern": "^usr_",++ "description": "The actor as a usr_ subject for the block check; null: no known person (no block check)."++ },++ "subject": {++ "type": [++ "string",++ "null"++ ],++ "pattern": "^usr_[0-9A-HJKMNP-TV-Z]{26}$",++ "description": "The recipient as a canonical usr_ subject, instead of user_id. It resolves to that person's Network account; an unknown subject is 404 and creates nothing."++ }++ },"required": ["user_id"-- ],++ ]++ },++ {++ "type": "object","properties": {"user_id": {"type": [@@@ -5290,14 +5385,128 @@],"pattern": "^usr_","description": "The actor as a usr_ subject for the block check; null: no known person (no block check)."++ },++ "subject": {++ "type": [++ "string",++ "null"++ ],++ "pattern": "^usr_[0-9A-HJKMNP-TV-Z]{26}$",++ "description": "The recipient as a canonical usr_ subject, instead of user_id. It resolves to that person's Network account; an unknown subject is 404 and creates nothing."}-- }++ },++ "required": [++ "subject"++ ]},{"type": "object",++ "properties": {++ "user_ids": {++ "type": "array",++ "minItems": 1,++ "maxItems": 1000,++ "items": {++ "type": [++ "integer",++ "string"++ ],++ "description": "A Network user id (already translated from the caller's own ids)."++ }++ },++ "type": {++ "type": "string",++ "description": "A notification type from openvibe-shared/notifications (STREAM_LIVE, FOLLOW, MENTION, …); it supplies the default category, priority, icon and title. Stored as GENERIC when absent."++ },++ "title": {++ "type": "string",++ "description": "Default: the type's title, else \"Notification\"."++ },++ "message": {++ "type": [++ "string",++ "null"++ ]++ },++ "icon": {++ "type": "string",++ "description": "Default: the type's icon."++ },++ "sender_id": {++ "type": [++ "integer",++ "string",++ "null"++ ],++ "description": "The actor's Network user id; with no actor_subject, a recipient who blocked this person gets nothing."++ },++ "sender_name": {++ "type": [++ "string",++ "null"++ ]++ },++ "sender_avatar": {++ "type": [++ "string",++ "null"++ ]++ },++ "service": {++ "type": "string",++ "description": "The sending service. A service token may only name its own (svc:live → live); anything else is 403 capability.owner_denied."++ },++ "url": {++ "type": [++ "string",++ "null"++ ],++ "description": "Where the notification leads."++ },++ "priority": {++ "type": "string",++ "description": "low, normal, high or critical (openvibe-shared PRIORITY); default the type's, else normal."++ },++ "category": {++ "type": "string",++ "description": "Default: the type's category, else system. A recipient who switched the category off gets nothing; moderation, system and admin notices are never hidden by a block."++ },++ "rich_content": {++ "description": "Any JSON value, stored and returned as given."++ },++ "expires_at": {++ "type": [++ "string",++ "null"++ ],++ "description": "When it may be deleted (SQLite datetime, UTC)."++ },++ "actor_subject": {++ "type": [++ "string",++ "null"++ ],++ "pattern": "^usr_",++ "description": "The actor as a usr_ subject for the block check; null: no known person (no block check)."++ },++ "subjects": {++ "type": "array",++ "minItems": 1,++ "maxItems": 1000,++ "uniqueItems": true,++ "items": {++ "type": "string",++ "pattern": "^usr_[0-9A-HJKMNP-TV-Z]{26}$"++ },++ "description": "Recipients as canonical usr_ subjects, instead of user_ids. Unknown subjects are skipped; at least one recipient is required."++ }++ },"required": ["user_ids"-- ],++ ]++ },++ {++ "type": "object","properties": {"user_ids": {"type": "array",@@@ -5385,8 +5594,22 @@],"pattern": "^usr_","description": "The actor as a usr_ subject for the block check; null: no known person (no block check)."++ },++ "subjects": {++ "type": "array",++ "minItems": 1,++ "maxItems": 1000,++ "uniqueItems": true,++ "items": {++ "type": "string",++ "pattern": "^usr_[0-9A-HJKMNP-TV-Z]{26}$"++ },++ "description": "Recipients as canonical usr_ subjects, instead of user_ids. Unknown subjects are skipped; at least one recipient is required."}-- }++ },++ "required": [++ "subjects"++ ]}]},@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.News API",-- "version": "0.258.0",-- "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.258.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.259.0",++ "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.259.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenRestream API",-- "version": "0.258.0",-- "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.258.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.259.0",++ "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.259.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Play API",-- "version": "0.258.0",-- "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.258.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.259.0",++ "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.259.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Quest API",-- "version": "0.258.0",-- "description": "Routes of OpenVibe.Quest as the OpenVibe contracts describe them (openvibe-contracts 0.258.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.259.0",++ "description": "Routes of OpenVibe.Quest as the OpenVibe contracts describe them (openvibe-contracts 0.259.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Reviews API",-- "version": "0.258.0",-- "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.258.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.259.0",++ "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.259.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Run API",-- "version": "0.258.0",-- "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.258.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.259.0",++ "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.259.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Search API",-- "version": "0.258.0",-- "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.258.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.259.0",++ "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.259.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Services API",-- "version": "0.258.0",-- "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.258.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.259.0",++ "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.259.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Sources API",-- "version": "0.258.0",-- "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.258.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.259.0",++ "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.259.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Space API",-- "version": "0.258.0",-- "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.258.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.259.0",++ "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.259.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Tips API",-- "version": "0.258.0",-- "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.258.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.259.0",++ "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.259.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Tools API",-- "version": "0.258.0",-- "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.258.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.259.0",++ "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.259.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Trade API",-- "version": "0.258.0",-- "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.258.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.259.0",++ "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.259.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.VIP API",-- "version": "0.258.0",-- "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.258.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.259.0",++ "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.259.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Vision API",-- "version": "0.258.0",-- "description": "Routes of OpenVibe.Vision as the OpenVibe contracts describe them (openvibe-contracts 0.258.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.259.0",++ "description": "Routes of OpenVibe.Vision as the OpenVibe contracts describe them (openvibe-contracts 0.259.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Watch API",-- "version": "0.258.0",-- "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.258.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.259.0",++ "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.259.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Wiki API",-- "version": "0.258.0",-- "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.258.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.259.0",++ "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.259.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Work API",-- "version": "0.258.0",-- "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.258.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.259.0",++ "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.259.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Zone API",-- "version": "0.258.0",-- "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.258.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.259.0",++ "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.259.0): each operation lists the capabilities it performs; a token for the 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"@@@ -168444,7 +168444,7 @@ export interface NetworkGithubTokenResult {/** [email protected] (owner: network) *//**-- * network.notification-push-request@1: bodies of network.notifications.push on OpenVibe.Network (a service token holding the capability, or the internal key). POST /internal/notifications/push: { user_id, type?, title?, message?, … } creates one notification (400 { error: user_id required } without user_id). POST /internal/notifications/push-bulk: { user_ids, …same fields } creates it for each recipient (400 without a non-empty user_ids, or with more than 1000). Recipients are Network user ids. Unknown fields are ignored; 503 when the notification service is not running. The other /internal/notifications/* routes (unread, mark-read, resolve-users) take the internal key only and are not part of this capability.++ * network.notification-push-request@1: bodies of network.notifications.push on OpenVibe.Network (a service token holding the capability). POST /internal/notifications/push: { user_id | subject, type?, title?, message?, … } creates one notification (400 without user_id or subject; 404 for an unknown subject). POST /internal/notifications/push-bulk: { user_ids | subjects, …same fields } creates it for each recipient (400 without a non-empty user_ids or subjects, or with more than 1000). Recipients are Network user ids or canonical usr_ subjects; a subject resolves to its account, so a service that knows the person by subject (Vision's consent request, Cam's event alert) need not hold the numeric id. Unknown fields are ignored; 503 when the notification service is not running. The other /internal/notifications/* routes (unread, mark-read, resolve-users) take the internal key only and are not part of this capability.*/export type NetworkNotificationPushRequest =| {@@@ -168501,6 +168501,69 @@ export type NetworkNotificationPushRequest =* The actor as a usr_ subject for the block check; null: no known person (no block check).*/actor_subject?: string | null;++ /**++ * The recipient as a canonical usr_ subject, instead of user_id. It resolves to that person's Network account; an unknown subject is 404 and creates nothing.++ */++ subject?: string | null;++ }++ | {++ /**++ * A Network user id (already translated from the caller's own ids).++ */++ user_id?: number | string;++ /**++ * A notification type from openvibe-shared/notifications (STREAM_LIVE, FOLLOW, MENTION, …); it supplies the default category, priority, icon and title. Stored as GENERIC when absent.++ */++ type?: string;++ /**++ * Default: the type's title, else "Notification".++ */++ title?: string;++ message?: string | null;++ /**++ * Default: the type's icon.++ */++ icon?: string;++ /**++ * The actor's Network user id; with no actor_subject, a recipient who blocked this person gets nothing.++ */++ sender_id?: number | string | null;++ sender_name?: string | null;++ sender_avatar?: string | null;++ /**++ * The sending service. A service token may only name its own (svc:live → live); anything else is 403 capability.owner_denied.++ */++ service?: string;++ /**++ * Where the notification leads.++ */++ url?: string | null;++ /**++ * low, normal, high or critical (openvibe-shared PRIORITY); default the type's, else normal.++ */++ priority?: string;++ /**++ * Default: the type's category, else system. A recipient who switched the category off gets nothing; moderation, system and admin notices are never hidden by a block.++ */++ category?: string;++ /**++ * Any JSON value, stored and returned as given.++ */++ rich_content?: {++ [k: string]: unknown | undefined;++ };++ /**++ * When it may be deleted (SQLite datetime, UTC).++ */++ expires_at?: string | null;++ /**++ * The actor as a usr_ subject for the block check; null: no known person (no block check).++ */++ actor_subject?: string | null;++ /**++ * The recipient as a canonical usr_ subject, instead of user_id. It resolves to that person's Network account; an unknown subject is 404 and creates nothing.++ */++ subject: string | null;}| {/**@@@ -168557,6 +168620,76 @@ export type NetworkNotificationPushRequest =* The actor as a usr_ subject for the block check; null: no known person (no block check).*/actor_subject?: string | null;++ /**++ * Recipients as canonical usr_ subjects, instead of user_ids. Unknown subjects are skipped; at least one recipient is required.++ *++ * @minItems 1++ * @maxItems 1000++ */++ subjects?: [string, ...string[]];++ }++ | {++ /**++ * @minItems 1++ * @maxItems 1000++ */++ user_ids?: [number | string, ...(number | string)[]];++ /**++ * A notification type from openvibe-shared/notifications (STREAM_LIVE, FOLLOW, MENTION, …); it supplies the default category, priority, icon and title. Stored as GENERIC when absent.++ */++ type?: string;++ /**++ * Default: the type's title, else "Notification".++ */++ title?: string;++ message?: string | null;++ /**++ * Default: the type's icon.++ */++ icon?: string;++ /**++ * The actor's Network user id; with no actor_subject, a recipient who blocked this person gets nothing.++ */++ sender_id?: number | string | null;++ sender_name?: string | null;++ sender_avatar?: string | null;++ /**++ * The sending service. A service token may only name its own (svc:live → live); anything else is 403 capability.owner_denied.++ */++ service?: string;++ /**++ * Where the notification leads.++ */++ url?: string | null;++ /**++ * low, normal, high or critical (openvibe-shared PRIORITY); default the type's, else normal.++ */++ priority?: string;++ /**++ * Default: the type's category, else system. A recipient who switched the category off gets nothing; moderation, system and admin notices are never hidden by a block.++ */++ category?: string;++ /**++ * Any JSON value, stored and returned as given.++ */++ rich_content?: {++ [k: string]: unknown | undefined;++ };++ /**++ * When it may be deleted (SQLite datetime, UTC).++ */++ expires_at?: string | null;++ /**++ * The actor as a usr_ subject for the block check; null: no known person (no block check).++ */++ actor_subject?: string | null;++ /**++ * Recipients as canonical usr_ subjects, instead of user_ids. Unknown subjects are skipped; at least one recipient is required.++ *++ * @minItems 1++ * @maxItems 1000++ */++ subjects: [string, ...string[]];};/** [email protected] (owner: network) */@@@ -1,12 +1,12 @@{"name": "openvibe-contracts",-- "version": "0.252.0",++ "version": "0.259.0","lockfileVersion": 3,"requires": true,"packages": {"": {"name": "openvibe-contracts",-- "version": "0.252.0",++ "version": "0.259.0","license": "AGPL-3.0-only","dependencies": {"ajv": "^8.17.1",@@@ -1,6 +1,6 @@{"name": "openvibe-contracts",-- "version": "0.258.0",++ "version": "0.259.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",
@@ -1,5 +1,15 @@
@@ -1,5 +1,15 @@
# Changelog
# Changelog
+## 0.259.0 — 2026-10-31
+
+- **`network.notification-push-request@1` addresses a person by subject as well as by user id (F1, familiar faces).**
+ Vision sends a named person a consent request and Cam sends the camera owner an event alert; both know the
+ canonical `usr_` subject from the token and never hold the numeric Network user id. `POST
+ /internal/notifications/push` accepts `{ subject }` as an alternative to `{ user_id }` (unknown subject: 404), and
+ `POST /internal/notifications/push-bulk` accepts `{ subjects }` as an alternative to `{ user_ids }` (unknown
+ subjects are skipped). The rest of the body and every other rule is unchanged; `subject` is not the actor
+ (`actor_subject` still carries the block check). Two valid fixtures prove the subject forms.
+
## 0.258.0 — 2026-10-31
## 0.258.0 — 2026-10-31
- **Labels and choices** (L1, `OpenVibe_Consent_Plan_2026-10-31.md` §"Labels and choices"): light rules, not bans.
- **Labels and choices** (L1, `OpenVibe_Consent_Plan_2026-10-31.md` §"Labels and choices"): light rules, not bans.
@@ -2,13 +2,108 @@
@@ -2,13 +2,108 @@
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://openvibe.network/contracts/network/notification-push-request.v1.json",
"$id": "https://openvibe.network/contracts/network/notification-push-request.v1.json",
"title": "NetworkNotificationPushRequest",
"title": "NetworkNotificationPushRequest",
- "description": "network.notification-push-request@1: bodies of network.notifications.push on OpenVibe.Network (a service token holding the capability, or the internal key). POST /internal/notifications/push: { user_id, type?, title?, message?, … } creates one notification (400 { error: user_id required } without user_id). POST /internal/notifications/push-bulk: { user_ids, …same fields } creates it for each recipient (400 without a non-empty user_ids, or with more than 1000). Recipients are Network user ids. Unknown fields are ignored; 503 when the notification service is not running. The other /internal/notifications/* routes (unread, mark-read, resolve-users) take the internal key only and are not part of this capability.",
+ "description": "network.notification-push-request@1: bodies of network.notifications.push on OpenVibe.Network (a service token holding the capability). POST /internal/notifications/push: { user_id | subject, type?, title?, message?, \u2026 } creates one notification (400 without user_id or subject; 404 for an unknown subject). POST /internal/notifications/push-bulk: { user_ids | subjects, \u2026same fields } creates it for each recipient (400 without a non-empty user_ids or subjects, or with more than 1000). Recipients are Network user ids or canonical usr_ subjects; a subject resolves to its account, so a service that knows the person by subject (Vision's consent request, Cam's event alert) need not hold the numeric id. Unknown fields are ignored; 503 when the notification service is not running. The other /internal/notifications/* routes (unread, mark-read, resolve-users) take the internal key only and are not part of this capability.",
"anyOf": [
"anyOf": [
{
{
"type": "object",
"type": "object",
+ "properties": {
+ "user_id": {
+ "type": [
+ "integer",
+ "string"
+ ],
+ "description": "A Network user id (already translated from the caller's own ids)."
+ },
+ "type": {
+ "type": "string",
+ "description": "A notification type from openvibe-shared/notifications (STREAM_LIVE, FOLLOW, MENTION, \u2026); it supplies the default category, priority, icon and title. Stored as GENERIC when absent."
+ },
+ "title": {
+ "type": "string",
+ "description": "Default: the type's title, else \"Notification\"."
+ },
+ "message": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "icon": {
+ "type": "string",
+ "description": "Default: the type's icon."
+ },
+ "sender_id": {
+ "type": [
+ "integer",
+ "string",
+ "null"
+ ],
+ "description": "The actor's Network user id; with no actor_subject, a recipient who blocked this person gets nothing."
+ },
+ "sender_name": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "sender_avatar": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "service": {
+ "type": "string",
+ "description": "The sending service. A service token may only name its own (svc:live \u2192 live); anything else is 403 capability.owner_denied."
+ },
+ "url": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "description": "Where the notification leads."
+ },
+ "priority": {
+ "type": "string",
+ "description": "low, normal, high or critical (openvibe-shared PRIORITY); default the type's, else normal."
+ },
+ "category": {
+ "type": "string",
+ "description": "Default: the type's category, else system. A recipient who switched the category off gets nothing; moderation, system and admin notices are never hidden by a block."
+ },
+ "rich_content": {
+ "description": "Any JSON value, stored and returned as given."
+ },
+ "expires_at": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "description": "When it may be deleted (SQLite datetime, UTC)."
+ },
+ "actor_subject": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "pattern": "^usr_",
+ "description": "The actor as a usr_ subject for the block check; null: no known person (no block check)."
+ },
+ "subject": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "pattern": "^usr_[0-9A-HJKMNP-TV-Z]{26}$",
+ "description": "The recipient as a canonical usr_ subject, instead of user_id. It resolves to that person's Network account; an unknown subject is 404 and creates nothing."
+ }
+ },
"required": [
"required": [
"user_id"
"user_id"
- ],
+ ]
+ },
+ {
+ "type": "object",
"properties": {
"properties": {
"user_id": {
"user_id": {
"type": [
"type": [
@@ -19,7 +114,7 @@
@@ -19,7 +114,7 @@
},
},
"type": {
"type": {
"type": "string",
"type": "string",
- "description": "A notification type from openvibe-shared/notifications (STREAM_LIVE, FOLLOW, MENTION, …); it supplies the default category, priority, icon and title. Stored as GENERIC when absent."
+ "description": "A notification type from openvibe-shared/notifications (STREAM_LIVE, FOLLOW, MENTION, \u2026); it supplies the default category, priority, icon and title. Stored as GENERIC when absent."
},
},
"title": {
"title": {
"type": "string",
"type": "string",
@@ -57,7 +152,7 @@
@@ -57,7 +152,7 @@
},
},
"service": {
"service": {
"type": "string",
"type": "string",
- "description": "The sending service. A service token may only name its own (svc:live → live); anything else is 403 capability.owner_denied."
+ "description": "The sending service. A service token may only name its own (svc:live \u2192 live); anything else is 403 capability.owner_denied."
},
},
"url": {
"url": {
"type": [
"type": [
@@ -91,14 +186,128 @@
@@ -91,14 +186,128 @@
],
],
"pattern": "^usr_",
"pattern": "^usr_",
"description": "The actor as a usr_ subject for the block check; null: no known person (no block check)."
"description": "The actor as a usr_ subject for the block check; null: no known person (no block check)."
+ },
+ "subject": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "pattern": "^usr_[0-9A-HJKMNP-TV-Z]{26}$",
+ "description": "The recipient as a canonical usr_ subject, instead of user_id. It resolves to that person's Network account; an unknown subject is 404 and creates nothing."
}
}
- }
+ },
+ "required": [
+ "subject"
+ ]
},
},
{
{
"type": "object",
"type": "object",
+ "properties": {
+ "user_ids": {
+ "type": "array",
+ "minItems": 1,
+ "maxItems": 1000,
+ "items": {
+ "type": [
+ "integer",
+ "string"
+ ],
+ "description": "A Network user id (already translated from the caller's own ids)."
+ }
+ },
+ "type": {
+ "type": "string",
+ "description": "A notification type from openvibe-shared/notifications (STREAM_LIVE, FOLLOW, MENTION, \u2026); it supplies the default category, priority, icon and title. Stored as GENERIC when absent."
+ },
+ "title": {
+ "type": "string",
+ "description": "Default: the type's title, else \"Notification\"."
+ },
+ "message": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "icon": {
+ "type": "string",
+ "description": "Default: the type's icon."
+ },
+ "sender_id": {
+ "type": [
+ "integer",
+ "string",
+ "null"
+ ],
+ "description": "The actor's Network user id; with no actor_subject, a recipient who blocked this person gets nothing."
+ },
+ "sender_name": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "sender_avatar": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "service": {
+ "type": "string",
+ "description": "The sending service. A service token may only name its own (svc:live \u2192 live); anything else is 403 capability.owner_denied."
+ },
+ "url": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "description": "Where the notification leads."
+ },
+ "priority": {
+ "type": "string",
+ "description": "low, normal, high or critical (openvibe-shared PRIORITY); default the type's, else normal."
+ },
+ "category": {
+ "type": "string",
+ "description": "Default: the type's category, else system. A recipient who switched the category off gets nothing; moderation, system and admin notices are never hidden by a block."
+ },
+ "rich_content": {
+ "description": "Any JSON value, stored and returned as given."
+ },
+ "expires_at": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "description": "When it may be deleted (SQLite datetime, UTC)."
+ },
+ "actor_subject": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "pattern": "^usr_",
+ "description": "The actor as a usr_ subject for the block check; null: no known person (no block check)."
+ },
+ "subjects": {
+ "type": "array",
+ "minItems": 1,
+ "maxItems": 1000,
+ "uniqueItems": true,
+ "items": {
+ "type": "string",
+ "pattern": "^usr_[0-9A-HJKMNP-TV-Z]{26}$"
+ },
+ "description": "Recipients as canonical usr_ subjects, instead of user_ids. Unknown subjects are skipped; at least one recipient is required."
+ }
+ },
"required": [
"required": [
"user_ids"
"user_ids"
- ],
+ ]
+ },
+ {
+ "type": "object",
"properties": {
"properties": {
"user_ids": {
"user_ids": {
"type": "array",
"type": "array",
@@ -114,7 +323,7 @@
@@ -114,7 +323,7 @@
},
},
"type": {
"type": {
"type": "string",
"type": "string",
- "description": "A notification type from openvibe-shared/notifications (STREAM_LIVE, FOLLOW, MENTION, …); it supplies the default category, priority, icon and title. Stored as GENERIC when absent."
+ "description": "A notification type from openvibe-shared/notifications (STREAM_LIVE, FOLLOW, MENTION, \u2026); it supplies the default category, priority, icon and title. Stored as GENERIC when absent."
},
},
"title": {
"title": {
"type": "string",
"type": "string",
@@ -152,7 +361,7 @@
@@ -152,7 +361,7 @@
},
},
"service": {
"service": {
"type": "string",
"type": "string",
- "description": "The sending service. A service token may only name its own (svc:live → live); anything else is 403 capability.owner_denied."
+ "description": "The sending service. A service token may only name its own (svc:live \u2192 live); anything else is 403 capability.owner_denied."
},
},
"url": {
"url": {
"type": [
"type": [
@@ -186,8 +395,22 @@
@@ -186,8 +395,22 @@
],
],
"pattern": "^usr_",
"pattern": "^usr_",
"description": "The actor as a usr_ subject for the block check; null: no known person (no block check)."
"description": "The actor as a usr_ subject for the block check; null: no known person (no block check)."
+ },
+ "subjects": {
+ "type": "array",
+ "minItems": 1,
+ "maxItems": 1000,
+ "uniqueItems": true,
+ "items": {
+ "type": "string",
+ "pattern": "^usr_[0-9A-HJKMNP-TV-Z]{26}$"
+ },
+ "description": "Recipients as canonical usr_ subjects, instead of user_ids. Unknown subjects are skipped; at least one recipient is required."
}
}
- }
+ },
+ "required": [
+ "subjects"
+ ]
}
}
]
]
}
}
new file mode 100644
new file mode 100644
@@ -0,0 +1,8 @@
@@ -0,0 +1,8 @@
+{
+ "subjects": [
+ "usr_01JAB2C3D4E5F6G7H8J9K0MNPR",
+ "usr_01JAB2C3D4E5F6G7H8J9K0MNPQ"
+ ],
+ "title": "A camera has news",
+ "service": "cam"
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,8 @@
@@ -0,0 +1,8 @@
+{
+ "subject": "usr_01JAB2C3D4E5F6G7H8J9K0MNPR",
+ "type": "CAM_EVENT",
+ "category": "cam",
+ "title": "Package left",
+ "service": "cam",
+ "url": "https://openvibe.cam/my/cameras/cam_01JAB2C3D4E5F6G7H8J9K0MNPR"
+}
@@ -30169,13 +30169,108 @@
@@ -30169,13 +30169,108 @@
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://openvibe.network/contracts/network/notification-push-request.v1.json",
"$id": "https://openvibe.network/contracts/network/notification-push-request.v1.json",
"title": "NetworkNotificationPushRequest",
"title": "NetworkNotificationPushRequest",
- "description": "network.notification-push-request@1: bodies of network.notifications.push on OpenVibe.Network (a service token holding the capability, or the internal key). POST /internal/notifications/push: { user_id, type?, title?, message?, … } creates one notification (400 { error: user_id required } without user_id). POST /internal/notifications/push-bulk: { user_ids, …same fields } creates it for each recipient (400 without a non-empty user_ids, or with more than 1000). Recipients are Network user ids. Unknown fields are ignored; 503 when the notification service is not running. The other /internal/notifications/* routes (unread, mark-read, resolve-users) take the internal key only and are not part of this capability.",
+ "description": "network.notification-push-request@1: bodies of network.notifications.push on OpenVibe.Network (a service token holding the capability). POST /internal/notifications/push: { user_id | subject, type?, title?, message?, … } creates one notification (400 without user_id or subject; 404 for an unknown subject). POST /internal/notifications/push-bulk: { user_ids | subjects, …same fields } creates it for each recipient (400 without a non-empty user_ids or subjects, or with more than 1000). Recipients are Network user ids or canonical usr_ subjects; a subject resolves to its account, so a service that knows the person by subject (Vision's consent request, Cam's event alert) need not hold the numeric id. Unknown fields are ignored; 503 when the notification service is not running. The other /internal/notifications/* routes (unread, mark-read, resolve-users) take the internal key only and are not part of this capability.",
"anyOf": [
"anyOf": [
{
{
"type": "object",
"type": "object",
+ "properties": {
+ "user_id": {
+ "type": [
+ "integer",
+ "string"
+ ],
+ "description": "A Network user id (already translated from the caller's own ids)."
+ },
+ "type": {
+ "type": "string",
+ "description": "A notification type from openvibe-shared/notifications (STREAM_LIVE, FOLLOW, MENTION, …); it supplies the default category, priority, icon and title. Stored as GENERIC when absent."
+ },
+ "title": {
+ "type": "string",
+ "description": "Default: the type's title, else \"Notification\"."
+ },
+ "message": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "icon": {
+ "type": "string",
+ "description": "Default: the type's icon."
+ },
+ "sender_id": {
+ "type": [
+ "integer",
+ "string",
+ "null"
+ ],
+ "description": "The actor's Network user id; with no actor_subject, a recipient who blocked this person gets nothing."
+ },
+ "sender_name": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "sender_avatar": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "service": {
+ "type": "string",
+ "description": "The sending service. A service token may only name its own (svc:live → live); anything else is 403 capability.owner_denied."
+ },
+ "url": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "description": "Where the notification leads."
+ },
+ "priority": {
+ "type": "string",
+ "description": "low, normal, high or critical (openvibe-shared PRIORITY); default the type's, else normal."
+ },
+ "category": {
+ "type": "string",
+ "description": "Default: the type's category, else system. A recipient who switched the category off gets nothing; moderation, system and admin notices are never hidden by a block."
+ },
+ "rich_content": {
+ "description": "Any JSON value, stored and returned as given."
+ },
+ "expires_at": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "description": "When it may be deleted (SQLite datetime, UTC)."
+ },
+ "actor_subject": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "pattern": "^usr_",
+ "description": "The actor as a usr_ subject for the block check; null: no known person (no block check)."
+ },
+ "subject": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "pattern": "^usr_[0-9A-HJKMNP-TV-Z]{26}$",
+ "description": "The recipient as a canonical usr_ subject, instead of user_id. It resolves to that person's Network account; an unknown subject is 404 and creates nothing."
+ }
+ },
"required": [
"required": [
"user_id"
"user_id"
- ],
+ ]
+ },
+ {
+ "type": "object",
"properties": {
"properties": {
"user_id": {
"user_id": {
"type": [
"type": [
@@ -30258,14 +30353,128 @@
@@ -30258,14 +30353,128 @@
],
],
"pattern": "^usr_",
"pattern": "^usr_",
"description": "The actor as a usr_ subject for the block check; null: no known person (no block check)."
"description": "The actor as a usr_ subject for the block check; null: no known person (no block check)."
+ },
+ "subject": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "pattern": "^usr_[0-9A-HJKMNP-TV-Z]{26}$",
+ "description": "The recipient as a canonical usr_ subject, instead of user_id. It resolves to that person's Network account; an unknown subject is 404 and creates nothing."
}
}
- }
+ },
+ "required": [
+ "subject"
+ ]
},
},
{
{
"type": "object",
"type": "object",
+ "properties": {
+ "user_ids": {
+ "type": "array",
+ "minItems": 1,
+ "maxItems": 1000,
+ "items": {
+ "type": [
+ "integer",
+ "string"
+ ],
+ "description": "A Network user id (already translated from the caller's own ids)."
+ }
+ },
+ "type": {
+ "type": "string",
+ "description": "A notification type from openvibe-shared/notifications (STREAM_LIVE, FOLLOW, MENTION, …); it supplies the default category, priority, icon and title. Stored as GENERIC when absent."
+ },
+ "title": {
+ "type": "string",
+ "description": "Default: the type's title, else \"Notification\"."
+ },
+ "message": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "icon": {
+ "type": "string",
+ "description": "Default: the type's icon."
+ },
+ "sender_id": {
+ "type": [
+ "integer",
+ "string",
+ "null"
+ ],
+ "description": "The actor's Network user id; with no actor_subject, a recipient who blocked this person gets nothing."
+ },
+ "sender_name": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "sender_avatar": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "service": {
+ "type": "string",
+ "description": "The sending service. A service token may only name its own (svc:live → live); anything else is 403 capability.owner_denied."
+ },
+ "url": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "description": "Where the notification leads."
+ },
+ "priority": {
+ "type": "string",
+ "description": "low, normal, high or critical (openvibe-shared PRIORITY); default the type's, else normal."
+ },
+ "category": {
+ "type": "string",
+ "description": "Default: the type's category, else system. A recipient who switched the category off gets nothing; moderation, system and admin notices are never hidden by a block."
+ },
+ "rich_content": {
+ "description": "Any JSON value, stored and returned as given."
+ },
+ "expires_at": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "description": "When it may be deleted (SQLite datetime, UTC)."
+ },
+ "actor_subject": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "pattern": "^usr_",
+ "description": "The actor as a usr_ subject for the block check; null: no known person (no block check)."
+ },
+ "subjects": {
+ "type": "array",
+ "minItems": 1,
+ "maxItems": 1000,
+ "uniqueItems": true,
+ "items": {
+ "type": "string",
+ "pattern": "^usr_[0-9A-HJKMNP-TV-Z]{26}$"
+ },
+ "description": "Recipients as canonical usr_ subjects, instead of user_ids. Unknown subjects are skipped; at least one recipient is required."
+ }
+ },
"required": [
"required": [
"user_ids"
"user_ids"
- ],
+ ]
+ },
+ {
+ "type": "object",
"properties": {
"properties": {
"user_ids": {
"user_ids": {
"type": "array",
"type": "array",
@@ -30353,8 +30562,22 @@
@@ -30353,8 +30562,22 @@
],
],
"pattern": "^usr_",
"pattern": "^usr_",
"description": "The actor as a usr_ subject for the block check; null: no known person (no block check)."
"description": "The actor as a usr_ subject for the block check; null: no known person (no block check)."
+ },
+ "subjects": {
+ "type": "array",
+ "minItems": 1,
+ "maxItems": 1000,
+ "uniqueItems": true,
+ "items": {
+ "type": "string",
+ "pattern": "^usr_[0-9A-HJKMNP-TV-Z]{26}$"
+ },
+ "description": "Recipients as canonical usr_ subjects, instead of user_ids. Unknown subjects are skipped; at least one recipient is required."
}
}
- }
+ },
+ "required": [
+ "subjects"
+ ]
}
}
]
]
}
}
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Actor API",
"title": "OpenVibe.Actor API",
- "version": "0.258.0",
- "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.258.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.259.0",
+ "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.259.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.AI API",
"title": "OpenVibe.AI API",
- "version": "0.258.0",
- "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.258.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.259.0",
+ "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.259.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Bench API",
"title": "OpenVibe.Bench API",
- "version": "0.258.0",
- "description": "Routes of OpenVibe.Bench as the OpenVibe contracts describe them (openvibe-contracts 0.258.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.259.0",
+ "description": "Routes of OpenVibe.Bench as the OpenVibe contracts describe them (openvibe-contracts 0.259.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Billing API",
"title": "OpenVibe.Billing API",
- "version": "0.258.0",
- "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.258.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.259.0",
+ "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.259.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Blog API",
"title": "OpenVibe.Blog API",
- "version": "0.258.0",
- "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.258.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.259.0",
+ "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.259.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Bot API",
"title": "OpenVibe.Bot API",
- "version": "0.258.0",
- "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.258.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.259.0",
+ "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.259.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Chat API",
"title": "OpenVibe.Chat API",
- "version": "0.258.0",
- "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.258.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.259.0",
+ "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.259.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Codes API",
"title": "OpenVibe.Codes API",
- "version": "0.258.0",
- "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.258.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.259.0",
+ "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.259.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Community API",
"title": "OpenVibe.Community API",
- "version": "0.258.0",
- "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.258.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.259.0",
+ "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.259.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Coupons API",
"title": "OpenVibe.Coupons API",
- "version": "0.258.0",
- "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.258.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.259.0",
+ "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.259.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Deals API",
"title": "OpenVibe.Deals API",
- "version": "0.258.0",
- "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.258.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.259.0",
+ "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.259.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Domains API",
"title": "OpenVibe.Domains API",
- "version": "0.258.0",
- "description": "Routes of OpenVibe.Domains as the OpenVibe contracts describe them (openvibe-contracts 0.258.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.259.0",
+ "description": "Routes of OpenVibe.Domains as the OpenVibe contracts describe them (openvibe-contracts 0.259.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Events API",
"title": "OpenVibe.Events API",
- "version": "0.258.0",
- "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.258.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.259.0",
+ "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.259.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Food API",
"title": "OpenVibe.Food API",
- "version": "0.258.0",
- "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.258.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.259.0",
+ "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.259.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Games API",
"title": "OpenVibe.Games API",
- "version": "0.258.0",
- "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.258.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.259.0",
+ "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.259.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Host API",
"title": "OpenVibe.Host API",
- "version": "0.258.0",
- "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.258.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.259.0",
+ "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.259.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Inventory API",
"title": "OpenVibe.Inventory API",
- "version": "0.258.0",
- "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.258.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.259.0",
+ "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.259.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Live API",
"title": "OpenVibe.Live API",
- "version": "0.258.0",
- "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.258.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.259.0",
+ "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.259.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.MediaHub API",
"title": "OpenVibe.MediaHub API",
- "version": "0.258.0",
- "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.258.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.259.0",
+ "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.259.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Media API",
"title": "OpenVibe.Media API",
- "version": "0.258.0",
- "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.258.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.259.0",
+ "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.259.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Network API",
"title": "OpenVibe.Network API",
- "version": "0.258.0",
- "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.258.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.259.0",
+ "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.259.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -5201,13 +5201,108 @@
@@ -5201,13 +5201,108 @@
},
},
"network.notification-push-request.v1": {
"network.notification-push-request.v1": {
"title": "NetworkNotificationPushRequest",
"title": "NetworkNotificationPushRequest",
- "description": "network.notification-push-request@1: bodies of network.notifications.push on OpenVibe.Network (a service token holding the capability, or the internal key). POST /internal/notifications/push: { user_id, type?, title?, message?, … } creates one notification (400 { error: user_id required } without user_id). POST /internal/notifications/push-bulk: { user_ids, …same fields } creates it for each recipient (400 without a non-empty user_ids, or with more than 1000). Recipients are Network user ids. Unknown fields are ignored; 503 when the notification service is not running. The other /internal/notifications/* routes (unread, mark-read, resolve-users) take the internal key only and are not part of this capability.",
+ "description": "network.notification-push-request@1: bodies of network.notifications.push on OpenVibe.Network (a service token holding the capability). POST /internal/notifications/push: { user_id | subject, type?, title?, message?, … } creates one notification (400 without user_id or subject; 404 for an unknown subject). POST /internal/notifications/push-bulk: { user_ids | subjects, …same fields } creates it for each recipient (400 without a non-empty user_ids or subjects, or with more than 1000). Recipients are Network user ids or canonical usr_ subjects; a subject resolves to its account, so a service that knows the person by subject (Vision's consent request, Cam's event alert) need not hold the numeric id. Unknown fields are ignored; 503 when the notification service is not running. The other /internal/notifications/* routes (unread, mark-read, resolve-users) take the internal key only and are not part of this capability.",
"anyOf": [
"anyOf": [
{
{
"type": "object",
"type": "object",
+ "properties": {
+ "user_id": {
+ "type": [
+ "integer",
+ "string"
+ ],
+ "description": "A Network user id (already translated from the caller's own ids)."
+ },
+ "type": {
+ "type": "string",
+ "description": "A notification type from openvibe-shared/notifications (STREAM_LIVE, FOLLOW, MENTION, …); it supplies the default category, priority, icon and title. Stored as GENERIC when absent."
+ },
+ "title": {
+ "type": "string",
+ "description": "Default: the type's title, else \"Notification\"."
+ },
+ "message": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "icon": {
+ "type": "string",
+ "description": "Default: the type's icon."
+ },
+ "sender_id": {
+ "type": [
+ "integer",
+ "string",
+ "null"
+ ],
+ "description": "The actor's Network user id; with no actor_subject, a recipient who blocked this person gets nothing."
+ },
+ "sender_name": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "sender_avatar": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "service": {
+ "type": "string",
+ "description": "The sending service. A service token may only name its own (svc:live → live); anything else is 403 capability.owner_denied."
+ },
+ "url": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "description": "Where the notification leads."
+ },
+ "priority": {
+ "type": "string",
+ "description": "low, normal, high or critical (openvibe-shared PRIORITY); default the type's, else normal."
+ },
+ "category": {
+ "type": "string",
+ "description": "Default: the type's category, else system. A recipient who switched the category off gets nothing; moderation, system and admin notices are never hidden by a block."
+ },
+ "rich_content": {
+ "description": "Any JSON value, stored and returned as given."
+ },
+ "expires_at": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "description": "When it may be deleted (SQLite datetime, UTC)."
+ },
+ "actor_subject": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "pattern": "^usr_",
+ "description": "The actor as a usr_ subject for the block check; null: no known person (no block check)."
+ },
+ "subject": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "pattern": "^usr_[0-9A-HJKMNP-TV-Z]{26}$",
+ "description": "The recipient as a canonical usr_ subject, instead of user_id. It resolves to that person's Network account; an unknown subject is 404 and creates nothing."
+ }
+ },
"required": [
"required": [
"user_id"
"user_id"
- ],
+ ]
+ },
+ {
+ "type": "object",
"properties": {
"properties": {
"user_id": {
"user_id": {
"type": [
"type": [
@@ -5290,14 +5385,128 @@
@@ -5290,14 +5385,128 @@
],
],
"pattern": "^usr_",
"pattern": "^usr_",
"description": "The actor as a usr_ subject for the block check; null: no known person (no block check)."
"description": "The actor as a usr_ subject for the block check; null: no known person (no block check)."
+ },
+ "subject": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "pattern": "^usr_[0-9A-HJKMNP-TV-Z]{26}$",
+ "description": "The recipient as a canonical usr_ subject, instead of user_id. It resolves to that person's Network account; an unknown subject is 404 and creates nothing."
}
}
- }
+ },
+ "required": [
+ "subject"
+ ]
},
},
{
{
"type": "object",
"type": "object",
+ "properties": {
+ "user_ids": {
+ "type": "array",
+ "minItems": 1,
+ "maxItems": 1000,
+ "items": {
+ "type": [
+ "integer",
+ "string"
+ ],
+ "description": "A Network user id (already translated from the caller's own ids)."
+ }
+ },
+ "type": {
+ "type": "string",
+ "description": "A notification type from openvibe-shared/notifications (STREAM_LIVE, FOLLOW, MENTION, …); it supplies the default category, priority, icon and title. Stored as GENERIC when absent."
+ },
+ "title": {
+ "type": "string",
+ "description": "Default: the type's title, else \"Notification\"."
+ },
+ "message": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "icon": {
+ "type": "string",
+ "description": "Default: the type's icon."
+ },
+ "sender_id": {
+ "type": [
+ "integer",
+ "string",
+ "null"
+ ],
+ "description": "The actor's Network user id; with no actor_subject, a recipient who blocked this person gets nothing."
+ },
+ "sender_name": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "sender_avatar": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "service": {
+ "type": "string",
+ "description": "The sending service. A service token may only name its own (svc:live → live); anything else is 403 capability.owner_denied."
+ },
+ "url": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "description": "Where the notification leads."
+ },
+ "priority": {
+ "type": "string",
+ "description": "low, normal, high or critical (openvibe-shared PRIORITY); default the type's, else normal."
+ },
+ "category": {
+ "type": "string",
+ "description": "Default: the type's category, else system. A recipient who switched the category off gets nothing; moderation, system and admin notices are never hidden by a block."
+ },
+ "rich_content": {
+ "description": "Any JSON value, stored and returned as given."
+ },
+ "expires_at": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "description": "When it may be deleted (SQLite datetime, UTC)."
+ },
+ "actor_subject": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "pattern": "^usr_",
+ "description": "The actor as a usr_ subject for the block check; null: no known person (no block check)."
+ },
+ "subjects": {
+ "type": "array",
+ "minItems": 1,
+ "maxItems": 1000,
+ "uniqueItems": true,
+ "items": {
+ "type": "string",
+ "pattern": "^usr_[0-9A-HJKMNP-TV-Z]{26}$"
+ },
+ "description": "Recipients as canonical usr_ subjects, instead of user_ids. Unknown subjects are skipped; at least one recipient is required."
+ }
+ },
"required": [
"required": [
"user_ids"
"user_ids"
- ],
+ ]
+ },
+ {
+ "type": "object",
"properties": {
"properties": {
"user_ids": {
"user_ids": {
"type": "array",
"type": "array",
@@ -5385,8 +5594,22 @@
@@ -5385,8 +5594,22 @@
],
],
"pattern": "^usr_",
"pattern": "^usr_",
"description": "The actor as a usr_ subject for the block check; null: no known person (no block check)."
"description": "The actor as a usr_ subject for the block check; null: no known person (no block check)."
+ },
+ "subjects": {
+ "type": "array",
+ "minItems": 1,
+ "maxItems": 1000,
+ "uniqueItems": true,
+ "items": {
+ "type": "string",
+ "pattern": "^usr_[0-9A-HJKMNP-TV-Z]{26}$"
+ },
+ "description": "Recipients as canonical usr_ subjects, instead of user_ids. Unknown subjects are skipped; at least one recipient is required."
}
}
- }
+ },
+ "required": [
+ "subjects"
+ ]
}
}
]
]
},
},
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.News API",
"title": "OpenVibe.News API",
- "version": "0.258.0",
- "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.258.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.259.0",
+ "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.259.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenRestream API",
"title": "OpenRestream API",
- "version": "0.258.0",
- "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.258.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.259.0",
+ "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.259.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Play API",
"title": "OpenVibe.Play API",
- "version": "0.258.0",
- "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.258.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.259.0",
+ "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.259.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Quest API",
"title": "OpenVibe.Quest API",
- "version": "0.258.0",
- "description": "Routes of OpenVibe.Quest as the OpenVibe contracts describe them (openvibe-contracts 0.258.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.259.0",
+ "description": "Routes of OpenVibe.Quest as the OpenVibe contracts describe them (openvibe-contracts 0.259.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Reviews API",
"title": "OpenVibe.Reviews API",
- "version": "0.258.0",
- "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.258.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.259.0",
+ "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.259.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Run API",
"title": "OpenVibe.Run API",
- "version": "0.258.0",
- "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.258.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.259.0",
+ "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.259.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Search API",
"title": "OpenVibe.Search API",
- "version": "0.258.0",
- "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.258.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.259.0",
+ "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.259.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Services API",
"title": "OpenVibe.Services API",
- "version": "0.258.0",
- "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.258.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.259.0",
+ "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.259.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Sources API",
"title": "OpenVibe.Sources API",
- "version": "0.258.0",
- "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.258.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.259.0",
+ "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.259.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Space API",
"title": "OpenVibe.Space API",
- "version": "0.258.0",
- "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.258.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.259.0",
+ "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.259.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Tips API",
"title": "OpenVibe.Tips API",
- "version": "0.258.0",
- "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.258.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.259.0",
+ "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.259.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Tools API",
"title": "OpenVibe.Tools API",
- "version": "0.258.0",
- "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.258.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.259.0",
+ "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.259.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Trade API",
"title": "OpenVibe.Trade API",
- "version": "0.258.0",
- "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.258.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.259.0",
+ "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.259.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.VIP API",
"title": "OpenVibe.VIP API",
- "version": "0.258.0",
- "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.258.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.259.0",
+ "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.259.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Vision API",
"title": "OpenVibe.Vision API",
- "version": "0.258.0",
- "description": "Routes of OpenVibe.Vision as the OpenVibe contracts describe them (openvibe-contracts 0.258.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.259.0",
+ "description": "Routes of OpenVibe.Vision as the OpenVibe contracts describe them (openvibe-contracts 0.259.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Watch API",
"title": "OpenVibe.Watch API",
- "version": "0.258.0",
- "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.258.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.259.0",
+ "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.259.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Wiki API",
"title": "OpenVibe.Wiki API",
- "version": "0.258.0",
- "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.258.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.259.0",
+ "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.259.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Work API",
"title": "OpenVibe.Work API",
- "version": "0.258.0",
- "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.258.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.259.0",
+ "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.259.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Zone API",
"title": "OpenVibe.Zone API",
- "version": "0.258.0",
- "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.258.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.259.0",
+ "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.259.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -168444,7 +168444,7 @@ export interface NetworkGithubTokenResult {
@@ -168444,7 +168444,7 @@ export interface NetworkGithubTokenResult {
/** [email protected] (owner: network) */
/** [email protected] (owner: network) */
/**
/**
- * network.notification-push-request@1: bodies of network.notifications.push on OpenVibe.Network (a service token holding the capability, or the internal key). POST /internal/notifications/push: { user_id, type?, title?, message?, … } creates one notification (400 { error: user_id required } without user_id). POST /internal/notifications/push-bulk: { user_ids, …same fields } creates it for each recipient (400 without a non-empty user_ids, or with more than 1000). Recipients are Network user ids. Unknown fields are ignored; 503 when the notification service is not running. The other /internal/notifications/* routes (unread, mark-read, resolve-users) take the internal key only and are not part of this capability.
+ * network.notification-push-request@1: bodies of network.notifications.push on OpenVibe.Network (a service token holding the capability). POST /internal/notifications/push: { user_id | subject, type?, title?, message?, … } creates one notification (400 without user_id or subject; 404 for an unknown subject). POST /internal/notifications/push-bulk: { user_ids | subjects, …same fields } creates it for each recipient (400 without a non-empty user_ids or subjects, or with more than 1000). Recipients are Network user ids or canonical usr_ subjects; a subject resolves to its account, so a service that knows the person by subject (Vision's consent request, Cam's event alert) need not hold the numeric id. Unknown fields are ignored; 503 when the notification service is not running. The other /internal/notifications/* routes (unread, mark-read, resolve-users) take the internal key only and are not part of this capability.
*/
*/
export type NetworkNotificationPushRequest =
export type NetworkNotificationPushRequest =
| {
| {
@@ -168501,6 +168501,69 @@ export type NetworkNotificationPushRequest =
@@ -168501,6 +168501,69 @@ export type NetworkNotificationPushRequest =
* The actor as a usr_ subject for the block check; null: no known person (no block check).
* The actor as a usr_ subject for the block check; null: no known person (no block check).
*/
*/
actor_subject?: string | null;
actor_subject?: string | null;
+ /**
+ * The recipient as a canonical usr_ subject, instead of user_id. It resolves to that person's Network account; an unknown subject is 404 and creates nothing.
+ */
+ subject?: string | null;
+ }
+ | {
+ /**
+ * A Network user id (already translated from the caller's own ids).
+ */
+ user_id?: number | string;
+ /**
+ * A notification type from openvibe-shared/notifications (STREAM_LIVE, FOLLOW, MENTION, …); it supplies the default category, priority, icon and title. Stored as GENERIC when absent.
+ */
+ type?: string;
+ /**
+ * Default: the type's title, else "Notification".
+ */
+ title?: string;
+ message?: string | null;
+ /**
+ * Default: the type's icon.
+ */
+ icon?: string;
+ /**
+ * The actor's Network user id; with no actor_subject, a recipient who blocked this person gets nothing.
+ */
+ sender_id?: number | string | null;
+ sender_name?: string | null;
+ sender_avatar?: string | null;
+ /**
+ * The sending service. A service token may only name its own (svc:live → live); anything else is 403 capability.owner_denied.
+ */
+ service?: string;
+ /**
+ * Where the notification leads.
+ */
+ url?: string | null;
+ /**
+ * low, normal, high or critical (openvibe-shared PRIORITY); default the type's, else normal.
+ */
+ priority?: string;
+ /**
+ * Default: the type's category, else system. A recipient who switched the category off gets nothing; moderation, system and admin notices are never hidden by a block.
+ */
+ category?: string;
+ /**
+ * Any JSON value, stored and returned as given.
+ */
+ rich_content?: {
+ [k: string]: unknown | undefined;
+ };
+ /**
+ * When it may be deleted (SQLite datetime, UTC).
+ */
+ expires_at?: string | null;
+ /**
+ * The actor as a usr_ subject for the block check; null: no known person (no block check).
+ */
+ actor_subject?: string | null;
+ /**
+ * The recipient as a canonical usr_ subject, instead of user_id. It resolves to that person's Network account; an unknown subject is 404 and creates nothing.
+ */
+ subject: string | null;
}
}
| {
| {
/**
/**
@@ -168557,6 +168620,76 @@ export type NetworkNotificationPushRequest =
@@ -168557,6 +168620,76 @@ export type NetworkNotificationPushRequest =
* The actor as a usr_ subject for the block check; null: no known person (no block check).
* The actor as a usr_ subject for the block check; null: no known person (no block check).
*/
*/
actor_subject?: string | null;
actor_subject?: string | null;
+ /**
+ * Recipients as canonical usr_ subjects, instead of user_ids. Unknown subjects are skipped; at least one recipient is required.
+ *
+ * @minItems 1
+ * @maxItems 1000
+ */
+ subjects?: [string, ...string[]];
+ }
+ | {
+ /**
+ * @minItems 1
+ * @maxItems 1000
+ */
+ user_ids?: [number | string, ...(number | string)[]];
+ /**
+ * A notification type from openvibe-shared/notifications (STREAM_LIVE, FOLLOW, MENTION, …); it supplies the default category, priority, icon and title. Stored as GENERIC when absent.
+ */
+ type?: string;
+ /**
+ * Default: the type's title, else "Notification".
+ */
+ title?: string;
+ message?: string | null;
+ /**
+ * Default: the type's icon.
+ */
+ icon?: string;
+ /**
+ * The actor's Network user id; with no actor_subject, a recipient who blocked this person gets nothing.
+ */
+ sender_id?: number | string | null;
+ sender_name?: string | null;
+ sender_avatar?: string | null;
+ /**
+ * The sending service. A service token may only name its own (svc:live → live); anything else is 403 capability.owner_denied.
+ */
+ service?: string;
+ /**
+ * Where the notification leads.
+ */
+ url?: string | null;
+ /**
+ * low, normal, high or critical (openvibe-shared PRIORITY); default the type's, else normal.
+ */
+ priority?: string;
+ /**
+ * Default: the type's category, else system. A recipient who switched the category off gets nothing; moderation, system and admin notices are never hidden by a block.
+ */
+ category?: string;
+ /**
+ * Any JSON value, stored and returned as given.
+ */
+ rich_content?: {
+ [k: string]: unknown | undefined;
+ };
+ /**
+ * When it may be deleted (SQLite datetime, UTC).
+ */
+ expires_at?: string | null;
+ /**
+ * The actor as a usr_ subject for the block check; null: no known person (no block check).
+ */
+ actor_subject?: string | null;
+ /**
+ * Recipients as canonical usr_ subjects, instead of user_ids. Unknown subjects are skipped; at least one recipient is required.
+ *
+ * @minItems 1
+ * @maxItems 1000
+ */
+ subjects: [string, ...string[]];
};
};
/** [email protected] (owner: network) */
/** [email protected] (owner: network) */
@@ -1,12 +1,12 @@
@@ -1,12 +1,12 @@
{
{
"name": "openvibe-contracts",
"name": "openvibe-contracts",
- "version": "0.252.0",
+ "version": "0.259.0",
"lockfileVersion": 3,
"lockfileVersion": 3,
"requires": true,
"requires": true,
"packages": {
"packages": {
"": {
"": {
"name": "openvibe-contracts",
"name": "openvibe-contracts",
- "version": "0.252.0",
+ "version": "0.259.0",
"license": "AGPL-3.0-only",
"license": "AGPL-3.0-only",
"dependencies": {
"dependencies": {
"ajv": "^8.17.1",
"ajv": "^8.17.1",
@@ -1,6 +1,6 @@
@@ -1,6 +1,6 @@
{
{
"name": "openvibe-contracts",
"name": "openvibe-contracts",
- "version": "0.258.0",
+ "version": "0.259.0",
"description": "Machine-readable contracts for the OpenVibe network: schemas, manifests, ids, error envelope, capability checks.",
"description": "Machine-readable contracts for the OpenVibe network: schemas, manifests, ids, error envelope, capability checks.",
"main": "index.js",
"main": "index.js",
"types": "generated/typescript/index.d.ts",
"types": "generated/typescript/index.d.ts",