openvibers/openvibe.contracts Commits

0.257.0: notification push accepts a canonical subject (#266)

OP OpenVibers committed 13 days ago · 1b5bc72bb5 · 48 files, +931 −103

* 0.257.0: notification push accepts a canonical subject

F1's Vision consent request and Cam event alert know the person's usr_ subject, not the numeric Network user id. The request contract now allows { subject } and { subjects } alongside user_id and user_ids; unknown subjects are 404 on push and skipped in bulk.

* 0.259.0: notification push accepts a canonical subject

Changes

ddiff --git a/CHANGELOG.md b/CHANGELOG.md
iindex 6c1ae236..40555261 100644
---- a/CHANGELOG.md
++++ b/CHANGELOG.md
@@@ -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.
ddiff --git a/contracts/network/notification-push-request.v1.json b/contracts/network/notification-push-request.v1.json
iindex 18021b41..9f2832d2 100644
---- a/contracts/network/notification-push-request.v1.json
++++ b/contracts/network/notification-push-request.v1.json
@@@ -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"
++ ]
}
]
}
ddiff --git a/fixtures/network.notification-push-request/valid/push-bulk-subjects.json b/fixtures/network.notification-push-request/valid/push-bulk-subjects.json
nnew file mode 100644
iindex 00000000..1ee3710e
---- /dev/null
++++ b/fixtures/network.notification-push-request/valid/push-bulk-subjects.json
@@@ -0,0 +1,8 @@
++{
++ "subjects": [
++ "usr_01JAB2C3D4E5F6G7H8J9K0MNPR",
++ "usr_01JAB2C3D4E5F6G7H8J9K0MNPQ"
++ ],
++ "title": "A camera has news",
++ "service": "cam"
++}
ddiff --git a/fixtures/network.notification-push-request/valid/push-by-subject.json b/fixtures/network.notification-push-request/valid/push-by-subject.json
nnew file mode 100644
iindex 00000000..6b44b7d8
---- /dev/null
++++ b/fixtures/network.notification-push-request/valid/push-by-subject.json
@@@ -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"
++}
ddiff --git a/generated/json-schema/bundle.json b/generated/json-schema/bundle.json
iindex 0875ac75..73309472 100644
---- a/generated/json-schema/bundle.json
++++ b/generated/json-schema/bundle.json
@@@ -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"
++ ]
}
]
}
ddiff --git a/generated/openapi/actor.json b/generated/openapi/actor.json
iindex 025e58f1..5add8c56 100644
---- a/generated/openapi/actor.json
++++ b/generated/openapi/actor.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Actor API",
-- "version": "0.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"
ddiff --git a/generated/openapi/ai.json b/generated/openapi/ai.json
iindex f4cd383e..1139a395 100644
---- a/generated/openapi/ai.json
++++ b/generated/openapi/ai.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.AI API",
-- "version": "0.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"
ddiff --git a/generated/openapi/bench.json b/generated/openapi/bench.json
iindex a4e92f93..6efa4094 100644
---- a/generated/openapi/bench.json
++++ b/generated/openapi/bench.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Bench API",
-- "version": "0.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"
ddiff --git a/generated/openapi/billing.json b/generated/openapi/billing.json
iindex 14af5709..1bddd43d 100644
---- a/generated/openapi/billing.json
++++ b/generated/openapi/billing.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Billing API",
-- "version": "0.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"
ddiff --git a/generated/openapi/blog.json b/generated/openapi/blog.json
iindex 69d960eb..efc6cdec 100644
---- a/generated/openapi/blog.json
++++ b/generated/openapi/blog.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Blog API",
-- "version": "0.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"
ddiff --git a/generated/openapi/bot.json b/generated/openapi/bot.json
iindex 9fe78fe9..960e9d5c 100644
---- a/generated/openapi/bot.json
++++ b/generated/openapi/bot.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Bot API",
-- "version": "0.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"
ddiff --git a/generated/openapi/chat.json b/generated/openapi/chat.json
iindex e40734cf..b1dd0f73 100644
---- a/generated/openapi/chat.json
++++ b/generated/openapi/chat.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Chat API",
-- "version": "0.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"
ddiff --git a/generated/openapi/codes.json b/generated/openapi/codes.json
iindex 2044f5d1..19cf8105 100644
---- a/generated/openapi/codes.json
++++ b/generated/openapi/codes.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Codes API",
-- "version": "0.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"
ddiff --git a/generated/openapi/community.json b/generated/openapi/community.json
iindex bf9e4730..0537f1b5 100644
---- a/generated/openapi/community.json
++++ b/generated/openapi/community.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Community API",
-- "version": "0.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"
ddiff --git a/generated/openapi/coupons.json b/generated/openapi/coupons.json
iindex b6fe2443..20f903f6 100644
---- a/generated/openapi/coupons.json
++++ b/generated/openapi/coupons.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Coupons API",
-- "version": "0.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"
ddiff --git a/generated/openapi/deals.json b/generated/openapi/deals.json
iindex 0d912481..0b81422d 100644
---- a/generated/openapi/deals.json
++++ b/generated/openapi/deals.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Deals API",
-- "version": "0.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"
ddiff --git a/generated/openapi/domains.json b/generated/openapi/domains.json
iindex e9eb3763..264e2b3e 100644
---- a/generated/openapi/domains.json
++++ b/generated/openapi/domains.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Domains API",
-- "version": "0.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"
ddiff --git a/generated/openapi/events.json b/generated/openapi/events.json
iindex 67f7221b..dd554407 100644
---- a/generated/openapi/events.json
++++ b/generated/openapi/events.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Events API",
-- "version": "0.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"
ddiff --git a/generated/openapi/food.json b/generated/openapi/food.json
iindex a604d11e..e560db2a 100644
---- a/generated/openapi/food.json
++++ b/generated/openapi/food.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Food API",
-- "version": "0.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"
ddiff --git a/generated/openapi/games.json b/generated/openapi/games.json
iindex 1a4ef4bc..755433ca 100644
---- a/generated/openapi/games.json
++++ b/generated/openapi/games.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Games API",
-- "version": "0.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"
ddiff --git a/generated/openapi/host.json b/generated/openapi/host.json
iindex 0e950c4d..cdd71a78 100644
---- a/generated/openapi/host.json
++++ b/generated/openapi/host.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Host API",
-- "version": "0.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"
ddiff --git a/generated/openapi/inventory.json b/generated/openapi/inventory.json
iindex 40374439..d660ef49 100644
---- a/generated/openapi/inventory.json
++++ b/generated/openapi/inventory.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Inventory API",
-- "version": "0.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"
ddiff --git a/generated/openapi/live.json b/generated/openapi/live.json
iindex a77785d8..61f0c156 100644
---- a/generated/openapi/live.json
++++ b/generated/openapi/live.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Live API",
-- "version": "0.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"
ddiff --git a/generated/openapi/media-hub.json b/generated/openapi/media-hub.json
iindex 6da98ca8..267009e9 100644
---- a/generated/openapi/media-hub.json
++++ b/generated/openapi/media-hub.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.MediaHub API",
-- "version": "0.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"
ddiff --git a/generated/openapi/media.json b/generated/openapi/media.json
iindex f87b337a..7585a3d4 100644
---- a/generated/openapi/media.json
++++ b/generated/openapi/media.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Media API",
-- "version": "0.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"
ddiff --git a/generated/openapi/network.json b/generated/openapi/network.json
iindex bb82d3b5..68043703 100644
---- a/generated/openapi/network.json
++++ b/generated/openapi/network.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Network API",
-- "version": "0.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"
++ ]
}
]
},
ddiff --git a/generated/openapi/news.json b/generated/openapi/news.json
iindex e4d9f9cc..f593f2e7 100644
---- a/generated/openapi/news.json
++++ b/generated/openapi/news.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.News API",
-- "version": "0.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"
ddiff --git a/generated/openapi/openre.json b/generated/openapi/openre.json
iindex 92981815..cfc9912e 100644
---- a/generated/openapi/openre.json
++++ b/generated/openapi/openre.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenRestream API",
-- "version": "0.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"
ddiff --git a/generated/openapi/play.json b/generated/openapi/play.json
iindex 6e724e54..56aacf5f 100644
---- a/generated/openapi/play.json
++++ b/generated/openapi/play.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Play API",
-- "version": "0.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"
ddiff --git a/generated/openapi/quest.json b/generated/openapi/quest.json
iindex e7d0cb37..5accff87 100644
---- a/generated/openapi/quest.json
++++ b/generated/openapi/quest.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Quest API",
-- "version": "0.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"
ddiff --git a/generated/openapi/reviews.json b/generated/openapi/reviews.json
iindex 45f0e2c3..4dd847ae 100644
---- a/generated/openapi/reviews.json
++++ b/generated/openapi/reviews.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Reviews API",
-- "version": "0.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"
ddiff --git a/generated/openapi/run.json b/generated/openapi/run.json
iindex eb05b1e7..7fce6c3b 100644
---- a/generated/openapi/run.json
++++ b/generated/openapi/run.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Run API",
-- "version": "0.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"
ddiff --git a/generated/openapi/search.json b/generated/openapi/search.json
iindex 5ad146fd..eb1ef932 100644
---- a/generated/openapi/search.json
++++ b/generated/openapi/search.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Search API",
-- "version": "0.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"
ddiff --git a/generated/openapi/services.json b/generated/openapi/services.json
iindex 81006548..3b9e43c8 100644
---- a/generated/openapi/services.json
++++ b/generated/openapi/services.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Services API",
-- "version": "0.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"
ddiff --git a/generated/openapi/sources.json b/generated/openapi/sources.json
iindex 551f9eb8..36aa888a 100644
---- a/generated/openapi/sources.json
++++ b/generated/openapi/sources.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Sources API",
-- "version": "0.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"
ddiff --git a/generated/openapi/space.json b/generated/openapi/space.json
iindex 2631c602..de28509b 100644
---- a/generated/openapi/space.json
++++ b/generated/openapi/space.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Space API",
-- "version": "0.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"
ddiff --git a/generated/openapi/tips.json b/generated/openapi/tips.json
iindex 33a3ea5f..c55b228e 100644
---- a/generated/openapi/tips.json
++++ b/generated/openapi/tips.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Tips API",
-- "version": "0.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"
ddiff --git a/generated/openapi/tools.json b/generated/openapi/tools.json
iindex 9e74a412..f02dc430 100644
---- a/generated/openapi/tools.json
++++ b/generated/openapi/tools.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Tools API",
-- "version": "0.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"
ddiff --git a/generated/openapi/trade.json b/generated/openapi/trade.json
iindex 4154fdc7..8bbe4de9 100644
---- a/generated/openapi/trade.json
++++ b/generated/openapi/trade.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Trade API",
-- "version": "0.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"
ddiff --git a/generated/openapi/vip.json b/generated/openapi/vip.json
iindex f200926f..662d03b8 100644
---- a/generated/openapi/vip.json
++++ b/generated/openapi/vip.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.VIP API",
-- "version": "0.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"
ddiff --git a/generated/openapi/vision.json b/generated/openapi/vision.json
iindex d91a9614..76caa3f8 100644
---- a/generated/openapi/vision.json
++++ b/generated/openapi/vision.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Vision API",
-- "version": "0.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"
ddiff --git a/generated/openapi/watch.json b/generated/openapi/watch.json
iindex 62a70e93..c1034f50 100644
---- a/generated/openapi/watch.json
++++ b/generated/openapi/watch.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Watch API",
-- "version": "0.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"
ddiff --git a/generated/openapi/wiki.json b/generated/openapi/wiki.json
iindex c8535694..848b6b5c 100644
---- a/generated/openapi/wiki.json
++++ b/generated/openapi/wiki.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Wiki API",
-- "version": "0.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"
ddiff --git a/generated/openapi/work.json b/generated/openapi/work.json
iindex 04f39fbb..1a6b67e2 100644
---- a/generated/openapi/work.json
++++ b/generated/openapi/work.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Work API",
-- "version": "0.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"
ddiff --git a/generated/openapi/zone.json b/generated/openapi/zone.json
iindex 788bf851..9c1b4f2e 100644
---- a/generated/openapi/zone.json
++++ b/generated/openapi/zone.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Zone API",
-- "version": "0.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"
ddiff --git a/generated/typescript/index.d.ts b/generated/typescript/index.d.ts
iindex 9b03f4da..3dbee589 100644
---- a/generated/typescript/index.d.ts
++++ b/generated/typescript/index.d.ts
@@@ -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) */
ddiff --git a/package-lock.json b/package-lock.json
iindex 618470bb..5e136a1e 100644
---- a/package-lock.json
++++ b/package-lock.json
@@@ -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",
ddiff --git a/package.json b/package.json
iindex 0bc02a05..10db029c 100644
---- a/package.json
++++ b/package.json
@@@ -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",