openvibers/openvibe.contracts Commits
v0.46.0: live.moderation.action (ADR-022, WS-D task 1): Live's staff and channel-moderator actions outside chat, the same payload as chat.moderation.action (an event's prefix must match its source); Network consumes it into the moderation audit log
Changes
@@@ -4,6 +4,10 @@ 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.46.0 — 2026-09-25++++**`live.moderation.action`** (ADR-022, roadmap WS-D task 1): a staff or channel-moderator action taken on OpenVibe.Live outside chat (site, global and IP bans, message deletes and purges from the admin panel, a stream force-ended, relay users hidden, channel moderators added or removed), with the same payload as `chat.moderation.action`. Events requires an event's prefix to match its source, so Live cannot send Chat's event for its own admin actions. OpenVibe.Network consumes it into the moderation audit log. The live manifest produces it and the network manifest consumes it. Fixtures cover a site ban and a force-ended stream. Additive.++## 0.45.0 — 2026-09-25**`live.index_document.upserted|deleted`** also carry Live's public VOD and clip pages (types `vod` and `clip`, id = the Media id, canonical `openvibe.live/vod/<id>` and `/clip/<id>`), alongside channels. Live owns those canonical pages (title, channel, AI overview, transcript), so Live sends their Search documents. `media.index_document.*` is only for VODs and clips whose canonical page is on openvibe.media (apps other than Live), the same rule as Media's sitemap. Fixtures for a VOD, an AI clip (noindex) and a VOD tombstone. Additive.@@@ -1528,6 +1528,16 @@"status": "active","adr": "ADR-022"},++ {++ "id": "live.moderation.action",++ "version": "1.0.0",++ "owner": "live",++ "schema": "events/payloads/live.moderation.action.v1.json",++ "visibility": "first-party",++ "compatibility": "backward",++ "status": "active",++ "adr": "ADR-022"++ },{"id": "community.moderation.action","version": "1.0.0",nnew file mode 100644@@@ -0,0 +1,66 @@++{++ "$schema": "https://json-schema.org/draft/2020-12/schema",++ "$id": "https://openvibe.network/contracts/events/payloads/live.moderation.action.v1.json",++ "title": "LiveModerationActionPayload",++ "description": "live.moderation.action v1 (OpenVibe.Live server/db/database.js logModerationAction; ADR-022). A staff or channel moderator action taken on OpenVibe.Live outside chat: site and global bans, IP bans, message deletes and purges from Live's admin panel, a stream force-ended, relay users hidden, channel moderators added or removed. Not a person tidying their own messages or configuring their own channel. Written to Live's outbox in the transaction that records the action. OpenVibe.Network keeps it in the moderation audit log. Envelope: subject { type: moderation_action, id: <action_id> }, visibility internal, actor the acting person when known. details is free-form per action (never secrets or message text beyond what moderators saw).",++ "type": "object",++ "required": [++ "action_id",++ "action_type",++ "scope_type"++ ],++ "additionalProperties": false,++ "properties": {++ "action_id": {++ "type": "integer",++ "minimum": 1++ },++ "action_type": {++ "type": "string",++ "minLength": 1,++ "maxLength": 64,++ "description": "site_ban, global_ban, ip_ban_all, message_delete, bulk_message_delete, stream_force_end, channel_mod_add, … as Live names them."++ },++ "scope_type": {++ "type": "string",++ "minLength": 1,++ "maxLength": 32,++ "description": "site, channel, stream, room, …"++ },++ "scope_id": {++ "type": [++ "string",++ "integer",++ "null"++ ]++ },++ "actor_user_id": {++ "type": [++ "integer",++ "null"++ ],++ "description": "Legacy Live user id of the actor (kept while subjects are adopted)."++ },++ "actor_subject": {++ "type": [++ "string",++ "null"++ ]++ },++ "target_user_id": {++ "type": [++ "integer",++ "null"++ ]++ },++ "target_subject": {++ "type": [++ "string",++ "null"++ ]++ },++ "details": {++ "type": "object"++ }++ }++}nnew file mode 100644@@@ -0,0 +1 @@++{ "action_id": 1206, "scope_type": "site" }nnew file mode 100644@@@ -0,0 +1 @@++{ "action_id": 1205, "action_type": "stream_force_end", "scope_type": "stream", "scope_id": 9001, "actor_user_id": 1, "actor_subject": null, "target_user_id": 44, "target_subject": null, "details": {} }nnew file mode 100644@@@ -0,0 +1 @@++{ "action_id": 1204, "action_type": "site_ban", "scope_type": "site", "scope_id": null, "actor_user_id": 1, "actor_subject": "usr_01JAB2C3D4E5F6G7H8J9K0MNPQ", "target_user_id": 44, "target_subject": "usr_01JAB2C3D4E5F6G7H8J9K0MNPR", "details": { "reason": "spam", "ban_type": "permanent" } }@@@ -16731,6 +16731,77 @@}}},++ "live.moderation.action": {++ "version": "1.0.0",++ "owner": "live",++ "status": "active",++ "schema": {++ "$schema": "https://json-schema.org/draft/2020-12/schema",++ "$id": "https://openvibe.network/contracts/events/payloads/live.moderation.action.v1.json",++ "title": "LiveModerationActionPayload",++ "description": "live.moderation.action v1 (OpenVibe.Live server/db/database.js logModerationAction; ADR-022). A staff or channel moderator action taken on OpenVibe.Live outside chat: site and global bans, IP bans, message deletes and purges from Live's admin panel, a stream force-ended, relay users hidden, channel moderators added or removed. Not a person tidying their own messages or configuring their own channel. Written to Live's outbox in the transaction that records the action. OpenVibe.Network keeps it in the moderation audit log. Envelope: subject { type: moderation_action, id: <action_id> }, visibility internal, actor the acting person when known. details is free-form per action (never secrets or message text beyond what moderators saw).",++ "type": "object",++ "required": [++ "action_id",++ "action_type",++ "scope_type"++ ],++ "additionalProperties": false,++ "properties": {++ "action_id": {++ "type": "integer",++ "minimum": 1++ },++ "action_type": {++ "type": "string",++ "minLength": 1,++ "maxLength": 64,++ "description": "site_ban, global_ban, ip_ban_all, message_delete, bulk_message_delete, stream_force_end, channel_mod_add, … as Live names them."++ },++ "scope_type": {++ "type": "string",++ "minLength": 1,++ "maxLength": 32,++ "description": "site, channel, stream, room, …"++ },++ "scope_id": {++ "type": [++ "string",++ "integer",++ "null"++ ]++ },++ "actor_user_id": {++ "type": [++ "integer",++ "null"++ ],++ "description": "Legacy Live user id of the actor (kept while subjects are adopted)."++ },++ "actor_subject": {++ "type": [++ "string",++ "null"++ ]++ },++ "target_user_id": {++ "type": [++ "integer",++ "null"++ ]++ },++ "target_subject": {++ "type": [++ "string",++ "null"++ ]++ },++ "details": {++ "type": "object"++ }++ }++ }++ },"community.moderation.action": {"version": "1.0.0","owner": "community",@@@ -13369,6 +13369,31 @@ export interface ChatModerationActionPayload {details?: {};}++/** [email protected] (owner: live) */++/**++ * live.moderation.action v1 (OpenVibe.Live server/db/database.js logModerationAction; ADR-022). A staff or channel moderator action taken on OpenVibe.Live outside chat: site and global bans, IP bans, message deletes and purges from Live's admin panel, a stream force-ended, relay users hidden, channel moderators added or removed. Not a person tidying their own messages or configuring their own channel. Written to Live's outbox in the transaction that records the action. OpenVibe.Network keeps it in the moderation audit log. Envelope: subject { type: moderation_action, id: <action_id> }, visibility internal, actor the acting person when known. details is free-form per action (never secrets or message text beyond what moderators saw).++ */++export interface LiveModerationActionPayload {++ action_id: number;++ /**++ * site_ban, global_ban, ip_ban_all, message_delete, bulk_message_delete, stream_force_end, channel_mod_add, … as Live names them.++ */++ action_type: string;++ /**++ * site, channel, stream, room, …++ */++ scope_type: string;++ scope_id?: string | number | null;++ /**++ * Legacy Live user id of the actor (kept while subjects are adopted).++ */++ actor_user_id?: number | null;++ actor_subject?: string | null;++ target_user_id?: number | null;++ target_subject?: string | null;++ details?: {};++}++/** [email protected] (owner: community) *//*** community.moderation.action v1 (OpenVibe.Community server/events.js moderationAction). A staff action on someone else's content in Community: editing or deleting another person's paste, changing its visibility, censoring a screenshot, bulk actions, deleting forks, removing a comment, deleting or locking a thread. OpenVibe.Network keeps it in the moderation audit log (ADR-022). Envelope: subject { type: moderation_action, id: <target type>:<target id> }, visibility internal, actor the staff member. Never carries the content itself.@@@ -42,6 +42,7 @@"eventsProduced": ["live.index_document.deleted","live.index_document.upserted",++ "live.moderation.action","live.release.deployed","live.stream.ended","live.stream.started"@@@ -59,6 +59,7 @@"chat.moderation.action","community.moderation.action","deals.watch.matched",++ "live.moderation.action","live.stream.started","tips.interaction.moderated","trade.alert.triggered"@@@ -1,12 +1,12 @@{"name": "openvibe-contracts",-- "version": "0.45.0",++ "version": "0.46.0","lockfileVersion": 3,"requires": true,"packages": {"": {"name": "openvibe-contracts",-- "version": "0.45.0",++ "version": "0.46.0","license": "AGPL-3.0-only","dependencies": {"ajv": "^8.17.1",@@@ -1,6 +1,6 @@{"name": "openvibe-contracts",-- "version": "0.45.0",++ "version": "0.46.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,10 @@ All notable changes to `openvibe-contracts`. Releases are git tags (`vX.Y.Z`) th
@@ -4,6 +4,10 @@ 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.46.0 — 2026-09-25
+
+**`live.moderation.action`** (ADR-022, roadmap WS-D task 1): a staff or channel-moderator action taken on OpenVibe.Live outside chat (site, global and IP bans, message deletes and purges from the admin panel, a stream force-ended, relay users hidden, channel moderators added or removed), with the same payload as `chat.moderation.action`. Events requires an event's prefix to match its source, so Live cannot send Chat's event for its own admin actions. OpenVibe.Network consumes it into the moderation audit log. The live manifest produces it and the network manifest consumes it. Fixtures cover a site ban and a force-ended stream. Additive.
+
## 0.45.0 — 2026-09-25
## 0.45.0 — 2026-09-25
**`live.index_document.upserted|deleted`** also carry Live's public VOD and clip pages (types `vod` and `clip`, id = the Media id, canonical `openvibe.live/vod/<id>` and `/clip/<id>`), alongside channels. Live owns those canonical pages (title, channel, AI overview, transcript), so Live sends their Search documents. `media.index_document.*` is only for VODs and clips whose canonical page is on openvibe.media (apps other than Live), the same rule as Media's sitemap. Fixtures for a VOD, an AI clip (noindex) and a VOD tombstone. Additive.
**`live.index_document.upserted|deleted`** also carry Live's public VOD and clip pages (types `vod` and `clip`, id = the Media id, canonical `openvibe.live/vod/<id>` and `/clip/<id>`), alongside channels. Live owns those canonical pages (title, channel, AI overview, transcript), so Live sends their Search documents. `media.index_document.*` is only for VODs and clips whose canonical page is on openvibe.media (apps other than Live), the same rule as Media's sitemap. Fixtures for a VOD, an AI clip (noindex) and a VOD tombstone. Additive.
@@ -1528,6 +1528,16 @@
@@ -1528,6 +1528,16 @@
"status": "active",
"status": "active",
"adr": "ADR-022"
"adr": "ADR-022"
},
},
+ {
+ "id": "live.moderation.action",
+ "version": "1.0.0",
+ "owner": "live",
+ "schema": "events/payloads/live.moderation.action.v1.json",
+ "visibility": "first-party",
+ "compatibility": "backward",
+ "status": "active",
+ "adr": "ADR-022"
+ },
{
{
"id": "community.moderation.action",
"id": "community.moderation.action",
"version": "1.0.0",
"version": "1.0.0",
new file mode 100644
new file mode 100644
@@ -0,0 +1,66 @@
@@ -0,0 +1,66 @@
+{
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "https://openvibe.network/contracts/events/payloads/live.moderation.action.v1.json",
+ "title": "LiveModerationActionPayload",
+ "description": "live.moderation.action v1 (OpenVibe.Live server/db/database.js logModerationAction; ADR-022). A staff or channel moderator action taken on OpenVibe.Live outside chat: site and global bans, IP bans, message deletes and purges from Live's admin panel, a stream force-ended, relay users hidden, channel moderators added or removed. Not a person tidying their own messages or configuring their own channel. Written to Live's outbox in the transaction that records the action. OpenVibe.Network keeps it in the moderation audit log. Envelope: subject { type: moderation_action, id: <action_id> }, visibility internal, actor the acting person when known. details is free-form per action (never secrets or message text beyond what moderators saw).",
+ "type": "object",
+ "required": [
+ "action_id",
+ "action_type",
+ "scope_type"
+ ],
+ "additionalProperties": false,
+ "properties": {
+ "action_id": {
+ "type": "integer",
+ "minimum": 1
+ },
+ "action_type": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 64,
+ "description": "site_ban, global_ban, ip_ban_all, message_delete, bulk_message_delete, stream_force_end, channel_mod_add, … as Live names them."
+ },
+ "scope_type": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 32,
+ "description": "site, channel, stream, room, …"
+ },
+ "scope_id": {
+ "type": [
+ "string",
+ "integer",
+ "null"
+ ]
+ },
+ "actor_user_id": {
+ "type": [
+ "integer",
+ "null"
+ ],
+ "description": "Legacy Live user id of the actor (kept while subjects are adopted)."
+ },
+ "actor_subject": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "target_user_id": {
+ "type": [
+ "integer",
+ "null"
+ ]
+ },
+ "target_subject": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "details": {
+ "type": "object"
+ }
+ }
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1 @@
@@ -0,0 +1 @@
+{ "action_id": 1206, "scope_type": "site" }
new file mode 100644
new file mode 100644
@@ -0,0 +1 @@
@@ -0,0 +1 @@
+{ "action_id": 1205, "action_type": "stream_force_end", "scope_type": "stream", "scope_id": 9001, "actor_user_id": 1, "actor_subject": null, "target_user_id": 44, "target_subject": null, "details": {} }
new file mode 100644
new file mode 100644
@@ -0,0 +1 @@
@@ -0,0 +1 @@
+{ "action_id": 1204, "action_type": "site_ban", "scope_type": "site", "scope_id": null, "actor_user_id": 1, "actor_subject": "usr_01JAB2C3D4E5F6G7H8J9K0MNPQ", "target_user_id": 44, "target_subject": "usr_01JAB2C3D4E5F6G7H8J9K0MNPR", "details": { "reason": "spam", "ban_type": "permanent" } }
@@ -16731,6 +16731,77 @@
@@ -16731,6 +16731,77 @@
}
}
}
}
},
},
+ "live.moderation.action": {
+ "version": "1.0.0",
+ "owner": "live",
+ "status": "active",
+ "schema": {
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "https://openvibe.network/contracts/events/payloads/live.moderation.action.v1.json",
+ "title": "LiveModerationActionPayload",
+ "description": "live.moderation.action v1 (OpenVibe.Live server/db/database.js logModerationAction; ADR-022). A staff or channel moderator action taken on OpenVibe.Live outside chat: site and global bans, IP bans, message deletes and purges from Live's admin panel, a stream force-ended, relay users hidden, channel moderators added or removed. Not a person tidying their own messages or configuring their own channel. Written to Live's outbox in the transaction that records the action. OpenVibe.Network keeps it in the moderation audit log. Envelope: subject { type: moderation_action, id: <action_id> }, visibility internal, actor the acting person when known. details is free-form per action (never secrets or message text beyond what moderators saw).",
+ "type": "object",
+ "required": [
+ "action_id",
+ "action_type",
+ "scope_type"
+ ],
+ "additionalProperties": false,
+ "properties": {
+ "action_id": {
+ "type": "integer",
+ "minimum": 1
+ },
+ "action_type": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 64,
+ "description": "site_ban, global_ban, ip_ban_all, message_delete, bulk_message_delete, stream_force_end, channel_mod_add, … as Live names them."
+ },
+ "scope_type": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 32,
+ "description": "site, channel, stream, room, …"
+ },
+ "scope_id": {
+ "type": [
+ "string",
+ "integer",
+ "null"
+ ]
+ },
+ "actor_user_id": {
+ "type": [
+ "integer",
+ "null"
+ ],
+ "description": "Legacy Live user id of the actor (kept while subjects are adopted)."
+ },
+ "actor_subject": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "target_user_id": {
+ "type": [
+ "integer",
+ "null"
+ ]
+ },
+ "target_subject": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "details": {
+ "type": "object"
+ }
+ }
+ }
+ },
"community.moderation.action": {
"community.moderation.action": {
"version": "1.0.0",
"version": "1.0.0",
"owner": "community",
"owner": "community",
@@ -13369,6 +13369,31 @@ export interface ChatModerationActionPayload {
@@ -13369,6 +13369,31 @@ export interface ChatModerationActionPayload {
details?: {};
details?: {};
}
}
+/** [email protected] (owner: live) */
+/**
+ * live.moderation.action v1 (OpenVibe.Live server/db/database.js logModerationAction; ADR-022). A staff or channel moderator action taken on OpenVibe.Live outside chat: site and global bans, IP bans, message deletes and purges from Live's admin panel, a stream force-ended, relay users hidden, channel moderators added or removed. Not a person tidying their own messages or configuring their own channel. Written to Live's outbox in the transaction that records the action. OpenVibe.Network keeps it in the moderation audit log. Envelope: subject { type: moderation_action, id: <action_id> }, visibility internal, actor the acting person when known. details is free-form per action (never secrets or message text beyond what moderators saw).
+ */
+export interface LiveModerationActionPayload {
+ action_id: number;
+ /**
+ * site_ban, global_ban, ip_ban_all, message_delete, bulk_message_delete, stream_force_end, channel_mod_add, … as Live names them.
+ */
+ action_type: string;
+ /**
+ * site, channel, stream, room, …
+ */
+ scope_type: string;
+ scope_id?: string | number | null;
+ /**
+ * Legacy Live user id of the actor (kept while subjects are adopted).
+ */
+ actor_user_id?: number | null;
+ actor_subject?: string | null;
+ target_user_id?: number | null;
+ target_subject?: string | null;
+ details?: {};
+}
+
/** [email protected] (owner: community) */
/** [email protected] (owner: community) */
/**
/**
* community.moderation.action v1 (OpenVibe.Community server/events.js moderationAction). A staff action on someone else's content in Community: editing or deleting another person's paste, changing its visibility, censoring a screenshot, bulk actions, deleting forks, removing a comment, deleting or locking a thread. OpenVibe.Network keeps it in the moderation audit log (ADR-022). Envelope: subject { type: moderation_action, id: <target type>:<target id> }, visibility internal, actor the staff member. Never carries the content itself.
* community.moderation.action v1 (OpenVibe.Community server/events.js moderationAction). A staff action on someone else's content in Community: editing or deleting another person's paste, changing its visibility, censoring a screenshot, bulk actions, deleting forks, removing a comment, deleting or locking a thread. OpenVibe.Network keeps it in the moderation audit log (ADR-022). Envelope: subject { type: moderation_action, id: <target type>:<target id> }, visibility internal, actor the staff member. Never carries the content itself.
@@ -42,6 +42,7 @@
@@ -42,6 +42,7 @@
"eventsProduced": [
"eventsProduced": [
"live.index_document.deleted",
"live.index_document.deleted",
"live.index_document.upserted",
"live.index_document.upserted",
+ "live.moderation.action",
"live.release.deployed",
"live.release.deployed",
"live.stream.ended",
"live.stream.ended",
"live.stream.started"
"live.stream.started"
@@ -59,6 +59,7 @@
@@ -59,6 +59,7 @@
"chat.moderation.action",
"chat.moderation.action",
"community.moderation.action",
"community.moderation.action",
"deals.watch.matched",
"deals.watch.matched",
+ "live.moderation.action",
"live.stream.started",
"live.stream.started",
"tips.interaction.moderated",
"tips.interaction.moderated",
"trade.alert.triggered"
"trade.alert.triggered"
@@ -1,12 +1,12 @@
@@ -1,12 +1,12 @@
{
{
"name": "openvibe-contracts",
"name": "openvibe-contracts",
- "version": "0.45.0",
+ "version": "0.46.0",
"lockfileVersion": 3,
"lockfileVersion": 3,
"requires": true,
"requires": true,
"packages": {
"packages": {
"": {
"": {
"name": "openvibe-contracts",
"name": "openvibe-contracts",
- "version": "0.45.0",
+ "version": "0.46.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.45.0",
+ "version": "0.46.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",