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
Changes
@@@ -4,6 +4,13 @@ All notable changes to `openvibe-contracts`. Releases are git tags (`vX.Y.Z`) thfrom `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'@@@ -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"}]}nnew file mode 100644@@@ -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."++ }++ }++}nnew file mode 100644@@@ -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."++ }++ }++}nnew file mode 100644@@@ -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}$"++ }++ }++}nnew file mode 100644@@@ -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."++ }++ }++}nnew file mode 100644@@@ -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."++ }++ }++}nnew file mode 100644@@@ -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."++ }++ }++}nnew file mode 100644@@@ -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"++}nnew file mode 100644@@@ -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"++}nnew file mode 100644@@@ -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"++}nnew file mode 100644@@@ -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"++}nnew file mode 100644@@@ -0,0 +1,4 @@++{++ "paste_id": "amber-fox-42",++ "body": "the content never travels"++}nnew file mode 100644@@@ -0,0 +1,3 @@++{++ "paste_id": "amber-fox-42"++}nnew file mode 100644@@@ -0,0 +1,10 @@++{++ "paste_id": "amber-fox-42",++ "changed": [++ "visibility"++ ],++ "visibility": "unlisted",++ "revision": 1,++ "url": null,++ "body": "the content never travels"++}nnew file mode 100644@@@ -0,0 +1,9 @@++{++ "paste_id": "amber-fox-42",++ "changed": [++ "visibility"++ ],++ "visibility": "unlisted",++ "revision": 1,++ "url": null++}nnew file mode 100644@@@ -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"++}nnew file mode 100644@@@ -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"++}nnew file mode 100644@@@ -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"++}nnew file mode 100644@@@ -0,0 +1,10 @@++{++ "thread_id": 7,++ "space": "general",++ "author": {++ "type": "user",++ "id": "usr_01JAB2C3D4E5F6G7H8J9K0MNPQ"++ },++ "visibility": "public",++ "url": "https://openvibe.community/s/general/7"++}@@@ -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."++ }++ }++ }}}}@@@ -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;++}@@@ -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.*"@@@ -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",@@@ -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",
@@ -4,6 +4,13 @@ All notable changes to `openvibe-contracts`. Releases are git tags (`vX.Y.Z`) th
@@ -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,
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`).
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
## 0.34.3 — 2026-09-24
- `openvibe-contracts-check` skips `*.test.*` and `*.spec.*` files: tests mint tokens carrying other owners'
- `openvibe-contracts-check` skips `*.test.*` and `*.spec.*` files: tests mint tokens carrying other owners'
@@ -1391,6 +1391,60 @@
@@ -1391,6 +1391,60 @@
"visibility": "first-party",
"visibility": "first-party",
"compatibility": "backward",
"compatibility": "backward",
"status": "active"
"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"
}
}
]
]
}
}
new file mode 100644
new file mode 100644
@@ -0,0 +1,76 @@
@@ -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."
+ }
+ }
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,64 @@
@@ -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."
+ }
+ }
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,17 @@
@@ -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}$"
+ }
+ }
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,57 @@
@@ -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."
+ }
+ }
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,55 @@
@@ -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."
+ }
+ }
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,50 @@
@@ -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."
+ }
+ }
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,16 @@
@@ -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"
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,15 @@
@@ -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"
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,12 @@
@@ -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"
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,11 @@
@@ -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"
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,4 @@
@@ -0,0 +1,4 @@
+{
+ "paste_id": "amber-fox-42",
+ "body": "the content never travels"
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,3 @@
@@ -0,0 +1,3 @@
+{
+ "paste_id": "amber-fox-42"
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,10 @@
@@ -0,0 +1,10 @@
+{
+ "paste_id": "amber-fox-42",
+ "changed": [
+ "visibility"
+ ],
+ "visibility": "unlisted",
+ "revision": 1,
+ "url": null,
+ "body": "the content never travels"
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,9 @@
@@ -0,0 +1,9 @@
+{
+ "paste_id": "amber-fox-42",
+ "changed": [
+ "visibility"
+ ],
+ "visibility": "unlisted",
+ "revision": 1,
+ "url": null
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,12 @@
@@ -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"
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,11 @@
@@ -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"
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,11 @@
@@ -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"
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,10 @@
@@ -0,0 +1,10 @@
+{
+ "thread_id": 7,
+ "space": "general",
+ "author": {
+ "type": "user",
+ "id": "usr_01JAB2C3D4E5F6G7H8J9K0MNPQ"
+ },
+ "visibility": "public",
+ "url": "https://openvibe.community/s/general/7"
+}
@@ -15752,6 +15752,355 @@
@@ -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."
+ }
+ }
+ }
}
}
}
}
}
}
@@ -13029,3 +13029,105 @@ export interface MediaObjectVisibilityChangedPayload {
@@ -13029,3 +13029,105 @@ export interface MediaObjectVisibilityChangedPayload {
*/
*/
changed_at: string;
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;
+}
@@ -1,5 +1,5 @@
@@ -1,5 +1,5 @@
{
{
- "version": "0.1.0",
+ "version": "0.2.0",
"contractRanges": {
"contractRanges": {
"openvibe-contracts": ">=0.5.0 <1.0.0"
"openvibe-contracts": ">=0.5.0 <1.0.0"
},
},
@@ -26,7 +26,14 @@
@@ -26,7 +26,14 @@
"community.vote.set",
"community.vote.set",
"community.pulse.read"
"community.pulse.read"
],
],
- "eventsProduced": [],
+ "eventsProduced": [
+ "community.comment.created",
+ "community.paste.created",
+ "community.paste.deleted",
+ "community.paste.updated",
+ "community.post.created",
+ "community.thread.created"
+ ],
"eventsConsumed": [],
"eventsConsumed": [],
"namespacesOwned": [
"namespacesOwned": [
"community.*"
"community.*"
@@ -1,12 +1,12 @@
@@ -1,12 +1,12 @@
{
{
"name": "openvibe-contracts",
"name": "openvibe-contracts",
- "version": "0.34.3",
+ "version": "0.35.0",
"lockfileVersion": 3,
"lockfileVersion": 3,
"requires": true,
"requires": true,
"packages": {
"packages": {
"": {
"": {
"name": "openvibe-contracts",
"name": "openvibe-contracts",
- "version": "0.34.3",
+ "version": "0.35.0",
"license": "AGPL-3.0-only",
"license": "AGPL-3.0-only",
"dependencies": {
"dependencies": {
"ajv": "^8.17.1",
"ajv": "^8.17.1",
@@ -1,6 +1,6 @@
@@ -1,6 +1,6 @@
{
{
"name": "openvibe-contracts",
"name": "openvibe-contracts",
- "version": "0.34.3",
+ "version": "0.35.0",
"description": "Machine-readable contracts for the OpenVibe network: schemas, manifests, ids, error envelope, capability checks.",
"description": "Machine-readable contracts for the OpenVibe network: schemas, manifests, ids, error envelope, capability checks.",
"main": "index.js",
"main": "index.js",
"types": "generated/typescript/index.d.ts",
"types": "generated/typescript/index.d.ts",