openvibers/openvibe.contracts Commits

v0.35.0: community.paste.created|updated|deleted, community.thread.created, community.post.created and community.comment.created payload contracts; community manifest 0.2.0 lists them

OP OpenVibers committed 24 Sept 2026 · f3f251169a · 25 files, +967 −5


Changes

ddiff --git a/CHANGELOG.md b/CHANGELOG.md
iindex 3d5f0ba7..833aa09b 100644
---- a/CHANGELOG.md
++++ b/CHANGELOG.md
@@@ -4,6 +4,13 @@ All notable changes to `openvibe-contracts`. Releases are git tags (`vX.Y.Z`) th
from `https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/<tag>`. Before v0.30.0,
the notes were in the tag and commit messages (`git tag -n1`).
++## 0.35.0 — 2026-09-24
++
++- OpenVibe.Community publishes events: `community.paste.created|updated|deleted`, `community.thread.created`,
++ `community.post.created`, `community.comment.created` (payload contracts with fixtures; the community manifest
++ 0.2.0 lists them). Payloads carry ids, owner or author subject, visibility and the public URL, never a body,
++ title or content: consumers (Search, Pulse, Live's Content feed) read the item itself.
++
## 0.34.3 — 2026-09-24
- `openvibe-contracts-check` skips `*.test.*` and `*.spec.*` files: tests mint tokens carrying other owners'
ddiff --git a/contracts/catalog.json b/contracts/catalog.json
iindex 056dd748..15270105 100644
---- a/contracts/catalog.json
++++ b/contracts/catalog.json
@@@ -1391,6 +1391,60 @@
"visibility": "first-party",
"compatibility": "backward",
"status": "active"
++ },
++ {
++ "id": "community.paste.created",
++ "version": "1.0.0",
++ "owner": "community",
++ "schema": "events/payloads/community.paste.created.v1.json",
++ "visibility": "first-party",
++ "compatibility": "backward",
++ "status": "active"
++ },
++ {
++ "id": "community.paste.updated",
++ "version": "1.0.0",
++ "owner": "community",
++ "schema": "events/payloads/community.paste.updated.v1.json",
++ "visibility": "first-party",
++ "compatibility": "backward",
++ "status": "active"
++ },
++ {
++ "id": "community.paste.deleted",
++ "version": "1.0.0",
++ "owner": "community",
++ "schema": "events/payloads/community.paste.deleted.v1.json",
++ "visibility": "first-party",
++ "compatibility": "backward",
++ "status": "active"
++ },
++ {
++ "id": "community.thread.created",
++ "version": "1.0.0",
++ "owner": "community",
++ "schema": "events/payloads/community.thread.created.v1.json",
++ "visibility": "first-party",
++ "compatibility": "backward",
++ "status": "active"
++ },
++ {
++ "id": "community.post.created",
++ "version": "1.0.0",
++ "owner": "community",
++ "schema": "events/payloads/community.post.created.v1.json",
++ "visibility": "first-party",
++ "compatibility": "backward",
++ "status": "active"
++ },
++ {
++ "id": "community.comment.created",
++ "version": "1.0.0",
++ "owner": "community",
++ "schema": "events/payloads/community.comment.created.v1.json",
++ "visibility": "first-party",
++ "compatibility": "backward",
++ "status": "active"
}
]
}
ddiff --git a/contracts/events/payloads/community.comment.created.v1.json b/contracts/events/payloads/community.comment.created.v1.json
nnew file mode 100644
iindex 00000000..2338bf7d
---- /dev/null
++++ b/contracts/events/payloads/community.comment.created.v1.json
@@@ -0,0 +1,76 @@
++{
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/events/payloads/community.comment.created.v1.json",
++ "title": "CommunityCommentCreatedPayload",
++ "description": "community.comment.created v1 (OpenVibe.Community server/events.js, queued in the transaction of the change). A comment was added to a comment thread attached to something on another service (a Live VOD or clip, a channel) or to a paste. Never the body. Envelope: subject { type: comment, id }, visibility public when the item is public else internal, priority low, actor the person or service:community.",
++ "type": "object",
++ "required": [
++ "comment_id",
++ "thread_access_id",
++ "ref",
++ "author",
++ "visibility",
++ "url"
++ ],
++ "additionalProperties": false,
++ "properties": {
++ "comment_id": {
++ "type": "integer",
++ "minimum": 1
++ },
++ "thread_access_id": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 64
++ },
++ "ref": {
++ "type": "object",
++ "required": [
++ "service",
++ "type",
++ "id"
++ ],
++ "additionalProperties": false,
++ "properties": {
++ "service": {
++ "type": "string",
++ "pattern": "^[a-z][a-z0-9-]{1,39}$"
++ },
++ "type": {
++ "type": "string",
++ "pattern": "^[a-z][a-z0-9_]{1,39}$"
++ },
++ "id": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 200
++ }
++ }
++ },
++ "author": {
++ "oneOf": [
++ {
++ "$ref": "../../identity/subject-ref.v1.json"
++ },
++ {
++ "type": "null"
++ }
++ ]
++ },
++ "visibility": {
++ "enum": [
++ "public",
++ "hidden",
++ "locked"
++ ]
++ },
++ "url": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "maxLength": 500,
++ "description": "The public page, or null when the item is not public."
++ }
++ }
++}
ddiff --git a/contracts/events/payloads/community.paste.created.v1.json b/contracts/events/payloads/community.paste.created.v1.json
nnew file mode 100644
iindex 00000000..7923cce8
---- /dev/null
++++ b/contracts/events/payloads/community.paste.created.v1.json
@@@ -0,0 +1,64 @@
++{
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/events/payloads/community.paste.created.v1.json",
++ "title": "CommunityPasteCreatedPayload",
++ "description": "community.paste.created v1 (OpenVibe.Community server/events.js, queued in the transaction of the change). A paste (text or screenshot) was created. Never the content or title. Envelope: subject { type: paste, id }, visibility public when the item is public else internal, priority low, actor the person or service:community.",
++ "type": "object",
++ "required": [
++ "paste_id",
++ "type",
++ "origin",
++ "visibility",
++ "owner",
++ "url"
++ ],
++ "additionalProperties": false,
++ "properties": {
++ "paste_id": {
++ "type": "string",
++ "pattern": "^[a-z0-9-]{3,64}$",
++ "description": "The paste's slug."
++ },
++ "type": {
++ "enum": [
++ "paste",
++ "screenshot"
++ ]
++ },
++ "origin": {
++ "enum": [
++ "user",
++ "ai",
++ "import"
++ ],
++ "description": "ai: written by OpenVibe's AI (Moments); never shown as a person's work."
++ },
++ "visibility": {
++ "enum": [
++ "public",
++ "unlisted",
++ "private",
++ "hidden",
++ "deleted"
++ ]
++ },
++ "owner": {
++ "oneOf": [
++ {
++ "$ref": "../../identity/subject-ref.v1.json"
++ },
++ {
++ "type": "null"
++ }
++ ]
++ },
++ "url": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "maxLength": 500,
++ "description": "The public page, or null when the item is not public."
++ }
++ }
++}
ddiff --git a/contracts/events/payloads/community.paste.deleted.v1.json b/contracts/events/payloads/community.paste.deleted.v1.json
nnew file mode 100644
iindex 00000000..611a3201
---- /dev/null
++++ b/contracts/events/payloads/community.paste.deleted.v1.json
@@@ -0,0 +1,17 @@
++{
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/events/payloads/community.paste.deleted.v1.json",
++ "title": "CommunityPasteDeletedPayload",
++ "description": "community.paste.deleted v1 (OpenVibe.Community server/events.js, queued in the transaction of the change). A paste was deleted (its content and image link are gone; the slug stays reserved). Consumers that indexed or cached it drop it. Envelope: subject { type: paste, id }, visibility public when the item is public else internal, priority low, actor the person or service:community.",
++ "type": "object",
++ "required": [
++ "paste_id"
++ ],
++ "additionalProperties": false,
++ "properties": {
++ "paste_id": {
++ "type": "string",
++ "pattern": "^[a-z0-9-]{3,64}$"
++ }
++ }
++}
ddiff --git a/contracts/events/payloads/community.paste.updated.v1.json b/contracts/events/payloads/community.paste.updated.v1.json
nnew file mode 100644
iindex 00000000..3f7dc12e
---- /dev/null
++++ b/contracts/events/payloads/community.paste.updated.v1.json
@@@ -0,0 +1,57 @@
++{
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/events/payloads/community.paste.updated.v1.json",
++ "title": "CommunityPasteUpdatedPayload",
++ "description": "community.paste.updated v1 (OpenVibe.Community server/events.js, queued in the transaction of the change). A paste changed: its title, content or language (a new revision), or its visibility, NSFW flag or pin. Names what changed, never the values of text fields. Envelope: subject { type: paste, id }, visibility public when the item is public else internal, priority low, actor the person or service:community.",
++ "type": "object",
++ "required": [
++ "paste_id",
++ "changed",
++ "visibility",
++ "revision",
++ "url"
++ ],
++ "additionalProperties": false,
++ "properties": {
++ "paste_id": {
++ "type": "string",
++ "pattern": "^[a-z0-9-]{3,64}$"
++ },
++ "changed": {
++ "type": "array",
++ "minItems": 1,
++ "uniqueItems": true,
++ "items": {
++ "enum": [
++ "title",
++ "content",
++ "language",
++ "visibility",
++ "is_nsfw",
++ "pinned"
++ ]
++ }
++ },
++ "visibility": {
++ "enum": [
++ "public",
++ "unlisted",
++ "private",
++ "hidden",
++ "deleted"
++ ]
++ },
++ "revision": {
++ "type": "integer",
++ "minimum": 1
++ },
++ "url": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "maxLength": 500,
++ "description": "The public page, or null when the item is not public."
++ }
++ }
++}
ddiff --git a/contracts/events/payloads/community.post.created.v1.json b/contracts/events/payloads/community.post.created.v1.json
nnew file mode 100644
iindex 00000000..ac1958f8
---- /dev/null
++++ b/contracts/events/payloads/community.post.created.v1.json
@@@ -0,0 +1,55 @@
++{
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/events/payloads/community.post.created.v1.json",
++ "title": "CommunityPostCreatedPayload",
++ "description": "community.post.created v1 (OpenVibe.Community server/events.js, queued in the transaction of the change). A reply was posted in a forum thread. Never the body. Envelope: subject { type: post, id }, visibility public when the item is public else internal, priority low, actor the person or service:community.",
++ "type": "object",
++ "required": [
++ "post_id",
++ "thread_id",
++ "space",
++ "author",
++ "visibility",
++ "url"
++ ],
++ "additionalProperties": false,
++ "properties": {
++ "post_id": {
++ "type": "integer",
++ "minimum": 1
++ },
++ "thread_id": {
++ "type": "integer",
++ "minimum": 1
++ },
++ "space": {
++ "type": "string",
++ "pattern": "^[a-z0-9][a-z0-9-]{0,62}$"
++ },
++ "author": {
++ "oneOf": [
++ {
++ "$ref": "../../identity/subject-ref.v1.json"
++ },
++ {
++ "type": "null"
++ }
++ ]
++ },
++ "visibility": {
++ "enum": [
++ "public",
++ "members",
++ "hidden"
++ ]
++ },
++ "url": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "maxLength": 500,
++ "description": "The public page, or null when the item is not public."
++ }
++ }
++}
ddiff --git a/contracts/events/payloads/community.thread.created.v1.json b/contracts/events/payloads/community.thread.created.v1.json
nnew file mode 100644
iindex 00000000..da05633a
---- /dev/null
++++ b/contracts/events/payloads/community.thread.created.v1.json
@@@ -0,0 +1,50 @@
++{
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/events/payloads/community.thread.created.v1.json",
++ "title": "CommunityThreadCreatedPayload",
++ "description": "community.thread.created v1 (OpenVibe.Community server/events.js, queued in the transaction of the change). A forum thread was started in a space. Envelope: subject { type: thread, id }, visibility public when the item is public else internal, priority low, actor the person or service:community.",
++ "type": "object",
++ "required": [
++ "thread_id",
++ "space",
++ "author",
++ "visibility",
++ "url"
++ ],
++ "additionalProperties": false,
++ "properties": {
++ "thread_id": {
++ "type": "integer",
++ "minimum": 1
++ },
++ "space": {
++ "type": "string",
++ "pattern": "^[a-z0-9][a-z0-9-]{0,62}$"
++ },
++ "author": {
++ "oneOf": [
++ {
++ "$ref": "../../identity/subject-ref.v1.json"
++ },
++ {
++ "type": "null"
++ }
++ ]
++ },
++ "visibility": {
++ "enum": [
++ "public",
++ "members",
++ "hidden"
++ ]
++ },
++ "url": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "maxLength": 500,
++ "description": "The public page, or null when the item is not public."
++ }
++ }
++}
ddiff --git a/fixtures/community.comment.created/invalid/carries-content.json b/fixtures/community.comment.created/invalid/carries-content.json
nnew file mode 100644
iindex 00000000..62c9b68c
---- /dev/null
++++ b/fixtures/community.comment.created/invalid/carries-content.json
@@@ -0,0 +1,16 @@
++{
++ "comment_id": 20,
++ "thread_access_id": "ct_abc123",
++ "ref": {
++ "service": "live",
++ "type": "vod",
++ "id": "906"
++ },
++ "author": {
++ "type": "user",
++ "id": "usr_01JAB2C3D4E5F6G7H8J9K0MNPQ"
++ },
++ "visibility": "public",
++ "url": "https://openvibe.community/c/ct_abc123",
++ "body": "the content never travels"
++}
ddiff --git a/fixtures/community.comment.created/valid/example.json b/fixtures/community.comment.created/valid/example.json
nnew file mode 100644
iindex 00000000..8e0a9a8c
---- /dev/null
++++ b/fixtures/community.comment.created/valid/example.json
@@@ -0,0 +1,15 @@
++{
++ "comment_id": 20,
++ "thread_access_id": "ct_abc123",
++ "ref": {
++ "service": "live",
++ "type": "vod",
++ "id": "906"
++ },
++ "author": {
++ "type": "user",
++ "id": "usr_01JAB2C3D4E5F6G7H8J9K0MNPQ"
++ },
++ "visibility": "public",
++ "url": "https://openvibe.community/c/ct_abc123"
++}
ddiff --git a/fixtures/community.paste.created/invalid/carries-content.json b/fixtures/community.paste.created/invalid/carries-content.json
nnew file mode 100644
iindex 00000000..78cf2e60
---- /dev/null
++++ b/fixtures/community.paste.created/invalid/carries-content.json
@@@ -0,0 +1,12 @@
++{
++ "paste_id": "amber-fox-42",
++ "type": "paste",
++ "origin": "user",
++ "visibility": "public",
++ "owner": {
++ "type": "user",
++ "id": "usr_01JAB2C3D4E5F6G7H8J9K0MNPQ"
++ },
++ "url": "https://openvibe.community/p/amber-fox-42",
++ "body": "the content never travels"
++}
ddiff --git a/fixtures/community.paste.created/valid/example.json b/fixtures/community.paste.created/valid/example.json
nnew file mode 100644
iindex 00000000..33e041e4
---- /dev/null
++++ b/fixtures/community.paste.created/valid/example.json
@@@ -0,0 +1,11 @@
++{
++ "paste_id": "amber-fox-42",
++ "type": "paste",
++ "origin": "user",
++ "visibility": "public",
++ "owner": {
++ "type": "user",
++ "id": "usr_01JAB2C3D4E5F6G7H8J9K0MNPQ"
++ },
++ "url": "https://openvibe.community/p/amber-fox-42"
++}
ddiff --git a/fixtures/community.paste.deleted/invalid/carries-content.json b/fixtures/community.paste.deleted/invalid/carries-content.json
nnew file mode 100644
iindex 00000000..f9a6b017
---- /dev/null
++++ b/fixtures/community.paste.deleted/invalid/carries-content.json
@@@ -0,0 +1,4 @@
++{
++ "paste_id": "amber-fox-42",
++ "body": "the content never travels"
++}
ddiff --git a/fixtures/community.paste.deleted/valid/example.json b/fixtures/community.paste.deleted/valid/example.json
nnew file mode 100644
iindex 00000000..6d31b361
---- /dev/null
++++ b/fixtures/community.paste.deleted/valid/example.json
@@@ -0,0 +1,3 @@
++{
++ "paste_id": "amber-fox-42"
++}
ddiff --git a/fixtures/community.paste.updated/invalid/carries-content.json b/fixtures/community.paste.updated/invalid/carries-content.json
nnew file mode 100644
iindex 00000000..1ea58c81
---- /dev/null
++++ b/fixtures/community.paste.updated/invalid/carries-content.json
@@@ -0,0 +1,10 @@
++{
++ "paste_id": "amber-fox-42",
++ "changed": [
++ "visibility"
++ ],
++ "visibility": "unlisted",
++ "revision": 1,
++ "url": null,
++ "body": "the content never travels"
++}
ddiff --git a/fixtures/community.paste.updated/valid/example.json b/fixtures/community.paste.updated/valid/example.json
nnew file mode 100644
iindex 00000000..07605085
---- /dev/null
++++ b/fixtures/community.paste.updated/valid/example.json
@@@ -0,0 +1,9 @@
++{
++ "paste_id": "amber-fox-42",
++ "changed": [
++ "visibility"
++ ],
++ "visibility": "unlisted",
++ "revision": 1,
++ "url": null
++}
ddiff --git a/fixtures/community.post.created/invalid/carries-content.json b/fixtures/community.post.created/invalid/carries-content.json
nnew file mode 100644
iindex 00000000..291e7be9
---- /dev/null
++++ b/fixtures/community.post.created/invalid/carries-content.json
@@@ -0,0 +1,12 @@
++{
++ "post_id": 31,
++ "thread_id": 7,
++ "space": "general",
++ "author": {
++ "type": "user",
++ "id": "usr_01JAB2C3D4E5F6G7H8J9K0MNPQ"
++ },
++ "visibility": "public",
++ "url": "https://openvibe.community/s/general/7#p31",
++ "body": "the content never travels"
++}
ddiff --git a/fixtures/community.post.created/valid/example.json b/fixtures/community.post.created/valid/example.json
nnew file mode 100644
iindex 00000000..c70a6b48
---- /dev/null
++++ b/fixtures/community.post.created/valid/example.json
@@@ -0,0 +1,11 @@
++{
++ "post_id": 31,
++ "thread_id": 7,
++ "space": "general",
++ "author": {
++ "type": "user",
++ "id": "usr_01JAB2C3D4E5F6G7H8J9K0MNPQ"
++ },
++ "visibility": "public",
++ "url": "https://openvibe.community/s/general/7#p31"
++}
ddiff --git a/fixtures/community.thread.created/invalid/carries-content.json b/fixtures/community.thread.created/invalid/carries-content.json
nnew file mode 100644
iindex 00000000..4f2d9708
---- /dev/null
++++ b/fixtures/community.thread.created/invalid/carries-content.json
@@@ -0,0 +1,11 @@
++{
++ "thread_id": 7,
++ "space": "general",
++ "author": {
++ "type": "user",
++ "id": "usr_01JAB2C3D4E5F6G7H8J9K0MNPQ"
++ },
++ "visibility": "public",
++ "url": "https://openvibe.community/s/general/7",
++ "body": "the content never travels"
++}
ddiff --git a/fixtures/community.thread.created/valid/example.json b/fixtures/community.thread.created/valid/example.json
nnew file mode 100644
iindex 00000000..32ecfbe5
---- /dev/null
++++ b/fixtures/community.thread.created/valid/example.json
@@@ -0,0 +1,10 @@
++{
++ "thread_id": 7,
++ "space": "general",
++ "author": {
++ "type": "user",
++ "id": "usr_01JAB2C3D4E5F6G7H8J9K0MNPQ"
++ },
++ "visibility": "public",
++ "url": "https://openvibe.community/s/general/7"
++}
ddiff --git a/generated/json-schema/bundle.json b/generated/json-schema/bundle.json
iindex f1d28b75..6761202f 100644
---- a/generated/json-schema/bundle.json
++++ b/generated/json-schema/bundle.json
@@@ -15752,6 +15752,355 @@
]
}
}
++ },
++ "community.paste.created": {
++ "version": "1.0.0",
++ "owner": "community",
++ "status": "active",
++ "schema": {
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/events/payloads/community.paste.created.v1.json",
++ "title": "CommunityPasteCreatedPayload",
++ "description": "community.paste.created v1 (OpenVibe.Community server/events.js, queued in the transaction of the change). A paste (text or screenshot) was created. Never the content or title. Envelope: subject { type: paste, id }, visibility public when the item is public else internal, priority low, actor the person or service:community.",
++ "type": "object",
++ "required": [
++ "paste_id",
++ "type",
++ "origin",
++ "visibility",
++ "owner",
++ "url"
++ ],
++ "additionalProperties": false,
++ "properties": {
++ "paste_id": {
++ "type": "string",
++ "pattern": "^[a-z0-9-]{3,64}$",
++ "description": "The paste's slug."
++ },
++ "type": {
++ "enum": [
++ "paste",
++ "screenshot"
++ ]
++ },
++ "origin": {
++ "enum": [
++ "user",
++ "ai",
++ "import"
++ ],
++ "description": "ai: written by OpenVibe's AI (Moments); never shown as a person's work."
++ },
++ "visibility": {
++ "enum": [
++ "public",
++ "unlisted",
++ "private",
++ "hidden",
++ "deleted"
++ ]
++ },
++ "owner": {
++ "oneOf": [
++ {
++ "$ref": "../../identity/subject-ref.v1.json"
++ },
++ {
++ "type": "null"
++ }
++ ]
++ },
++ "url": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "maxLength": 500,
++ "description": "The public page, or null when the item is not public."
++ }
++ }
++ }
++ },
++ "community.paste.updated": {
++ "version": "1.0.0",
++ "owner": "community",
++ "status": "active",
++ "schema": {
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/events/payloads/community.paste.updated.v1.json",
++ "title": "CommunityPasteUpdatedPayload",
++ "description": "community.paste.updated v1 (OpenVibe.Community server/events.js, queued in the transaction of the change). A paste changed: its title, content or language (a new revision), or its visibility, NSFW flag or pin. Names what changed, never the values of text fields. Envelope: subject { type: paste, id }, visibility public when the item is public else internal, priority low, actor the person or service:community.",
++ "type": "object",
++ "required": [
++ "paste_id",
++ "changed",
++ "visibility",
++ "revision",
++ "url"
++ ],
++ "additionalProperties": false,
++ "properties": {
++ "paste_id": {
++ "type": "string",
++ "pattern": "^[a-z0-9-]{3,64}$"
++ },
++ "changed": {
++ "type": "array",
++ "minItems": 1,
++ "uniqueItems": true,
++ "items": {
++ "enum": [
++ "title",
++ "content",
++ "language",
++ "visibility",
++ "is_nsfw",
++ "pinned"
++ ]
++ }
++ },
++ "visibility": {
++ "enum": [
++ "public",
++ "unlisted",
++ "private",
++ "hidden",
++ "deleted"
++ ]
++ },
++ "revision": {
++ "type": "integer",
++ "minimum": 1
++ },
++ "url": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "maxLength": 500,
++ "description": "The public page, or null when the item is not public."
++ }
++ }
++ }
++ },
++ "community.paste.deleted": {
++ "version": "1.0.0",
++ "owner": "community",
++ "status": "active",
++ "schema": {
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/events/payloads/community.paste.deleted.v1.json",
++ "title": "CommunityPasteDeletedPayload",
++ "description": "community.paste.deleted v1 (OpenVibe.Community server/events.js, queued in the transaction of the change). A paste was deleted (its content and image link are gone; the slug stays reserved). Consumers that indexed or cached it drop it. Envelope: subject { type: paste, id }, visibility public when the item is public else internal, priority low, actor the person or service:community.",
++ "type": "object",
++ "required": [
++ "paste_id"
++ ],
++ "additionalProperties": false,
++ "properties": {
++ "paste_id": {
++ "type": "string",
++ "pattern": "^[a-z0-9-]{3,64}$"
++ }
++ }
++ }
++ },
++ "community.thread.created": {
++ "version": "1.0.0",
++ "owner": "community",
++ "status": "active",
++ "schema": {
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/events/payloads/community.thread.created.v1.json",
++ "title": "CommunityThreadCreatedPayload",
++ "description": "community.thread.created v1 (OpenVibe.Community server/events.js, queued in the transaction of the change). A forum thread was started in a space. Envelope: subject { type: thread, id }, visibility public when the item is public else internal, priority low, actor the person or service:community.",
++ "type": "object",
++ "required": [
++ "thread_id",
++ "space",
++ "author",
++ "visibility",
++ "url"
++ ],
++ "additionalProperties": false,
++ "properties": {
++ "thread_id": {
++ "type": "integer",
++ "minimum": 1
++ },
++ "space": {
++ "type": "string",
++ "pattern": "^[a-z0-9][a-z0-9-]{0,62}$"
++ },
++ "author": {
++ "oneOf": [
++ {
++ "$ref": "../../identity/subject-ref.v1.json"
++ },
++ {
++ "type": "null"
++ }
++ ]
++ },
++ "visibility": {
++ "enum": [
++ "public",
++ "members",
++ "hidden"
++ ]
++ },
++ "url": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "maxLength": 500,
++ "description": "The public page, or null when the item is not public."
++ }
++ }
++ }
++ },
++ "community.post.created": {
++ "version": "1.0.0",
++ "owner": "community",
++ "status": "active",
++ "schema": {
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/events/payloads/community.post.created.v1.json",
++ "title": "CommunityPostCreatedPayload",
++ "description": "community.post.created v1 (OpenVibe.Community server/events.js, queued in the transaction of the change). A reply was posted in a forum thread. Never the body. Envelope: subject { type: post, id }, visibility public when the item is public else internal, priority low, actor the person or service:community.",
++ "type": "object",
++ "required": [
++ "post_id",
++ "thread_id",
++ "space",
++ "author",
++ "visibility",
++ "url"
++ ],
++ "additionalProperties": false,
++ "properties": {
++ "post_id": {
++ "type": "integer",
++ "minimum": 1
++ },
++ "thread_id": {
++ "type": "integer",
++ "minimum": 1
++ },
++ "space": {
++ "type": "string",
++ "pattern": "^[a-z0-9][a-z0-9-]{0,62}$"
++ },
++ "author": {
++ "oneOf": [
++ {
++ "$ref": "../../identity/subject-ref.v1.json"
++ },
++ {
++ "type": "null"
++ }
++ ]
++ },
++ "visibility": {
++ "enum": [
++ "public",
++ "members",
++ "hidden"
++ ]
++ },
++ "url": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "maxLength": 500,
++ "description": "The public page, or null when the item is not public."
++ }
++ }
++ }
++ },
++ "community.comment.created": {
++ "version": "1.0.0",
++ "owner": "community",
++ "status": "active",
++ "schema": {
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/events/payloads/community.comment.created.v1.json",
++ "title": "CommunityCommentCreatedPayload",
++ "description": "community.comment.created v1 (OpenVibe.Community server/events.js, queued in the transaction of the change). A comment was added to a comment thread attached to something on another service (a Live VOD or clip, a channel) or to a paste. Never the body. Envelope: subject { type: comment, id }, visibility public when the item is public else internal, priority low, actor the person or service:community.",
++ "type": "object",
++ "required": [
++ "comment_id",
++ "thread_access_id",
++ "ref",
++ "author",
++ "visibility",
++ "url"
++ ],
++ "additionalProperties": false,
++ "properties": {
++ "comment_id": {
++ "type": "integer",
++ "minimum": 1
++ },
++ "thread_access_id": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 64
++ },
++ "ref": {
++ "type": "object",
++ "required": [
++ "service",
++ "type",
++ "id"
++ ],
++ "additionalProperties": false,
++ "properties": {
++ "service": {
++ "type": "string",
++ "pattern": "^[a-z][a-z0-9-]{1,39}$"
++ },
++ "type": {
++ "type": "string",
++ "pattern": "^[a-z][a-z0-9_]{1,39}$"
++ },
++ "id": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 200
++ }
++ }
++ },
++ "author": {
++ "oneOf": [
++ {
++ "$ref": "../../identity/subject-ref.v1.json"
++ },
++ {
++ "type": "null"
++ }
++ ]
++ },
++ "visibility": {
++ "enum": [
++ "public",
++ "hidden",
++ "locked"
++ ]
++ },
++ "url": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "maxLength": 500,
++ "description": "The public page, or null when the item is not public."
++ }
++ }
++ }
}
}
}
ddiff --git a/generated/typescript/index.d.ts b/generated/typescript/index.d.ts
iindex 79d56c60..39652cb4 100644
---- a/generated/typescript/index.d.ts
++++ b/generated/typescript/index.d.ts
@@@ -13029,3 +13029,105 @@ export interface MediaObjectVisibilityChangedPayload {
*/
changed_at: string;
}
++
++/** [email protected] (owner: community) */
++/**
++ * community.paste.created v1 (OpenVibe.Community server/events.js, queued in the transaction of the change). A paste (text or screenshot) was created. Never the content or title. Envelope: subject { type: paste, id }, visibility public when the item is public else internal, priority low, actor the person or service:community.
++ */
++export interface CommunityPasteCreatedPayload {
++ /**
++ * The paste's slug.
++ */
++ paste_id: string;
++ type: "paste" | "screenshot";
++ /**
++ * ai: written by OpenVibe's AI (Moments); never shown as a person's work.
++ */
++ origin: "user" | "ai" | "import";
++ visibility: "public" | "unlisted" | "private" | "hidden" | "deleted";
++ owner: SubjectRef | null;
++ /**
++ * The public page, or null when the item is not public.
++ */
++ url: string | null;
++}
++
++/** [email protected] (owner: community) */
++/**
++ * community.paste.updated v1 (OpenVibe.Community server/events.js, queued in the transaction of the change). A paste changed: its title, content or language (a new revision), or its visibility, NSFW flag or pin. Names what changed, never the values of text fields. Envelope: subject { type: paste, id }, visibility public when the item is public else internal, priority low, actor the person or service:community.
++ */
++export interface CommunityPasteUpdatedPayload {
++ paste_id: string;
++ /**
++ * @minItems 1
++ */
++ changed: [
++ "title" | "content" | "language" | "visibility" | "is_nsfw" | "pinned",
++ ...("title" | "content" | "language" | "visibility" | "is_nsfw" | "pinned")[]
++ ];
++ visibility: "public" | "unlisted" | "private" | "hidden" | "deleted";
++ revision: number;
++ /**
++ * The public page, or null when the item is not public.
++ */
++ url: string | null;
++}
++
++/** [email protected] (owner: community) */
++/**
++ * community.paste.deleted v1 (OpenVibe.Community server/events.js, queued in the transaction of the change). A paste was deleted (its content and image link are gone; the slug stays reserved). Consumers that indexed or cached it drop it. Envelope: subject { type: paste, id }, visibility public when the item is public else internal, priority low, actor the person or service:community.
++ */
++export interface CommunityPasteDeletedPayload {
++ paste_id: string;
++}
++
++/** [email protected] (owner: community) */
++/**
++ * community.thread.created v1 (OpenVibe.Community server/events.js, queued in the transaction of the change). A forum thread was started in a space. Envelope: subject { type: thread, id }, visibility public when the item is public else internal, priority low, actor the person or service:community.
++ */
++export interface CommunityThreadCreatedPayload {
++ thread_id: number;
++ space: string;
++ author: SubjectRef | null;
++ visibility: "public" | "members" | "hidden";
++ /**
++ * The public page, or null when the item is not public.
++ */
++ url: string | null;
++}
++
++/** [email protected] (owner: community) */
++/**
++ * community.post.created v1 (OpenVibe.Community server/events.js, queued in the transaction of the change). A reply was posted in a forum thread. Never the body. Envelope: subject { type: post, id }, visibility public when the item is public else internal, priority low, actor the person or service:community.
++ */
++export interface CommunityPostCreatedPayload {
++ post_id: number;
++ thread_id: number;
++ space: string;
++ author: SubjectRef | null;
++ visibility: "public" | "members" | "hidden";
++ /**
++ * The public page, or null when the item is not public.
++ */
++ url: string | null;
++}
++
++/** [email protected] (owner: community) */
++/**
++ * community.comment.created v1 (OpenVibe.Community server/events.js, queued in the transaction of the change). A comment was added to a comment thread attached to something on another service (a Live VOD or clip, a channel) or to a paste. Never the body. Envelope: subject { type: comment, id }, visibility public when the item is public else internal, priority low, actor the person or service:community.
++ */
++export interface CommunityCommentCreatedPayload {
++ comment_id: number;
++ thread_access_id: string;
++ ref: {
++ service: string;
++ type: string;
++ id: string;
++ };
++ author: SubjectRef | null;
++ visibility: "public" | "hidden" | "locked";
++ /**
++ * The public page, or null when the item is not public.
++ */
++ url: string | null;
++}
ddiff --git a/manifests/services/community.json b/manifests/services/community.json
iindex fae19674..fba7b510 100644
---- a/manifests/services/community.json
++++ b/manifests/services/community.json
@@@ -1,5 +1,5 @@
{
-- "version": "0.1.0",
++ "version": "0.2.0",
"contractRanges": {
"openvibe-contracts": ">=0.5.0 <1.0.0"
},
@@@ -26,7 +26,14 @@
"community.vote.set",
"community.pulse.read"
],
-- "eventsProduced": [],
++ "eventsProduced": [
++ "community.comment.created",
++ "community.paste.created",
++ "community.paste.deleted",
++ "community.paste.updated",
++ "community.post.created",
++ "community.thread.created"
++ ],
"eventsConsumed": [],
"namespacesOwned": [
"community.*"
ddiff --git a/package-lock.json b/package-lock.json
iindex 46c7a326..752fb017 100644
---- a/package-lock.json
++++ b/package-lock.json
@@@ -1,12 +1,12 @@
{
"name": "openvibe-contracts",
-- "version": "0.34.3",
++ "version": "0.35.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "openvibe-contracts",
-- "version": "0.34.3",
++ "version": "0.35.0",
"license": "AGPL-3.0-only",
"dependencies": {
"ajv": "^8.17.1",
ddiff --git a/package.json b/package.json
iindex 21edf23a..296af56a 100644
---- a/package.json
++++ b/package.json
@@@ -1,6 +1,6 @@
{
"name": "openvibe-contracts",
-- "version": "0.34.3",
++ "version": "0.35.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",