{
  "asyncapi": "3.0.0",
  "info": {
    "title": "Nurama WebSocket API",
    "version": "0.3.3",
    "description": "Websocket (Socket.io) events emitted by the websocket server (hosted separately from the REST API). \n\n**Connecting / channels.** Every channel is a Socket.io namespace named `/{resourceType}/{resourceId}[/{visibility}]`, where resourceType is one of workspace, project, user, chat, asset, submission, task or public, resourceId is a UUID (or legacy 24-char hex id) and the optional visibility is creator, reviewer or public. Public release channels are `/public/{token}` (10-character public token, no visibility suffix). Any other namespace is refused. Authenticate by passing `query: { token }` on the handshake: a user JWT, a personal access token or a bot API key (bot keys must connect through a configured bot gateway hostname). `/public/{token}` namespaces need no handshake token (the token in the namespace is validated instead); authenticated users may also join them. Failures surface as `connect_error` with message `forbidden` (invalid credentials or no permission) or `badRequest` (malformed channel / permission lookup error). \n\n**Permissions.** A user may only join their own `/user/{userId}`. `/project/{id}/creator`, `/reviewer` and `/public` require canGetProjectCreatorNotifications, canGetProjectReviewerNotifications and canGetProjectPublicNotifications respectively; every other channel requires canGet{ResourceType}Notifications (direct or inherited). \n\n**Server -> client events:** `notification` (every notification event documented below, emitted on each channel in the notification's channels list; the payload `type` selects the schema), `tokenEvent`, `typing:start` / `typing:stop` and the `collab:*` events (only on `/chat/{chatId}` namespaces). **Client -> server events:** `ws:probe`, `typing:start` / `typing:stop`, `collab:*`. Sockets whose JWT expired or was blacklisted, or whose bot key was revoked, receive `tokenEvent` and are disconnected shortly after. \n\nEach event type below is documented using 'get' to represent the emitted event payload under the '200' response schema. **Keys marked with (*) will be deprecated in a future release and should not be used for new development and should be replaced with values and objects in the changes key in existing implementations.**"
  },
  "defaultContentType": "application/json",
  "servers": {
    "production": {
      "host": "ws.nurama.com",
      "protocol": "wss",
      "pathname": "/socket.io",
      "description": "WebSocket server for user credentials (JWT or personal access token). Socket.IO transport: connect a Socket.IO client to the channel address, not a raw WebSocket.",
      "security": [
        {
          "$ref": "#/components/securitySchemes/handshakeToken"
        }
      ]
    },
    "bots": {
      "host": "bot-ws.nurama.com",
      "protocol": "wss",
      "pathname": "/socket.io",
      "description": "WebSocket server for bot API keys.",
      "security": [
        {
          "$ref": "#/components/securitySchemes/handshakeToken"
        }
      ]
    }
  },
  "channels": {
    "resource": {
      "address": "/{resourceType}/{resourceId}/{visibility}",
      "title": "Resource namespace",
      "summary": "Notifications for one workspace, project, user, chat, asset, submission or task.",
      "description": "Socket.IO namespace named after the resource. The `/{visibility}` segment is optional: connect to `/{resourceType}/{resourceId}` for the default channel. Requires a handshake `token`. A user may only join their own `/user/{userId}`; `/project/{id}/creator`, `/reviewer` and `/public` require canGetProjectCreatorNotifications, canGetProjectReviewerNotifications and canGetProjectPublicNotifications; every other channel requires canGet{ResourceType}Notifications (direct or inherited).",
      "parameters": {
        "resourceType": {
          "enum": [
            "workspace",
            "project",
            "user",
            "chat",
            "asset",
            "submission",
            "task"
          ],
          "description": "Type of the resource whose events to receive."
        },
        "resourceId": {
          "description": "UUID (or legacy 24-character hex id) of the resource."
        },
        "visibility": {
          "enum": [
            "creator",
            "reviewer",
            "public"
          ],
          "description": "Optional visibility sub-channel; omit the segment for the default channel."
        }
      },
      "messages": {
        "notification": {
          "$ref": "#/components/messages/notification"
        },
        "test": {
          "$ref": "#/components/messages/test"
        },
        "notificationUpdate": {
          "$ref": "#/components/messages/notificationUpdate"
        },
        "workspaceCreate": {
          "$ref": "#/components/messages/workspaceCreate"
        },
        "workspaceUpdate": {
          "$ref": "#/components/messages/workspaceUpdate"
        },
        "workspaceDelete": {
          "$ref": "#/components/messages/workspaceDelete"
        },
        "workspaceLogoUpdate": {
          "$ref": "#/components/messages/workspaceLogoUpdate"
        },
        "projectCreate": {
          "$ref": "#/components/messages/projectCreate"
        },
        "projectUpdate": {
          "$ref": "#/components/messages/projectUpdate"
        },
        "projectDelete": {
          "$ref": "#/components/messages/projectDelete"
        },
        "projectLogoUpdate": {
          "$ref": "#/components/messages/projectLogoUpdate"
        },
        "projectAssetsPublish": {
          "$ref": "#/components/messages/projectAssetsPublish"
        },
        "projectAssetsUnpublish": {
          "$ref": "#/components/messages/projectAssetsUnpublish"
        },
        "assetNameChange": {
          "$ref": "#/components/messages/assetNameChange"
        },
        "assetPublish": {
          "$ref": "#/components/messages/assetPublish"
        },
        "assetUnpublish": {
          "$ref": "#/components/messages/assetUnpublish"
        },
        "assetTag": {
          "$ref": "#/components/messages/assetTag"
        },
        "assetUntag": {
          "$ref": "#/components/messages/assetUntag"
        },
        "assetDelete": {
          "$ref": "#/components/messages/assetDelete"
        },
        "assetStatusUpdate": {
          "$ref": "#/components/messages/assetStatusUpdate"
        },
        "assetPostProcessUpdate": {
          "$ref": "#/components/messages/assetPostProcessUpdate"
        },
        "assetFileUpdate": {
          "$ref": "#/components/messages/assetFileUpdate"
        },
        "assetGroupUploadComplete": {
          "$ref": "#/components/messages/assetGroupUploadComplete"
        },
        "chatTopicChatCreate": {
          "$ref": "#/components/messages/chatTopicChatCreate"
        },
        "chatMemberChatCreate": {
          "$ref": "#/components/messages/chatMemberChatCreate"
        },
        "chatUpdateSubject": {
          "$ref": "#/components/messages/chatUpdateSubject"
        },
        "chatMemberUpdate": {
          "$ref": "#/components/messages/chatMemberUpdate"
        },
        "chatDelete": {
          "$ref": "#/components/messages/chatDelete"
        },
        "chatMemberDelete": {
          "$ref": "#/components/messages/chatMemberDelete"
        },
        "chatCreateMessage": {
          "$ref": "#/components/messages/chatCreateMessage"
        },
        "chatReviseMessage": {
          "$ref": "#/components/messages/chatReviseMessage"
        },
        "chatRefreshMessage": {
          "$ref": "#/components/messages/chatRefreshMessage"
        },
        "chatMention": {
          "$ref": "#/components/messages/chatMention"
        },
        "chatDeleteMessage": {
          "$ref": "#/components/messages/chatDeleteMessage"
        },
        "chatRemoveAttachment": {
          "$ref": "#/components/messages/chatRemoveAttachment"
        },
        "folderCreate": {
          "$ref": "#/components/messages/folderCreate"
        },
        "folderUpdate": {
          "$ref": "#/components/messages/folderUpdate"
        },
        "folderDelete": {
          "$ref": "#/components/messages/folderDelete"
        },
        "inviteCreate": {
          "$ref": "#/components/messages/inviteCreate"
        },
        "inviteCancel": {
          "$ref": "#/components/messages/inviteCancel"
        },
        "inviteAccept": {
          "$ref": "#/components/messages/inviteAccept"
        },
        "membershipDelete": {
          "$ref": "#/components/messages/membershipDelete"
        },
        "membershipAddRole": {
          "$ref": "#/components/messages/membershipAddRole"
        },
        "membershipRemoveRole": {
          "$ref": "#/components/messages/membershipRemoveRole"
        },
        "membershipLeaveResource": {
          "$ref": "#/components/messages/membershipLeaveResource"
        },
        "workspaceStorageLimitWarning": {
          "$ref": "#/components/messages/workspaceStorageLimitWarning"
        },
        "userSelfUpdate": {
          "$ref": "#/components/messages/userSelfUpdate"
        },
        "userPublicUpdate": {
          "$ref": "#/components/messages/userPublicUpdate"
        },
        "userDeleted": {
          "$ref": "#/components/messages/userDeleted"
        },
        "userAvatarUpdate": {
          "$ref": "#/components/messages/userAvatarUpdate"
        },
        "logoUpdate": {
          "$ref": "#/components/messages/logoUpdate"
        },
        "iconUpdate": {
          "$ref": "#/components/messages/iconUpdate"
        },
        "taskAcknowledged": {
          "$ref": "#/components/messages/taskAcknowledged"
        },
        "taskStatusUpdate": {
          "$ref": "#/components/messages/taskStatusUpdate"
        },
        "taskCreate": {
          "$ref": "#/components/messages/taskCreate"
        },
        "notificationUpdateLastSeen": {
          "$ref": "#/components/messages/notificationUpdateLastSeen"
        },
        "submissionCreate": {
          "$ref": "#/components/messages/submissionCreate"
        },
        "projectItemsPublish": {
          "$ref": "#/components/messages/projectItemsPublish"
        },
        "projectItemsUnpublish": {
          "$ref": "#/components/messages/projectItemsUnpublish"
        },
        "folderPublish": {
          "$ref": "#/components/messages/folderPublish"
        },
        "folderTag": {
          "$ref": "#/components/messages/folderTag"
        },
        "folderUntag": {
          "$ref": "#/components/messages/folderUntag"
        },
        "tagCreate": {
          "$ref": "#/components/messages/tagCreate"
        },
        "tagUpdate": {
          "$ref": "#/components/messages/tagUpdate"
        },
        "tagDelete": {
          "$ref": "#/components/messages/tagDelete"
        },
        "fileSystemCreate": {
          "$ref": "#/components/messages/fileSystemCreate"
        },
        "fileSystemMove": {
          "$ref": "#/components/messages/fileSystemMove"
        },
        "fileSystemCopy": {
          "$ref": "#/components/messages/fileSystemCopy"
        },
        "fileSystemDelete": {
          "$ref": "#/components/messages/fileSystemDelete"
        },
        "fileSystemPublish": {
          "$ref": "#/components/messages/fileSystemPublish"
        },
        "fileSystemUnpublish": {
          "$ref": "#/components/messages/fileSystemUnpublish"
        },
        "subscriptionCreate": {
          "$ref": "#/components/messages/subscriptionCreate"
        },
        "subscriptionUpdate": {
          "$ref": "#/components/messages/subscriptionUpdate"
        },
        "projectGroupItemPublish": {
          "$ref": "#/components/messages/projectGroupItemPublish"
        },
        "publicAssetLinkCreate": {
          "$ref": "#/components/messages/publicAssetLinkCreate"
        },
        "uploadPushSummary": {
          "$ref": "#/components/messages/uploadPushSummary"
        },
        "publishPushSummary": {
          "$ref": "#/components/messages/publishPushSummary"
        },
        "submissionPushSummary": {
          "$ref": "#/components/messages/submissionPushSummary"
        },
        "memberJoinPush": {
          "$ref": "#/components/messages/memberJoinPush"
        },
        "chatMemberArchive": {
          "$ref": "#/components/messages/chatMemberArchive"
        },
        "chatMemberUnarchive": {
          "$ref": "#/components/messages/chatMemberUnarchive"
        },
        "chatHighlightMessage": {
          "$ref": "#/components/messages/chatHighlightMessage"
        },
        "chatFollow": {
          "$ref": "#/components/messages/chatFollow"
        },
        "chatUnfollow": {
          "$ref": "#/components/messages/chatUnfollow"
        },
        "userEmailVerify": {
          "$ref": "#/components/messages/userEmailVerify"
        },
        "botCreate": {
          "$ref": "#/components/messages/botCreate"
        },
        "webhookTest": {
          "$ref": "#/components/messages/webhookTest"
        },
        "taskFollow": {
          "$ref": "#/components/messages/taskFollow"
        },
        "taskUnfollow": {
          "$ref": "#/components/messages/taskUnfollow"
        },
        "submissionUpdate": {
          "$ref": "#/components/messages/submissionUpdate"
        },
        "submissionTag": {
          "$ref": "#/components/messages/submissionTag"
        },
        "submissionUntag": {
          "$ref": "#/components/messages/submissionUntag"
        },
        "aiChatTopicCreate": {
          "$ref": "#/components/messages/aiChatTopicCreate"
        },
        "aiChatTopicUpdate": {
          "$ref": "#/components/messages/aiChatTopicUpdate"
        },
        "aiChatMessageCreate": {
          "$ref": "#/components/messages/aiChatMessageCreate"
        },
        "publicFileSystemCreate": {
          "$ref": "#/components/messages/publicFileSystemCreate"
        },
        "publicFileSystemUpdate": {
          "$ref": "#/components/messages/publicFileSystemUpdate"
        },
        "publicFileSystemDelete": {
          "$ref": "#/components/messages/publicFileSystemDelete"
        },
        "settingsUpdate": {
          "$ref": "#/components/messages/settingsUpdate"
        },
        "convoStart": {
          "$ref": "#/components/messages/convoStart"
        },
        "convoJoin": {
          "$ref": "#/components/messages/convoJoin"
        },
        "convoLeave": {
          "$ref": "#/components/messages/convoLeave"
        },
        "convoComplete": {
          "$ref": "#/components/messages/convoComplete"
        },
        "convoUpdate": {
          "$ref": "#/components/messages/convoUpdate"
        },
        "convoDelete": {
          "$ref": "#/components/messages/convoDelete"
        },
        "convoParticipantJoined": {
          "$ref": "#/components/messages/convoParticipantJoined"
        },
        "convoParticipantLeft": {
          "$ref": "#/components/messages/convoParticipantLeft"
        },
        "convoHandover": {
          "$ref": "#/components/messages/convoHandover"
        },
        "boardCreate": {
          "$ref": "#/components/messages/boardCreate"
        },
        "boardUpdate": {
          "$ref": "#/components/messages/boardUpdate"
        },
        "boardDelete": {
          "$ref": "#/components/messages/boardDelete"
        },
        "boardTaskCreate": {
          "$ref": "#/components/messages/boardTaskCreate"
        },
        "boardTaskMove": {
          "$ref": "#/components/messages/boardTaskMove"
        },
        "boardTaskAssign": {
          "$ref": "#/components/messages/boardTaskAssign"
        },
        "boardColumnAdd": {
          "$ref": "#/components/messages/boardColumnAdd"
        },
        "boardColumnUpdate": {
          "$ref": "#/components/messages/boardColumnUpdate"
        },
        "boardColumnDelete": {
          "$ref": "#/components/messages/boardColumnDelete"
        },
        "boardColumnReorder": {
          "$ref": "#/components/messages/boardColumnReorder"
        },
        "boardTaskAdd": {
          "$ref": "#/components/messages/boardTaskAdd"
        },
        "boardTaskRemove": {
          "$ref": "#/components/messages/boardTaskRemove"
        },
        "boardTaskUpdate": {
          "$ref": "#/components/messages/boardTaskUpdate"
        },
        "boardTaskLink": {
          "$ref": "#/components/messages/boardTaskLink"
        },
        "boardTaskUnlink": {
          "$ref": "#/components/messages/boardTaskUnlink"
        },
        "boardTaskRelationAdd": {
          "$ref": "#/components/messages/boardTaskRelationAdd"
        },
        "boardTaskRelationRemove": {
          "$ref": "#/components/messages/boardTaskRelationRemove"
        },
        "boardFollow": {
          "$ref": "#/components/messages/boardFollow"
        },
        "boardUnfollow": {
          "$ref": "#/components/messages/boardUnfollow"
        },
        "tokenEvent": {
          "$ref": "#/components/messages/tokenEvent"
        },
        "ws-probe": {
          "$ref": "#/components/messages/ws-probe"
        },
        "typing-start": {
          "$ref": "#/components/messages/typing-start"
        },
        "typing-stop": {
          "$ref": "#/components/messages/typing-stop"
        }
      }
    },
    "public": {
      "address": "/public/{token}",
      "title": "Public release namespace",
      "summary": "Notifications for one public release, authenticated by the token in the namespace name.",
      "description": "No handshake `token` is needed (authenticated users may still send one). No visibility suffix. Typing indicators for chats that belong to the release are relayed here as well.",
      "parameters": {
        "token": {
          "description": "10-character alphanumeric public release token."
        }
      },
      "messages": {
        "notification": {
          "$ref": "#/components/messages/notification"
        },
        "test": {
          "$ref": "#/components/messages/test"
        },
        "notificationUpdate": {
          "$ref": "#/components/messages/notificationUpdate"
        },
        "workspaceCreate": {
          "$ref": "#/components/messages/workspaceCreate"
        },
        "workspaceUpdate": {
          "$ref": "#/components/messages/workspaceUpdate"
        },
        "workspaceDelete": {
          "$ref": "#/components/messages/workspaceDelete"
        },
        "workspaceLogoUpdate": {
          "$ref": "#/components/messages/workspaceLogoUpdate"
        },
        "projectCreate": {
          "$ref": "#/components/messages/projectCreate"
        },
        "projectUpdate": {
          "$ref": "#/components/messages/projectUpdate"
        },
        "projectDelete": {
          "$ref": "#/components/messages/projectDelete"
        },
        "projectLogoUpdate": {
          "$ref": "#/components/messages/projectLogoUpdate"
        },
        "projectAssetsPublish": {
          "$ref": "#/components/messages/projectAssetsPublish"
        },
        "projectAssetsUnpublish": {
          "$ref": "#/components/messages/projectAssetsUnpublish"
        },
        "assetNameChange": {
          "$ref": "#/components/messages/assetNameChange"
        },
        "assetPublish": {
          "$ref": "#/components/messages/assetPublish"
        },
        "assetUnpublish": {
          "$ref": "#/components/messages/assetUnpublish"
        },
        "assetTag": {
          "$ref": "#/components/messages/assetTag"
        },
        "assetUntag": {
          "$ref": "#/components/messages/assetUntag"
        },
        "assetDelete": {
          "$ref": "#/components/messages/assetDelete"
        },
        "assetStatusUpdate": {
          "$ref": "#/components/messages/assetStatusUpdate"
        },
        "assetPostProcessUpdate": {
          "$ref": "#/components/messages/assetPostProcessUpdate"
        },
        "assetFileUpdate": {
          "$ref": "#/components/messages/assetFileUpdate"
        },
        "assetGroupUploadComplete": {
          "$ref": "#/components/messages/assetGroupUploadComplete"
        },
        "chatTopicChatCreate": {
          "$ref": "#/components/messages/chatTopicChatCreate"
        },
        "chatMemberChatCreate": {
          "$ref": "#/components/messages/chatMemberChatCreate"
        },
        "chatUpdateSubject": {
          "$ref": "#/components/messages/chatUpdateSubject"
        },
        "chatMemberUpdate": {
          "$ref": "#/components/messages/chatMemberUpdate"
        },
        "chatDelete": {
          "$ref": "#/components/messages/chatDelete"
        },
        "chatMemberDelete": {
          "$ref": "#/components/messages/chatMemberDelete"
        },
        "chatCreateMessage": {
          "$ref": "#/components/messages/chatCreateMessage"
        },
        "chatReviseMessage": {
          "$ref": "#/components/messages/chatReviseMessage"
        },
        "chatRefreshMessage": {
          "$ref": "#/components/messages/chatRefreshMessage"
        },
        "chatMention": {
          "$ref": "#/components/messages/chatMention"
        },
        "chatDeleteMessage": {
          "$ref": "#/components/messages/chatDeleteMessage"
        },
        "chatRemoveAttachment": {
          "$ref": "#/components/messages/chatRemoveAttachment"
        },
        "folderCreate": {
          "$ref": "#/components/messages/folderCreate"
        },
        "folderUpdate": {
          "$ref": "#/components/messages/folderUpdate"
        },
        "folderDelete": {
          "$ref": "#/components/messages/folderDelete"
        },
        "inviteCreate": {
          "$ref": "#/components/messages/inviteCreate"
        },
        "inviteCancel": {
          "$ref": "#/components/messages/inviteCancel"
        },
        "inviteAccept": {
          "$ref": "#/components/messages/inviteAccept"
        },
        "membershipDelete": {
          "$ref": "#/components/messages/membershipDelete"
        },
        "membershipAddRole": {
          "$ref": "#/components/messages/membershipAddRole"
        },
        "membershipRemoveRole": {
          "$ref": "#/components/messages/membershipRemoveRole"
        },
        "membershipLeaveResource": {
          "$ref": "#/components/messages/membershipLeaveResource"
        },
        "workspaceStorageLimitWarning": {
          "$ref": "#/components/messages/workspaceStorageLimitWarning"
        },
        "userSelfUpdate": {
          "$ref": "#/components/messages/userSelfUpdate"
        },
        "userPublicUpdate": {
          "$ref": "#/components/messages/userPublicUpdate"
        },
        "userDeleted": {
          "$ref": "#/components/messages/userDeleted"
        },
        "userAvatarUpdate": {
          "$ref": "#/components/messages/userAvatarUpdate"
        },
        "logoUpdate": {
          "$ref": "#/components/messages/logoUpdate"
        },
        "iconUpdate": {
          "$ref": "#/components/messages/iconUpdate"
        },
        "taskAcknowledged": {
          "$ref": "#/components/messages/taskAcknowledged"
        },
        "taskStatusUpdate": {
          "$ref": "#/components/messages/taskStatusUpdate"
        },
        "taskCreate": {
          "$ref": "#/components/messages/taskCreate"
        },
        "notificationUpdateLastSeen": {
          "$ref": "#/components/messages/notificationUpdateLastSeen"
        },
        "submissionCreate": {
          "$ref": "#/components/messages/submissionCreate"
        },
        "projectItemsPublish": {
          "$ref": "#/components/messages/projectItemsPublish"
        },
        "projectItemsUnpublish": {
          "$ref": "#/components/messages/projectItemsUnpublish"
        },
        "folderPublish": {
          "$ref": "#/components/messages/folderPublish"
        },
        "folderTag": {
          "$ref": "#/components/messages/folderTag"
        },
        "folderUntag": {
          "$ref": "#/components/messages/folderUntag"
        },
        "tagCreate": {
          "$ref": "#/components/messages/tagCreate"
        },
        "tagUpdate": {
          "$ref": "#/components/messages/tagUpdate"
        },
        "tagDelete": {
          "$ref": "#/components/messages/tagDelete"
        },
        "fileSystemCreate": {
          "$ref": "#/components/messages/fileSystemCreate"
        },
        "fileSystemMove": {
          "$ref": "#/components/messages/fileSystemMove"
        },
        "fileSystemCopy": {
          "$ref": "#/components/messages/fileSystemCopy"
        },
        "fileSystemDelete": {
          "$ref": "#/components/messages/fileSystemDelete"
        },
        "fileSystemPublish": {
          "$ref": "#/components/messages/fileSystemPublish"
        },
        "fileSystemUnpublish": {
          "$ref": "#/components/messages/fileSystemUnpublish"
        },
        "subscriptionCreate": {
          "$ref": "#/components/messages/subscriptionCreate"
        },
        "subscriptionUpdate": {
          "$ref": "#/components/messages/subscriptionUpdate"
        },
        "projectGroupItemPublish": {
          "$ref": "#/components/messages/projectGroupItemPublish"
        },
        "publicAssetLinkCreate": {
          "$ref": "#/components/messages/publicAssetLinkCreate"
        },
        "uploadPushSummary": {
          "$ref": "#/components/messages/uploadPushSummary"
        },
        "publishPushSummary": {
          "$ref": "#/components/messages/publishPushSummary"
        },
        "submissionPushSummary": {
          "$ref": "#/components/messages/submissionPushSummary"
        },
        "memberJoinPush": {
          "$ref": "#/components/messages/memberJoinPush"
        },
        "chatMemberArchive": {
          "$ref": "#/components/messages/chatMemberArchive"
        },
        "chatMemberUnarchive": {
          "$ref": "#/components/messages/chatMemberUnarchive"
        },
        "chatHighlightMessage": {
          "$ref": "#/components/messages/chatHighlightMessage"
        },
        "chatFollow": {
          "$ref": "#/components/messages/chatFollow"
        },
        "chatUnfollow": {
          "$ref": "#/components/messages/chatUnfollow"
        },
        "userEmailVerify": {
          "$ref": "#/components/messages/userEmailVerify"
        },
        "botCreate": {
          "$ref": "#/components/messages/botCreate"
        },
        "webhookTest": {
          "$ref": "#/components/messages/webhookTest"
        },
        "taskFollow": {
          "$ref": "#/components/messages/taskFollow"
        },
        "taskUnfollow": {
          "$ref": "#/components/messages/taskUnfollow"
        },
        "submissionUpdate": {
          "$ref": "#/components/messages/submissionUpdate"
        },
        "submissionTag": {
          "$ref": "#/components/messages/submissionTag"
        },
        "submissionUntag": {
          "$ref": "#/components/messages/submissionUntag"
        },
        "aiChatTopicCreate": {
          "$ref": "#/components/messages/aiChatTopicCreate"
        },
        "aiChatTopicUpdate": {
          "$ref": "#/components/messages/aiChatTopicUpdate"
        },
        "aiChatMessageCreate": {
          "$ref": "#/components/messages/aiChatMessageCreate"
        },
        "publicFileSystemCreate": {
          "$ref": "#/components/messages/publicFileSystemCreate"
        },
        "publicFileSystemUpdate": {
          "$ref": "#/components/messages/publicFileSystemUpdate"
        },
        "publicFileSystemDelete": {
          "$ref": "#/components/messages/publicFileSystemDelete"
        },
        "settingsUpdate": {
          "$ref": "#/components/messages/settingsUpdate"
        },
        "convoStart": {
          "$ref": "#/components/messages/convoStart"
        },
        "convoJoin": {
          "$ref": "#/components/messages/convoJoin"
        },
        "convoLeave": {
          "$ref": "#/components/messages/convoLeave"
        },
        "convoComplete": {
          "$ref": "#/components/messages/convoComplete"
        },
        "convoUpdate": {
          "$ref": "#/components/messages/convoUpdate"
        },
        "convoDelete": {
          "$ref": "#/components/messages/convoDelete"
        },
        "convoParticipantJoined": {
          "$ref": "#/components/messages/convoParticipantJoined"
        },
        "convoParticipantLeft": {
          "$ref": "#/components/messages/convoParticipantLeft"
        },
        "convoHandover": {
          "$ref": "#/components/messages/convoHandover"
        },
        "boardCreate": {
          "$ref": "#/components/messages/boardCreate"
        },
        "boardUpdate": {
          "$ref": "#/components/messages/boardUpdate"
        },
        "boardDelete": {
          "$ref": "#/components/messages/boardDelete"
        },
        "boardTaskCreate": {
          "$ref": "#/components/messages/boardTaskCreate"
        },
        "boardTaskMove": {
          "$ref": "#/components/messages/boardTaskMove"
        },
        "boardTaskAssign": {
          "$ref": "#/components/messages/boardTaskAssign"
        },
        "boardColumnAdd": {
          "$ref": "#/components/messages/boardColumnAdd"
        },
        "boardColumnUpdate": {
          "$ref": "#/components/messages/boardColumnUpdate"
        },
        "boardColumnDelete": {
          "$ref": "#/components/messages/boardColumnDelete"
        },
        "boardColumnReorder": {
          "$ref": "#/components/messages/boardColumnReorder"
        },
        "boardTaskAdd": {
          "$ref": "#/components/messages/boardTaskAdd"
        },
        "boardTaskRemove": {
          "$ref": "#/components/messages/boardTaskRemove"
        },
        "boardTaskUpdate": {
          "$ref": "#/components/messages/boardTaskUpdate"
        },
        "boardTaskLink": {
          "$ref": "#/components/messages/boardTaskLink"
        },
        "boardTaskUnlink": {
          "$ref": "#/components/messages/boardTaskUnlink"
        },
        "boardTaskRelationAdd": {
          "$ref": "#/components/messages/boardTaskRelationAdd"
        },
        "boardTaskRelationRemove": {
          "$ref": "#/components/messages/boardTaskRelationRemove"
        },
        "boardFollow": {
          "$ref": "#/components/messages/boardFollow"
        },
        "boardUnfollow": {
          "$ref": "#/components/messages/boardUnfollow"
        }
      }
    },
    "collab": {
      "address": "/chat/{resourceId}",
      "title": "Collab session namespace",
      "summary": "Real-time collaboration relay (cursors, drawing, presenter control) between the sockets of one chat.",
      "description": "The relay runs on namespaces starting with `/chat/`; the same connection also receives the notification events of the resource namespace. Relayed payloads are enriched server-side with the authenticated user identity, so client supplied identity keys are overwritten.",
      "parameters": {
        "resourceId": {
          "description": "UUID of the chat."
        }
      },
      "messages": {
        "collab-join": {
          "$ref": "#/components/messages/collab-join"
        },
        "collab-leave": {
          "$ref": "#/components/messages/collab-leave"
        },
        "collab-cursor-move": {
          "$ref": "#/components/messages/collab-cursor-move"
        },
        "collab-cursor-hide": {
          "$ref": "#/components/messages/collab-cursor-hide"
        },
        "collab-path-start": {
          "$ref": "#/components/messages/collab-path-start"
        },
        "collab-path-update": {
          "$ref": "#/components/messages/collab-path-update"
        },
        "collab-path-end": {
          "$ref": "#/components/messages/collab-path-end"
        },
        "collab-path-clear": {
          "$ref": "#/components/messages/collab-path-clear"
        },
        "collab-click": {
          "$ref": "#/components/messages/collab-click"
        },
        "collab-color-change": {
          "$ref": "#/components/messages/collab-color-change"
        },
        "collab-region-create": {
          "$ref": "#/components/messages/collab-region-create"
        },
        "collab-region-remove": {
          "$ref": "#/components/messages/collab-region-remove"
        },
        "collab-zoom-sync": {
          "$ref": "#/components/messages/collab-zoom-sync"
        },
        "collab-playback-sync": {
          "$ref": "#/components/messages/collab-playback-sync"
        },
        "collab-playback-sync-rejected": {
          "$ref": "#/components/messages/collab-playback-sync-rejected"
        },
        "collab-presenter-assign": {
          "$ref": "#/components/messages/collab-presenter-assign"
        },
        "collab-presenter-state": {
          "$ref": "#/components/messages/collab-presenter-state"
        },
        "collab-presenter-request": {
          "$ref": "#/components/messages/collab-presenter-request"
        },
        "collab-presenter-takeover": {
          "$ref": "#/components/messages/collab-presenter-takeover"
        },
        "collab-state-request": {
          "$ref": "#/components/messages/collab-state-request"
        },
        "collab-state-response": {
          "$ref": "#/components/messages/collab-state-response"
        },
        "collab-members": {
          "$ref": "#/components/messages/collab-members"
        },
        "collab-self-color": {
          "$ref": "#/components/messages/collab-self-color"
        }
      }
    }
  },
  "operations": {
    "receive-notification": {
      "action": "receive",
      "channel": {
        "$ref": "#/channels/resource"
      },
      "title": "Receive notification",
      "summary": "Envelope event on which every notification listed in this section is delivered. The type property tells you which event schema applies.",
      "description": "Emitted on every channel (namespace) listed in the notification's channels array. Unlike the REST notification objects, the socket payload does NOT include id or channels. tokens and changes are shaped per event type as documented under each event.",
      "messages": [
        {
          "$ref": "#/channels/resource/messages/notification"
        },
        {
          "$ref": "#/channels/resource/messages/test"
        },
        {
          "$ref": "#/channels/resource/messages/notificationUpdate"
        },
        {
          "$ref": "#/channels/resource/messages/workspaceCreate"
        },
        {
          "$ref": "#/channels/resource/messages/workspaceUpdate"
        },
        {
          "$ref": "#/channels/resource/messages/workspaceDelete"
        },
        {
          "$ref": "#/channels/resource/messages/workspaceLogoUpdate"
        },
        {
          "$ref": "#/channels/resource/messages/projectCreate"
        },
        {
          "$ref": "#/channels/resource/messages/projectUpdate"
        },
        {
          "$ref": "#/channels/resource/messages/projectDelete"
        },
        {
          "$ref": "#/channels/resource/messages/projectLogoUpdate"
        },
        {
          "$ref": "#/channels/resource/messages/projectAssetsPublish"
        },
        {
          "$ref": "#/channels/resource/messages/projectAssetsUnpublish"
        },
        {
          "$ref": "#/channels/resource/messages/assetNameChange"
        },
        {
          "$ref": "#/channels/resource/messages/assetPublish"
        },
        {
          "$ref": "#/channels/resource/messages/assetUnpublish"
        },
        {
          "$ref": "#/channels/resource/messages/assetTag"
        },
        {
          "$ref": "#/channels/resource/messages/assetUntag"
        },
        {
          "$ref": "#/channels/resource/messages/assetDelete"
        },
        {
          "$ref": "#/channels/resource/messages/assetStatusUpdate"
        },
        {
          "$ref": "#/channels/resource/messages/assetPostProcessUpdate"
        },
        {
          "$ref": "#/channels/resource/messages/assetFileUpdate"
        },
        {
          "$ref": "#/channels/resource/messages/assetGroupUploadComplete"
        },
        {
          "$ref": "#/channels/resource/messages/chatTopicChatCreate"
        },
        {
          "$ref": "#/channels/resource/messages/chatMemberChatCreate"
        },
        {
          "$ref": "#/channels/resource/messages/chatUpdateSubject"
        },
        {
          "$ref": "#/channels/resource/messages/chatMemberUpdate"
        },
        {
          "$ref": "#/channels/resource/messages/chatDelete"
        },
        {
          "$ref": "#/channels/resource/messages/chatMemberDelete"
        },
        {
          "$ref": "#/channels/resource/messages/chatCreateMessage"
        },
        {
          "$ref": "#/channels/resource/messages/chatReviseMessage"
        },
        {
          "$ref": "#/channels/resource/messages/chatRefreshMessage"
        },
        {
          "$ref": "#/channels/resource/messages/chatMention"
        },
        {
          "$ref": "#/channels/resource/messages/chatDeleteMessage"
        },
        {
          "$ref": "#/channels/resource/messages/chatRemoveAttachment"
        },
        {
          "$ref": "#/channels/resource/messages/folderCreate"
        },
        {
          "$ref": "#/channels/resource/messages/folderUpdate"
        },
        {
          "$ref": "#/channels/resource/messages/folderDelete"
        },
        {
          "$ref": "#/channels/resource/messages/inviteCreate"
        },
        {
          "$ref": "#/channels/resource/messages/inviteCancel"
        },
        {
          "$ref": "#/channels/resource/messages/inviteAccept"
        },
        {
          "$ref": "#/channels/resource/messages/membershipDelete"
        },
        {
          "$ref": "#/channels/resource/messages/membershipAddRole"
        },
        {
          "$ref": "#/channels/resource/messages/membershipRemoveRole"
        },
        {
          "$ref": "#/channels/resource/messages/membershipLeaveResource"
        },
        {
          "$ref": "#/channels/resource/messages/workspaceStorageLimitWarning"
        },
        {
          "$ref": "#/channels/resource/messages/userSelfUpdate"
        },
        {
          "$ref": "#/channels/resource/messages/userPublicUpdate"
        },
        {
          "$ref": "#/channels/resource/messages/userDeleted"
        },
        {
          "$ref": "#/channels/resource/messages/userAvatarUpdate"
        },
        {
          "$ref": "#/channels/resource/messages/logoUpdate"
        },
        {
          "$ref": "#/channels/resource/messages/iconUpdate"
        },
        {
          "$ref": "#/channels/resource/messages/taskAcknowledged"
        },
        {
          "$ref": "#/channels/resource/messages/taskStatusUpdate"
        },
        {
          "$ref": "#/channels/resource/messages/taskCreate"
        },
        {
          "$ref": "#/channels/resource/messages/notificationUpdateLastSeen"
        },
        {
          "$ref": "#/channels/resource/messages/submissionCreate"
        },
        {
          "$ref": "#/channels/resource/messages/projectItemsPublish"
        },
        {
          "$ref": "#/channels/resource/messages/projectItemsUnpublish"
        },
        {
          "$ref": "#/channels/resource/messages/folderPublish"
        },
        {
          "$ref": "#/channels/resource/messages/folderTag"
        },
        {
          "$ref": "#/channels/resource/messages/folderUntag"
        },
        {
          "$ref": "#/channels/resource/messages/tagCreate"
        },
        {
          "$ref": "#/channels/resource/messages/tagUpdate"
        },
        {
          "$ref": "#/channels/resource/messages/tagDelete"
        },
        {
          "$ref": "#/channels/resource/messages/fileSystemCreate"
        },
        {
          "$ref": "#/channels/resource/messages/fileSystemMove"
        },
        {
          "$ref": "#/channels/resource/messages/fileSystemCopy"
        },
        {
          "$ref": "#/channels/resource/messages/fileSystemDelete"
        },
        {
          "$ref": "#/channels/resource/messages/fileSystemPublish"
        },
        {
          "$ref": "#/channels/resource/messages/fileSystemUnpublish"
        },
        {
          "$ref": "#/channels/resource/messages/subscriptionCreate"
        },
        {
          "$ref": "#/channels/resource/messages/subscriptionUpdate"
        },
        {
          "$ref": "#/channels/resource/messages/projectGroupItemPublish"
        },
        {
          "$ref": "#/channels/resource/messages/publicAssetLinkCreate"
        },
        {
          "$ref": "#/channels/resource/messages/uploadPushSummary"
        },
        {
          "$ref": "#/channels/resource/messages/publishPushSummary"
        },
        {
          "$ref": "#/channels/resource/messages/submissionPushSummary"
        },
        {
          "$ref": "#/channels/resource/messages/memberJoinPush"
        },
        {
          "$ref": "#/channels/resource/messages/chatMemberArchive"
        },
        {
          "$ref": "#/channels/resource/messages/chatMemberUnarchive"
        },
        {
          "$ref": "#/channels/resource/messages/chatHighlightMessage"
        },
        {
          "$ref": "#/channels/resource/messages/chatFollow"
        },
        {
          "$ref": "#/channels/resource/messages/chatUnfollow"
        },
        {
          "$ref": "#/channels/resource/messages/userEmailVerify"
        },
        {
          "$ref": "#/channels/resource/messages/botCreate"
        },
        {
          "$ref": "#/channels/resource/messages/webhookTest"
        },
        {
          "$ref": "#/channels/resource/messages/taskFollow"
        },
        {
          "$ref": "#/channels/resource/messages/taskUnfollow"
        },
        {
          "$ref": "#/channels/resource/messages/submissionUpdate"
        },
        {
          "$ref": "#/channels/resource/messages/submissionTag"
        },
        {
          "$ref": "#/channels/resource/messages/submissionUntag"
        },
        {
          "$ref": "#/channels/resource/messages/aiChatTopicCreate"
        },
        {
          "$ref": "#/channels/resource/messages/aiChatTopicUpdate"
        },
        {
          "$ref": "#/channels/resource/messages/aiChatMessageCreate"
        },
        {
          "$ref": "#/channels/resource/messages/publicFileSystemCreate"
        },
        {
          "$ref": "#/channels/resource/messages/publicFileSystemUpdate"
        },
        {
          "$ref": "#/channels/resource/messages/publicFileSystemDelete"
        },
        {
          "$ref": "#/channels/resource/messages/settingsUpdate"
        },
        {
          "$ref": "#/channels/resource/messages/convoStart"
        },
        {
          "$ref": "#/channels/resource/messages/convoJoin"
        },
        {
          "$ref": "#/channels/resource/messages/convoLeave"
        },
        {
          "$ref": "#/channels/resource/messages/convoComplete"
        },
        {
          "$ref": "#/channels/resource/messages/convoUpdate"
        },
        {
          "$ref": "#/channels/resource/messages/convoDelete"
        },
        {
          "$ref": "#/channels/resource/messages/convoParticipantJoined"
        },
        {
          "$ref": "#/channels/resource/messages/convoParticipantLeft"
        },
        {
          "$ref": "#/channels/resource/messages/convoHandover"
        },
        {
          "$ref": "#/channels/resource/messages/boardCreate"
        },
        {
          "$ref": "#/channels/resource/messages/boardUpdate"
        },
        {
          "$ref": "#/channels/resource/messages/boardDelete"
        },
        {
          "$ref": "#/channels/resource/messages/boardTaskCreate"
        },
        {
          "$ref": "#/channels/resource/messages/boardTaskMove"
        },
        {
          "$ref": "#/channels/resource/messages/boardTaskAssign"
        },
        {
          "$ref": "#/channels/resource/messages/boardColumnAdd"
        },
        {
          "$ref": "#/channels/resource/messages/boardColumnUpdate"
        },
        {
          "$ref": "#/channels/resource/messages/boardColumnDelete"
        },
        {
          "$ref": "#/channels/resource/messages/boardColumnReorder"
        },
        {
          "$ref": "#/channels/resource/messages/boardTaskAdd"
        },
        {
          "$ref": "#/channels/resource/messages/boardTaskRemove"
        },
        {
          "$ref": "#/channels/resource/messages/boardTaskUpdate"
        },
        {
          "$ref": "#/channels/resource/messages/boardTaskLink"
        },
        {
          "$ref": "#/channels/resource/messages/boardTaskUnlink"
        },
        {
          "$ref": "#/channels/resource/messages/boardTaskRelationAdd"
        },
        {
          "$ref": "#/channels/resource/messages/boardTaskRelationRemove"
        },
        {
          "$ref": "#/channels/resource/messages/boardFollow"
        },
        {
          "$ref": "#/channels/resource/messages/boardUnfollow"
        }
      ],
      "x-socket-event": "notification"
    },
    "receive-public-notification": {
      "action": "receive",
      "channel": {
        "$ref": "#/channels/public"
      },
      "title": "Receive notification",
      "summary": "Envelope event on which every notification listed in this section is delivered. The type property tells you which event schema applies.",
      "description": "Emitted on every channel (namespace) listed in the notification's channels array. Unlike the REST notification objects, the socket payload does NOT include id or channels. tokens and changes are shaped per event type as documented under each event.",
      "messages": [
        {
          "$ref": "#/channels/public/messages/notification"
        },
        {
          "$ref": "#/channels/public/messages/test"
        },
        {
          "$ref": "#/channels/public/messages/notificationUpdate"
        },
        {
          "$ref": "#/channels/public/messages/workspaceCreate"
        },
        {
          "$ref": "#/channels/public/messages/workspaceUpdate"
        },
        {
          "$ref": "#/channels/public/messages/workspaceDelete"
        },
        {
          "$ref": "#/channels/public/messages/workspaceLogoUpdate"
        },
        {
          "$ref": "#/channels/public/messages/projectCreate"
        },
        {
          "$ref": "#/channels/public/messages/projectUpdate"
        },
        {
          "$ref": "#/channels/public/messages/projectDelete"
        },
        {
          "$ref": "#/channels/public/messages/projectLogoUpdate"
        },
        {
          "$ref": "#/channels/public/messages/projectAssetsPublish"
        },
        {
          "$ref": "#/channels/public/messages/projectAssetsUnpublish"
        },
        {
          "$ref": "#/channels/public/messages/assetNameChange"
        },
        {
          "$ref": "#/channels/public/messages/assetPublish"
        },
        {
          "$ref": "#/channels/public/messages/assetUnpublish"
        },
        {
          "$ref": "#/channels/public/messages/assetTag"
        },
        {
          "$ref": "#/channels/public/messages/assetUntag"
        },
        {
          "$ref": "#/channels/public/messages/assetDelete"
        },
        {
          "$ref": "#/channels/public/messages/assetStatusUpdate"
        },
        {
          "$ref": "#/channels/public/messages/assetPostProcessUpdate"
        },
        {
          "$ref": "#/channels/public/messages/assetFileUpdate"
        },
        {
          "$ref": "#/channels/public/messages/assetGroupUploadComplete"
        },
        {
          "$ref": "#/channels/public/messages/chatTopicChatCreate"
        },
        {
          "$ref": "#/channels/public/messages/chatMemberChatCreate"
        },
        {
          "$ref": "#/channels/public/messages/chatUpdateSubject"
        },
        {
          "$ref": "#/channels/public/messages/chatMemberUpdate"
        },
        {
          "$ref": "#/channels/public/messages/chatDelete"
        },
        {
          "$ref": "#/channels/public/messages/chatMemberDelete"
        },
        {
          "$ref": "#/channels/public/messages/chatCreateMessage"
        },
        {
          "$ref": "#/channels/public/messages/chatReviseMessage"
        },
        {
          "$ref": "#/channels/public/messages/chatRefreshMessage"
        },
        {
          "$ref": "#/channels/public/messages/chatMention"
        },
        {
          "$ref": "#/channels/public/messages/chatDeleteMessage"
        },
        {
          "$ref": "#/channels/public/messages/chatRemoveAttachment"
        },
        {
          "$ref": "#/channels/public/messages/folderCreate"
        },
        {
          "$ref": "#/channels/public/messages/folderUpdate"
        },
        {
          "$ref": "#/channels/public/messages/folderDelete"
        },
        {
          "$ref": "#/channels/public/messages/inviteCreate"
        },
        {
          "$ref": "#/channels/public/messages/inviteCancel"
        },
        {
          "$ref": "#/channels/public/messages/inviteAccept"
        },
        {
          "$ref": "#/channels/public/messages/membershipDelete"
        },
        {
          "$ref": "#/channels/public/messages/membershipAddRole"
        },
        {
          "$ref": "#/channels/public/messages/membershipRemoveRole"
        },
        {
          "$ref": "#/channels/public/messages/membershipLeaveResource"
        },
        {
          "$ref": "#/channels/public/messages/workspaceStorageLimitWarning"
        },
        {
          "$ref": "#/channels/public/messages/userSelfUpdate"
        },
        {
          "$ref": "#/channels/public/messages/userPublicUpdate"
        },
        {
          "$ref": "#/channels/public/messages/userDeleted"
        },
        {
          "$ref": "#/channels/public/messages/userAvatarUpdate"
        },
        {
          "$ref": "#/channels/public/messages/logoUpdate"
        },
        {
          "$ref": "#/channels/public/messages/iconUpdate"
        },
        {
          "$ref": "#/channels/public/messages/taskAcknowledged"
        },
        {
          "$ref": "#/channels/public/messages/taskStatusUpdate"
        },
        {
          "$ref": "#/channels/public/messages/taskCreate"
        },
        {
          "$ref": "#/channels/public/messages/notificationUpdateLastSeen"
        },
        {
          "$ref": "#/channels/public/messages/submissionCreate"
        },
        {
          "$ref": "#/channels/public/messages/projectItemsPublish"
        },
        {
          "$ref": "#/channels/public/messages/projectItemsUnpublish"
        },
        {
          "$ref": "#/channels/public/messages/folderPublish"
        },
        {
          "$ref": "#/channels/public/messages/folderTag"
        },
        {
          "$ref": "#/channels/public/messages/folderUntag"
        },
        {
          "$ref": "#/channels/public/messages/tagCreate"
        },
        {
          "$ref": "#/channels/public/messages/tagUpdate"
        },
        {
          "$ref": "#/channels/public/messages/tagDelete"
        },
        {
          "$ref": "#/channels/public/messages/fileSystemCreate"
        },
        {
          "$ref": "#/channels/public/messages/fileSystemMove"
        },
        {
          "$ref": "#/channels/public/messages/fileSystemCopy"
        },
        {
          "$ref": "#/channels/public/messages/fileSystemDelete"
        },
        {
          "$ref": "#/channels/public/messages/fileSystemPublish"
        },
        {
          "$ref": "#/channels/public/messages/fileSystemUnpublish"
        },
        {
          "$ref": "#/channels/public/messages/subscriptionCreate"
        },
        {
          "$ref": "#/channels/public/messages/subscriptionUpdate"
        },
        {
          "$ref": "#/channels/public/messages/projectGroupItemPublish"
        },
        {
          "$ref": "#/channels/public/messages/publicAssetLinkCreate"
        },
        {
          "$ref": "#/channels/public/messages/uploadPushSummary"
        },
        {
          "$ref": "#/channels/public/messages/publishPushSummary"
        },
        {
          "$ref": "#/channels/public/messages/submissionPushSummary"
        },
        {
          "$ref": "#/channels/public/messages/memberJoinPush"
        },
        {
          "$ref": "#/channels/public/messages/chatMemberArchive"
        },
        {
          "$ref": "#/channels/public/messages/chatMemberUnarchive"
        },
        {
          "$ref": "#/channels/public/messages/chatHighlightMessage"
        },
        {
          "$ref": "#/channels/public/messages/chatFollow"
        },
        {
          "$ref": "#/channels/public/messages/chatUnfollow"
        },
        {
          "$ref": "#/channels/public/messages/userEmailVerify"
        },
        {
          "$ref": "#/channels/public/messages/botCreate"
        },
        {
          "$ref": "#/channels/public/messages/webhookTest"
        },
        {
          "$ref": "#/channels/public/messages/taskFollow"
        },
        {
          "$ref": "#/channels/public/messages/taskUnfollow"
        },
        {
          "$ref": "#/channels/public/messages/submissionUpdate"
        },
        {
          "$ref": "#/channels/public/messages/submissionTag"
        },
        {
          "$ref": "#/channels/public/messages/submissionUntag"
        },
        {
          "$ref": "#/channels/public/messages/aiChatTopicCreate"
        },
        {
          "$ref": "#/channels/public/messages/aiChatTopicUpdate"
        },
        {
          "$ref": "#/channels/public/messages/aiChatMessageCreate"
        },
        {
          "$ref": "#/channels/public/messages/publicFileSystemCreate"
        },
        {
          "$ref": "#/channels/public/messages/publicFileSystemUpdate"
        },
        {
          "$ref": "#/channels/public/messages/publicFileSystemDelete"
        },
        {
          "$ref": "#/channels/public/messages/settingsUpdate"
        },
        {
          "$ref": "#/channels/public/messages/convoStart"
        },
        {
          "$ref": "#/channels/public/messages/convoJoin"
        },
        {
          "$ref": "#/channels/public/messages/convoLeave"
        },
        {
          "$ref": "#/channels/public/messages/convoComplete"
        },
        {
          "$ref": "#/channels/public/messages/convoUpdate"
        },
        {
          "$ref": "#/channels/public/messages/convoDelete"
        },
        {
          "$ref": "#/channels/public/messages/convoParticipantJoined"
        },
        {
          "$ref": "#/channels/public/messages/convoParticipantLeft"
        },
        {
          "$ref": "#/channels/public/messages/convoHandover"
        },
        {
          "$ref": "#/channels/public/messages/boardCreate"
        },
        {
          "$ref": "#/channels/public/messages/boardUpdate"
        },
        {
          "$ref": "#/channels/public/messages/boardDelete"
        },
        {
          "$ref": "#/channels/public/messages/boardTaskCreate"
        },
        {
          "$ref": "#/channels/public/messages/boardTaskMove"
        },
        {
          "$ref": "#/channels/public/messages/boardTaskAssign"
        },
        {
          "$ref": "#/channels/public/messages/boardColumnAdd"
        },
        {
          "$ref": "#/channels/public/messages/boardColumnUpdate"
        },
        {
          "$ref": "#/channels/public/messages/boardColumnDelete"
        },
        {
          "$ref": "#/channels/public/messages/boardColumnReorder"
        },
        {
          "$ref": "#/channels/public/messages/boardTaskAdd"
        },
        {
          "$ref": "#/channels/public/messages/boardTaskRemove"
        },
        {
          "$ref": "#/channels/public/messages/boardTaskUpdate"
        },
        {
          "$ref": "#/channels/public/messages/boardTaskLink"
        },
        {
          "$ref": "#/channels/public/messages/boardTaskUnlink"
        },
        {
          "$ref": "#/channels/public/messages/boardTaskRelationAdd"
        },
        {
          "$ref": "#/channels/public/messages/boardTaskRelationRemove"
        },
        {
          "$ref": "#/channels/public/messages/boardFollow"
        },
        {
          "$ref": "#/channels/public/messages/boardUnfollow"
        }
      ],
      "x-socket-event": "notification"
    },
    "receive-tokenEvent": {
      "action": "receive",
      "channel": {
        "$ref": "#/channels/resource"
      },
      "title": "Receive tokenEvent",
      "summary": "Emitted by the server right before it force-disconnects a socket whose credential is no longer valid.",
      "description": "Payload is a plain string, not an object. 'TokenExpired' is sent when the JWT exp has passed, 'tokenBlacklisted' when the JWT was blacklisted (logout) or a bot API key was revoked. The socket is disconnected ~1 second later; re-authenticate and reconnect.",
      "messages": [
        {
          "$ref": "#/channels/resource/messages/tokenEvent"
        }
      ],
      "x-socket-event": "tokenEvent"
    },
    "send-ws-probe": {
      "action": "send",
      "channel": {
        "$ref": "#/channels/resource"
      },
      "title": "Emit ws:probe",
      "summary": "Client -> server liveness probe. Emit with an acknowledgement callback; the server acks immediately with no payload.",
      "description": "Client emits ws:probe (any/no data) using socket.io acks, e.g. socket.timeout(2000).emit('ws:probe', null, (err) => ...). A missing ack means the connection is stale and should be torn down. Nothing is emitted by the server other than the ack.",
      "messages": [
        {
          "$ref": "#/channels/resource/messages/ws-probe"
        }
      ],
      "x-socket-event": "ws:probe"
    },
    "send-typing-start": {
      "action": "send",
      "channel": {
        "$ref": "#/channels/resource"
      },
      "title": "Emit typing:start",
      "summary": "Ephemeral typing indicator. Client -> server: emit { chatId }. Server -> clients: relayed with the authenticated userId to every other socket on the chat channels.",
      "description": "Client emits typing:start with { chatId: string }. The server resolves the same channels a chatCreateMessage for that chat would use (chat/{chatId}, project/{projectId}/{visibility}, public/{token}; never user/* channels) and emits typing:start on each of them to every socket except the sender. Not persisted; not delivered as a 'notification' event.",
      "messages": [
        {
          "$ref": "#/channels/resource/messages/typing-start"
        }
      ],
      "x-socket-event": "typing:start"
    },
    "receive-typing-start": {
      "action": "receive",
      "channel": {
        "$ref": "#/channels/resource"
      },
      "title": "Receive typing:start",
      "summary": "Ephemeral typing indicator. Client -> server: emit { chatId }. Server -> clients: relayed with the authenticated userId to every other socket on the chat channels.",
      "description": "Client emits typing:start with { chatId: string }. The server resolves the same channels a chatCreateMessage for that chat would use (chat/{chatId}, project/{projectId}/{visibility}, public/{token}; never user/* channels) and emits typing:start on each of them to every socket except the sender. Not persisted; not delivered as a 'notification' event.",
      "messages": [
        {
          "$ref": "#/channels/resource/messages/typing-start"
        }
      ],
      "x-socket-event": "typing:start"
    },
    "send-typing-stop": {
      "action": "send",
      "channel": {
        "$ref": "#/channels/resource"
      },
      "title": "Emit typing:stop",
      "summary": "Ephemeral typing indicator stop. Client -> server: emit { chatId }. Server -> clients: relayed with the authenticated userId to every other socket on the chat channels.",
      "description": "Same routing and payload as typing:start.",
      "messages": [
        {
          "$ref": "#/channels/resource/messages/typing-stop"
        }
      ],
      "x-socket-event": "typing:stop"
    },
    "receive-typing-stop": {
      "action": "receive",
      "channel": {
        "$ref": "#/channels/resource"
      },
      "title": "Receive typing:stop",
      "summary": "Ephemeral typing indicator stop. Client -> server: emit { chatId }. Server -> clients: relayed with the authenticated userId to every other socket on the chat channels.",
      "description": "Same routing and payload as typing:start.",
      "messages": [
        {
          "$ref": "#/channels/resource/messages/typing-stop"
        }
      ],
      "x-socket-event": "typing:stop"
    },
    "send-collab-join": {
      "action": "send",
      "channel": {
        "$ref": "#/channels/collab"
      },
      "title": "Emit collab:join",
      "summary": "A user joined the collab session on this chat namespace (broadcast to the other members).",
      "description": "Client emits collab:join with optional { preferredAnnotationColor }. Client -> server -> all other sockets in the same /chat/{chatId} namespace. The server spreads the client payload and appends the authenticated user identity (userId, displayName, color, avatarUrl), the annotationColor assigned on collab:join and a timestamp; client supplied values for those keys are overwritten. The joining socket additionally receives collab:self-color, collab:members (if others are present) and either collab:presenter-assign (first member) or collab:presenter-state.",
      "messages": [
        {
          "$ref": "#/channels/collab/messages/collab-join"
        }
      ],
      "x-socket-event": "collab:join"
    },
    "receive-collab-join": {
      "action": "receive",
      "channel": {
        "$ref": "#/channels/collab"
      },
      "title": "Receive collab:join",
      "summary": "A user joined the collab session on this chat namespace (broadcast to the other members).",
      "description": "Client emits collab:join with optional { preferredAnnotationColor }. Client -> server -> all other sockets in the same /chat/{chatId} namespace. The server spreads the client payload and appends the authenticated user identity (userId, displayName, color, avatarUrl), the annotationColor assigned on collab:join and a timestamp; client supplied values for those keys are overwritten. The joining socket additionally receives collab:self-color, collab:members (if others are present) and either collab:presenter-assign (first member) or collab:presenter-state.",
      "messages": [
        {
          "$ref": "#/channels/collab/messages/collab-join"
        }
      ],
      "x-socket-event": "collab:join"
    },
    "send-collab-leave": {
      "action": "send",
      "channel": {
        "$ref": "#/channels/collab"
      },
      "title": "Emit collab:leave",
      "summary": "A user left the collab session (explicit collab:leave from the client or socket disconnect).",
      "description": "Client -> server -> all other sockets in the same /chat/{chatId} namespace. The server spreads the client payload and appends the authenticated user identity (userId, displayName, color, avatarUrl), the annotationColor assigned on collab:join and a timestamp; client supplied values for those keys are overwritten. On disconnect the server emits it on behalf of the leaving socket; if they were the presenter a collab:presenter-assign (reason transfer-on-leave) follows.",
      "messages": [
        {
          "$ref": "#/channels/collab/messages/collab-leave"
        }
      ],
      "x-socket-event": "collab:leave"
    },
    "receive-collab-leave": {
      "action": "receive",
      "channel": {
        "$ref": "#/channels/collab"
      },
      "title": "Receive collab:leave",
      "summary": "A user left the collab session (explicit collab:leave from the client or socket disconnect).",
      "description": "Client -> server -> all other sockets in the same /chat/{chatId} namespace. The server spreads the client payload and appends the authenticated user identity (userId, displayName, color, avatarUrl), the annotationColor assigned on collab:join and a timestamp; client supplied values for those keys are overwritten. On disconnect the server emits it on behalf of the leaving socket; if they were the presenter a collab:presenter-assign (reason transfer-on-leave) follows.",
      "messages": [
        {
          "$ref": "#/channels/collab/messages/collab-leave"
        }
      ],
      "x-socket-event": "collab:leave"
    },
    "send-collab-cursor-move": {
      "action": "send",
      "channel": {
        "$ref": "#/channels/collab"
      },
      "title": "Emit collab:cursor-move",
      "summary": "Remote cursor position update (percentage coordinates).",
      "description": "Client -> server -> all other sockets in the same /chat/{chatId} namespace. The server spreads the client payload and appends the authenticated user identity (userId, displayName, color, avatarUrl), the annotationColor assigned on collab:join and a timestamp; client supplied values for those keys are overwritten.",
      "messages": [
        {
          "$ref": "#/channels/collab/messages/collab-cursor-move"
        }
      ],
      "x-socket-event": "collab:cursor-move"
    },
    "receive-collab-cursor-move": {
      "action": "receive",
      "channel": {
        "$ref": "#/channels/collab"
      },
      "title": "Receive collab:cursor-move",
      "summary": "Remote cursor position update (percentage coordinates).",
      "description": "Client -> server -> all other sockets in the same /chat/{chatId} namespace. The server spreads the client payload and appends the authenticated user identity (userId, displayName, color, avatarUrl), the annotationColor assigned on collab:join and a timestamp; client supplied values for those keys are overwritten.",
      "messages": [
        {
          "$ref": "#/channels/collab/messages/collab-cursor-move"
        }
      ],
      "x-socket-event": "collab:cursor-move"
    },
    "send-collab-cursor-hide": {
      "action": "send",
      "channel": {
        "$ref": "#/channels/collab"
      },
      "title": "Emit collab:cursor-hide",
      "summary": "Remote cursor left the asset area.",
      "description": "Client -> server -> all other sockets in the same /chat/{chatId} namespace. The server spreads the client payload and appends the authenticated user identity (userId, displayName, color, avatarUrl), the annotationColor assigned on collab:join and a timestamp; client supplied values for those keys are overwritten.",
      "messages": [
        {
          "$ref": "#/channels/collab/messages/collab-cursor-hide"
        }
      ],
      "x-socket-event": "collab:cursor-hide"
    },
    "receive-collab-cursor-hide": {
      "action": "receive",
      "channel": {
        "$ref": "#/channels/collab"
      },
      "title": "Receive collab:cursor-hide",
      "summary": "Remote cursor left the asset area.",
      "description": "Client -> server -> all other sockets in the same /chat/{chatId} namespace. The server spreads the client payload and appends the authenticated user identity (userId, displayName, color, avatarUrl), the annotationColor assigned on collab:join and a timestamp; client supplied values for those keys are overwritten.",
      "messages": [
        {
          "$ref": "#/channels/collab/messages/collab-cursor-hide"
        }
      ],
      "x-socket-event": "collab:cursor-hide"
    },
    "send-collab-path-start": {
      "action": "send",
      "channel": {
        "$ref": "#/channels/collab"
      },
      "title": "Emit collab:path-start",
      "summary": "Pen drawing started.",
      "description": "Client -> server -> all other sockets in the same /chat/{chatId} namespace. The server spreads the client payload and appends the authenticated user identity (userId, displayName, color, avatarUrl), the annotationColor assigned on collab:join and a timestamp; client supplied values for those keys are overwritten.",
      "messages": [
        {
          "$ref": "#/channels/collab/messages/collab-path-start"
        }
      ],
      "x-socket-event": "collab:path-start"
    },
    "receive-collab-path-start": {
      "action": "receive",
      "channel": {
        "$ref": "#/channels/collab"
      },
      "title": "Receive collab:path-start",
      "summary": "Pen drawing started.",
      "description": "Client -> server -> all other sockets in the same /chat/{chatId} namespace. The server spreads the client payload and appends the authenticated user identity (userId, displayName, color, avatarUrl), the annotationColor assigned on collab:join and a timestamp; client supplied values for those keys are overwritten.",
      "messages": [
        {
          "$ref": "#/channels/collab/messages/collab-path-start"
        }
      ],
      "x-socket-event": "collab:path-start"
    },
    "send-collab-path-update": {
      "action": "send",
      "channel": {
        "$ref": "#/channels/collab"
      },
      "title": "Emit collab:path-update",
      "summary": "Pen drawing continued with additional points.",
      "description": "Client -> server -> all other sockets in the same /chat/{chatId} namespace. The server spreads the client payload and appends the authenticated user identity (userId, displayName, color, avatarUrl), the annotationColor assigned on collab:join and a timestamp; client supplied values for those keys are overwritten.",
      "messages": [
        {
          "$ref": "#/channels/collab/messages/collab-path-update"
        }
      ],
      "x-socket-event": "collab:path-update"
    },
    "receive-collab-path-update": {
      "action": "receive",
      "channel": {
        "$ref": "#/channels/collab"
      },
      "title": "Receive collab:path-update",
      "summary": "Pen drawing continued with additional points.",
      "description": "Client -> server -> all other sockets in the same /chat/{chatId} namespace. The server spreads the client payload and appends the authenticated user identity (userId, displayName, color, avatarUrl), the annotationColor assigned on collab:join and a timestamp; client supplied values for those keys are overwritten.",
      "messages": [
        {
          "$ref": "#/channels/collab/messages/collab-path-update"
        }
      ],
      "x-socket-event": "collab:path-update"
    },
    "send-collab-path-end": {
      "action": "send",
      "channel": {
        "$ref": "#/channels/collab"
      },
      "title": "Emit collab:path-end",
      "summary": "Pen drawing completed.",
      "description": "Client -> server -> all other sockets in the same /chat/{chatId} namespace. The server spreads the client payload and appends the authenticated user identity (userId, displayName, color, avatarUrl), the annotationColor assigned on collab:join and a timestamp; client supplied values for those keys are overwritten.",
      "messages": [
        {
          "$ref": "#/channels/collab/messages/collab-path-end"
        }
      ],
      "x-socket-event": "collab:path-end"
    },
    "receive-collab-path-end": {
      "action": "receive",
      "channel": {
        "$ref": "#/channels/collab"
      },
      "title": "Receive collab:path-end",
      "summary": "Pen drawing completed.",
      "description": "Client -> server -> all other sockets in the same /chat/{chatId} namespace. The server spreads the client payload and appends the authenticated user identity (userId, displayName, color, avatarUrl), the annotationColor assigned on collab:join and a timestamp; client supplied values for those keys are overwritten.",
      "messages": [
        {
          "$ref": "#/channels/collab/messages/collab-path-end"
        }
      ],
      "x-socket-event": "collab:path-end"
    },
    "send-collab-path-clear": {
      "action": "send",
      "channel": {
        "$ref": "#/channels/collab"
      },
      "title": "Emit collab:path-clear",
      "summary": "Drawn path(s) cleared. With pathId only that path is cleared, otherwise all paths of the user.",
      "description": "Client -> server -> all other sockets in the same /chat/{chatId} namespace. The server spreads the client payload and appends the authenticated user identity (userId, displayName, color, avatarUrl), the annotationColor assigned on collab:join and a timestamp; client supplied values for those keys are overwritten.",
      "messages": [
        {
          "$ref": "#/channels/collab/messages/collab-path-clear"
        }
      ],
      "x-socket-event": "collab:path-clear"
    },
    "receive-collab-path-clear": {
      "action": "receive",
      "channel": {
        "$ref": "#/channels/collab"
      },
      "title": "Receive collab:path-clear",
      "summary": "Drawn path(s) cleared. With pathId only that path is cleared, otherwise all paths of the user.",
      "description": "Client -> server -> all other sockets in the same /chat/{chatId} namespace. The server spreads the client payload and appends the authenticated user identity (userId, displayName, color, avatarUrl), the annotationColor assigned on collab:join and a timestamp; client supplied values for those keys are overwritten.",
      "messages": [
        {
          "$ref": "#/channels/collab/messages/collab-path-clear"
        }
      ],
      "x-socket-event": "collab:path-clear"
    },
    "send-collab-click": {
      "action": "send",
      "channel": {
        "$ref": "#/channels/collab"
      },
      "title": "Emit collab:click",
      "summary": "Click ripple at percentage coordinates.",
      "description": "Client -> server -> all other sockets in the same /chat/{chatId} namespace. The server spreads the client payload and appends the authenticated user identity (userId, displayName, color, avatarUrl), the annotationColor assigned on collab:join and a timestamp; client supplied values for those keys are overwritten.",
      "messages": [
        {
          "$ref": "#/channels/collab/messages/collab-click"
        }
      ],
      "x-socket-event": "collab:click"
    },
    "receive-collab-click": {
      "action": "receive",
      "channel": {
        "$ref": "#/channels/collab"
      },
      "title": "Receive collab:click",
      "summary": "Click ripple at percentage coordinates.",
      "description": "Client -> server -> all other sockets in the same /chat/{chatId} namespace. The server spreads the client payload and appends the authenticated user identity (userId, displayName, color, avatarUrl), the annotationColor assigned on collab:join and a timestamp; client supplied values for those keys are overwritten.",
      "messages": [
        {
          "$ref": "#/channels/collab/messages/collab-click"
        }
      ],
      "x-socket-event": "collab:click"
    },
    "send-collab-color-change": {
      "action": "send",
      "channel": {
        "$ref": "#/channels/collab"
      },
      "title": "Emit collab:color-change",
      "summary": "User changed their annotation colour. The server stores the new colour on the socket, so subsequent relayed events carry it.",
      "description": "Client -> server -> all other sockets in the same /chat/{chatId} namespace. The server spreads the client payload and appends the authenticated user identity (userId, displayName, color, avatarUrl), the annotationColor assigned on collab:join and a timestamp; client supplied values for those keys are overwritten.",
      "messages": [
        {
          "$ref": "#/channels/collab/messages/collab-color-change"
        }
      ],
      "x-socket-event": "collab:color-change"
    },
    "receive-collab-color-change": {
      "action": "receive",
      "channel": {
        "$ref": "#/channels/collab"
      },
      "title": "Receive collab:color-change",
      "summary": "User changed their annotation colour. The server stores the new colour on the socket, so subsequent relayed events carry it.",
      "description": "Client -> server -> all other sockets in the same /chat/{chatId} namespace. The server spreads the client payload and appends the authenticated user identity (userId, displayName, color, avatarUrl), the annotationColor assigned on collab:join and a timestamp; client supplied values for those keys are overwritten.",
      "messages": [
        {
          "$ref": "#/channels/collab/messages/collab-color-change"
        }
      ],
      "x-socket-event": "collab:color-change"
    },
    "send-collab-region-create": {
      "action": "send",
      "channel": {
        "$ref": "#/channels/collab"
      },
      "title": "Emit collab:region-create",
      "summary": "Audio/video region created on the waveform/timeline.",
      "description": "Client -> server -> all other sockets in the same /chat/{chatId} namespace. The server spreads the client payload and appends the authenticated user identity (userId, displayName, color, avatarUrl), the annotationColor assigned on collab:join and a timestamp; client supplied values for those keys are overwritten.",
      "messages": [
        {
          "$ref": "#/channels/collab/messages/collab-region-create"
        }
      ],
      "x-socket-event": "collab:region-create"
    },
    "receive-collab-region-create": {
      "action": "receive",
      "channel": {
        "$ref": "#/channels/collab"
      },
      "title": "Receive collab:region-create",
      "summary": "Audio/video region created on the waveform/timeline.",
      "description": "Client -> server -> all other sockets in the same /chat/{chatId} namespace. The server spreads the client payload and appends the authenticated user identity (userId, displayName, color, avatarUrl), the annotationColor assigned on collab:join and a timestamp; client supplied values for those keys are overwritten.",
      "messages": [
        {
          "$ref": "#/channels/collab/messages/collab-region-create"
        }
      ],
      "x-socket-event": "collab:region-create"
    },
    "send-collab-region-remove": {
      "action": "send",
      "channel": {
        "$ref": "#/channels/collab"
      },
      "title": "Emit collab:region-remove",
      "summary": "Region removed.",
      "description": "Client -> server -> all other sockets in the same /chat/{chatId} namespace. The server spreads the client payload and appends the authenticated user identity (userId, displayName, color, avatarUrl), the annotationColor assigned on collab:join and a timestamp; client supplied values for those keys are overwritten.",
      "messages": [
        {
          "$ref": "#/channels/collab/messages/collab-region-remove"
        }
      ],
      "x-socket-event": "collab:region-remove"
    },
    "receive-collab-region-remove": {
      "action": "receive",
      "channel": {
        "$ref": "#/channels/collab"
      },
      "title": "Receive collab:region-remove",
      "summary": "Region removed.",
      "description": "Client -> server -> all other sockets in the same /chat/{chatId} namespace. The server spreads the client payload and appends the authenticated user identity (userId, displayName, color, avatarUrl), the annotationColor assigned on collab:join and a timestamp; client supplied values for those keys are overwritten.",
      "messages": [
        {
          "$ref": "#/channels/collab/messages/collab-region-remove"
        }
      ],
      "x-socket-event": "collab:region-remove"
    },
    "send-collab-zoom-sync": {
      "action": "send",
      "channel": {
        "$ref": "#/channels/collab"
      },
      "title": "Emit collab:zoom-sync",
      "summary": "Zoom level broadcast (followers of the presenter apply it).",
      "description": "Client -> server -> all other sockets in the same /chat/{chatId} namespace. The server spreads the client payload and appends the authenticated user identity (userId, displayName, color, avatarUrl), the annotationColor assigned on collab:join and a timestamp; client supplied values for those keys are overwritten.",
      "messages": [
        {
          "$ref": "#/channels/collab/messages/collab-zoom-sync"
        }
      ],
      "x-socket-event": "collab:zoom-sync"
    },
    "receive-collab-zoom-sync": {
      "action": "receive",
      "channel": {
        "$ref": "#/channels/collab"
      },
      "title": "Receive collab:zoom-sync",
      "summary": "Zoom level broadcast (followers of the presenter apply it).",
      "description": "Client -> server -> all other sockets in the same /chat/{chatId} namespace. The server spreads the client payload and appends the authenticated user identity (userId, displayName, color, avatarUrl), the annotationColor assigned on collab:join and a timestamp; client supplied values for those keys are overwritten.",
      "messages": [
        {
          "$ref": "#/channels/collab/messages/collab-zoom-sync"
        }
      ],
      "x-socket-event": "collab:zoom-sync"
    },
    "send-collab-playback-sync": {
      "action": "send",
      "channel": {
        "$ref": "#/channels/collab"
      },
      "title": "Emit collab:playback-sync",
      "summary": "Play/pause/seek state broadcast by the presenter to the other members.",
      "description": "Only the current presenter socket may broadcast; other senders receive collab:playback-sync:rejected instead and nothing is relayed. Client -> server -> all other sockets in the same /chat/{chatId} namespace. The server spreads the client payload and appends the authenticated user identity (userId, displayName, color, avatarUrl), the annotationColor assigned on collab:join and a timestamp; client supplied values for those keys are overwritten. The server also stores currentTime/playing as the namespace playback state.",
      "messages": [
        {
          "$ref": "#/channels/collab/messages/collab-playback-sync"
        }
      ],
      "x-socket-event": "collab:playback-sync"
    },
    "receive-collab-playback-sync": {
      "action": "receive",
      "channel": {
        "$ref": "#/channels/collab"
      },
      "title": "Receive collab:playback-sync",
      "summary": "Play/pause/seek state broadcast by the presenter to the other members.",
      "description": "Only the current presenter socket may broadcast; other senders receive collab:playback-sync:rejected instead and nothing is relayed. Client -> server -> all other sockets in the same /chat/{chatId} namespace. The server spreads the client payload and appends the authenticated user identity (userId, displayName, color, avatarUrl), the annotationColor assigned on collab:join and a timestamp; client supplied values for those keys are overwritten. The server also stores currentTime/playing as the namespace playback state.",
      "messages": [
        {
          "$ref": "#/channels/collab/messages/collab-playback-sync"
        }
      ],
      "x-socket-event": "collab:playback-sync"
    },
    "receive-collab-playback-sync-rejected": {
      "action": "receive",
      "channel": {
        "$ref": "#/channels/collab"
      },
      "title": "Receive collab:playback-sync:rejected",
      "summary": "Server -> sender only: the sender is not the presenter, so its collab:playback-sync was dropped. Carries the real presenter and playback position so the client can snap back to follower mode.",
      "description": "Emitted only to the rejected sender.",
      "messages": [
        {
          "$ref": "#/channels/collab/messages/collab-playback-sync-rejected"
        }
      ],
      "x-socket-event": "collab:playback-sync:rejected"
    },
    "receive-collab-presenter-assign": {
      "action": "receive",
      "channel": {
        "$ref": "#/channels/collab"
      },
      "title": "Receive collab:presenter-assign",
      "summary": "Server -> all sockets in the namespace: a new presenter was assigned.",
      "description": "Emitted when the first member joins (first-join), when an admin takes over or a presenter/admin reassigns via collab:presenter-takeover (admin-takeover), and when the presenter disconnects and control transfers to an admin or the earliest joined member (transfer-on-leave).",
      "messages": [
        {
          "$ref": "#/channels/collab/messages/collab-presenter-assign"
        }
      ],
      "x-socket-event": "collab:presenter-assign"
    },
    "receive-collab-presenter-state": {
      "action": "receive",
      "channel": {
        "$ref": "#/channels/collab"
      },
      "title": "Receive collab:presenter-state",
      "summary": "Server -> joining socket: current presenter and playback state when a presenter already exists.",
      "description": "Sent instead of collab:presenter-assign to a socket that joins a namespace that already has a presenter.",
      "messages": [
        {
          "$ref": "#/channels/collab/messages/collab-presenter-state"
        }
      ],
      "x-socket-event": "collab:presenter-state"
    },
    "send-collab-presenter-request": {
      "action": "send",
      "channel": {
        "$ref": "#/channels/collab"
      },
      "title": "Emit collab:presenter-request",
      "summary": "Request for presenter control. From an admin it is granted immediately (collab:presenter-assign, reason admin-takeover); from a non-admin it is relayed to the current presenter socket only.",
      "description": "Client emits collab:presenter-request (any data). Client -> server -> the current presenter socket only. The server spreads the client payload and appends the authenticated user identity (userId, displayName, color, avatarUrl), the annotationColor assigned on collab:join and a timestamp; client supplied values for those keys are overwritten. requesterId / requesterDisplayName duplicate userId / displayName.",
      "messages": [
        {
          "$ref": "#/channels/collab/messages/collab-presenter-request"
        }
      ],
      "x-socket-event": "collab:presenter-request"
    },
    "receive-collab-presenter-request": {
      "action": "receive",
      "channel": {
        "$ref": "#/channels/collab"
      },
      "title": "Receive collab:presenter-request",
      "summary": "Request for presenter control. From an admin it is granted immediately (collab:presenter-assign, reason admin-takeover); from a non-admin it is relayed to the current presenter socket only.",
      "description": "Client emits collab:presenter-request (any data). Client -> server -> the current presenter socket only. The server spreads the client payload and appends the authenticated user identity (userId, displayName, color, avatarUrl), the annotationColor assigned on collab:join and a timestamp; client supplied values for those keys are overwritten. requesterId / requesterDisplayName duplicate userId / displayName.",
      "messages": [
        {
          "$ref": "#/channels/collab/messages/collab-presenter-request"
        }
      ],
      "x-socket-event": "collab:presenter-request"
    },
    "send-collab-presenter-takeover": {
      "action": "send",
      "channel": {
        "$ref": "#/channels/collab"
      },
      "title": "Emit collab:presenter-takeover",
      "summary": "Client -> server only: an admin or the current presenter hands presenter control to a target user. Results in a collab:presenter-assign (reason admin-takeover) to everyone; nothing is relayed under this name.",
      "description": "Client payload: { targetUserId: string, targetDisplayName: string }. Ignored when the sender is neither an admin (workspaceOwner/workspaceAdmin/projectOwner/projectAdmin) nor the current presenter, or when targetUserId is missing.",
      "messages": [
        {
          "$ref": "#/channels/collab/messages/collab-presenter-takeover"
        }
      ],
      "x-socket-event": "collab:presenter-takeover"
    },
    "send-collab-state-request": {
      "action": "send",
      "channel": {
        "$ref": "#/channels/collab"
      },
      "title": "Emit collab:state-request",
      "summary": "Server -> the earliest joined other member: asks it to send its current annotation state to a late joiner (collab:state-response).",
      "description": "Emitted automatically when a socket joins a namespace with existing members, and again when a client retries by emitting collab:state-request itself.",
      "messages": [
        {
          "$ref": "#/channels/collab/messages/collab-state-request"
        }
      ],
      "x-socket-event": "collab:state-request"
    },
    "receive-collab-state-request": {
      "action": "receive",
      "channel": {
        "$ref": "#/channels/collab"
      },
      "title": "Receive collab:state-request",
      "summary": "Server -> the earliest joined other member: asks it to send its current annotation state to a late joiner (collab:state-response).",
      "description": "Emitted automatically when a socket joins a namespace with existing members, and again when a client retries by emitting collab:state-request itself.",
      "messages": [
        {
          "$ref": "#/channels/collab/messages/collab-state-request"
        }
      ],
      "x-socket-event": "collab:state-request"
    },
    "send-collab-state-response": {
      "action": "send",
      "channel": {
        "$ref": "#/channels/collab"
      },
      "title": "Emit collab:state-response",
      "summary": "Server -> the requesting socket only: sanitised snapshot of paths, regions and zoom provided by an existing member.",
      "description": "Client emits collab:state-response with { requesterSocketId, paths, regions, zoom }; the server validates/truncates (max 200 paths and 200 regions, string length limits) and forwards it only to requesterSocketId.",
      "messages": [
        {
          "$ref": "#/channels/collab/messages/collab-state-response"
        }
      ],
      "x-socket-event": "collab:state-response"
    },
    "receive-collab-state-response": {
      "action": "receive",
      "channel": {
        "$ref": "#/channels/collab"
      },
      "title": "Receive collab:state-response",
      "summary": "Server -> the requesting socket only: sanitised snapshot of paths, regions and zoom provided by an existing member.",
      "description": "Client emits collab:state-response with { requesterSocketId, paths, regions, zoom }; the server validates/truncates (max 200 paths and 200 regions, string length limits) and forwards it only to requesterSocketId.",
      "messages": [
        {
          "$ref": "#/channels/collab/messages/collab-state-response"
        }
      ],
      "x-socket-event": "collab:state-response"
    },
    "receive-collab-members": {
      "action": "receive",
      "channel": {
        "$ref": "#/channels/collab"
      },
      "title": "Receive collab:members",
      "summary": "Server -> joining socket: the members already present in the namespace.",
      "description": "Sent right after collab:join when at least one other authenticated member is connected.",
      "messages": [
        {
          "$ref": "#/channels/collab/messages/collab-members"
        }
      ],
      "x-socket-event": "collab:members"
    },
    "receive-collab-self-color": {
      "action": "receive",
      "channel": {
        "$ref": "#/channels/collab"
      },
      "title": "Receive collab:self-color",
      "summary": "Server -> joining socket: the annotation colour assigned to it for this session.",
      "description": "The preferred colour is kept when it is not the default (#FF0000); otherwise the first unused palette colour is assigned.",
      "messages": [
        {
          "$ref": "#/channels/collab/messages/collab-self-color"
        }
      ],
      "x-socket-event": "collab:self-color"
    }
  },
  "components": {
    "messages": {
      "test": {
        "name": "test",
        "title": "test",
        "summary": "Event used for testing websocket connections.",
        "description": "Event used for testing websocket connections.\n\nTest event payload. Changes key structure will depend on test scenario.\n\nDelivered as the `notification` socket event with `type` set to `test`.",
        "payload": {
          "description": "Event used for testing websocket connections.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "testData": {
                      "type": "string",
                      "description": "Arbitrary data sent for testing."
                    }
                  },
                  "required": [
                    "testData"
                  ]
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "testData"
        ]
      },
      "notificationUpdate": {
        "name": "notificationUpdate",
        "title": "notificationUpdate",
        "summary": "Indicates that a previously delivered, grouped notification has been updated (assetGroupUploadComplete or projectGroupItemPublish).",
        "description": "Fired when a grouped notification accumulates another item within its grouping window. The full updated notification is in tokens.updatedNotification; the changes object is not populated for this event.\n\nPayload for the notificationUpdate event.\n\nDelivered as the `notification` socket event with `type` set to `notificationUpdate`.",
        "payload": {
          "description": "Fired when a grouped notification accumulates another item within its grouping window. The full updated notification is in tokens.updatedNotification; the changes object is not populated for this event.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "notificationId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "ID of the notification that was updated."
                    },
                    "originalNotification": {
                      "type": "object",
                      "description": "The notification object before the update."
                    },
                    "updatedNotification": {
                      "type": "object",
                      "description": "The notification object after the update (tokens.assets / tokens.items and changes.update extended)."
                    }
                  },
                  "required": [
                    "notificationId",
                    "originalNotification",
                    "updatedNotification"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "description": "Not populated for this event (the notification is created without a changes object)."
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "notificationId",
          "originalNotification",
          "updatedNotification"
        ]
      },
      "workspaceCreate": {
        "name": "workspaceCreate",
        "title": "workspaceCreate",
        "summary": "Fired when a new workspace is created.",
        "description": "Fired when a new workspace is created.\n\nPayload for the workspace create event. Includes new workspace object in changes.create array.\n\nDelivered as the `notification` socket event with `type` set to `workspaceCreate`.\n\nToken keys marked with (*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations.",
        "payload": {
          "description": "Fired when a new workspace is created.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "(*)newWorkspace": {
                      "type": "object",
                      "description": "Deprecated. Use resource from changes.create."
                    }
                  },
                  "required": [
                    "newWorkspace"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "create": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "value": "workspace"
                          },
                          "resource": {
                            "type": "object",
                            "description": "New workspace object."
                          }
                        }
                      }
                    }
                  },
                  "required": [
                    "create"
                  ]
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "newWorkspace"
        ]
      },
      "workspaceUpdate": {
        "name": "workspaceUpdate",
        "title": "workspaceUpdate",
        "summary": "Fired when a workspace name is changed.",
        "description": "Fired when a workspace name is changed.\n\nPayload for the workspace name change event.\n\nDelivered as the `notification` socket event with `type` set to `workspaceUpdate`.\n\nToken keys marked with (*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations.",
        "payload": {
          "description": "Fired when a workspace name is changed.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "(*)requesterId": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "(*)requester": {
                      "type": "object"
                    },
                    "(*)workspaceId": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "oldWorkspaceName": {
                      "type": "string"
                    },
                    "newWorkspaceName": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "requesterId",
                    "requester",
                    "workspaceId",
                    "oldWorkspaceName",
                    "newWorkspaceName"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "update": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "value": "workspace"
                          },
                          "resource": {
                            "type": "object",
                            "description": "Updated workspace object."
                          }
                        }
                      }
                    }
                  },
                  "required": [
                    "update"
                  ]
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "requesterId",
          "requester",
          "workspaceId",
          "oldWorkspaceName",
          "newWorkspaceName"
        ]
      },
      "workspaceDelete": {
        "name": "workspaceDelete",
        "title": "workspaceDelete",
        "summary": "Fired when a workspace is marked for deletion.",
        "description": "Fired when a workspace is marked for deletion.\n\nPayload for the workspace delete event.\n\nDelivered as the `notification` socket event with `type` set to `workspaceDelete`.\n\nToken keys marked with (*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations.",
        "payload": {
          "description": "Fired when a workspace is marked for deletion.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "(*)requesterId": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "(*)requester": {
                      "type": "object"
                    },
                    "(*)workspaceId": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "workspaceName": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "requesterId",
                    "requester",
                    "workspaceId",
                    "workspaceName"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "delete": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "value": "workspace"
                          }
                        }
                      }
                    }
                  },
                  "required": [
                    "delete"
                  ]
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "requesterId",
          "requester",
          "workspaceId",
          "workspaceName"
        ]
      },
      "workspaceLogoUpdate": {
        "name": "workspaceLogoUpdate",
        "title": "workspaceLogoUpdate",
        "summary": "CURRENTLY UNUSED IN FAVOR OF logoUpdate event. Fired when a workspace logo is updated.",
        "description": "Fired when a workspace logo is updated.\n\nPayload for the workspace logo update event.\n\nDelivered as the `notification` socket event with `type` set to `workspaceLogoUpdate`.\n\nToken keys marked with (*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations.",
        "payload": {
          "description": "Fired when a workspace logo is updated.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "(*)asset": {
                      "type": "object",
                      "description": "Deprecated. Use resource from changes.update where resourceType is 'asset'."
                    }
                  },
                  "required": [
                    "asset"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "update": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "value": "asset"
                          },
                          "resource": {
                            "type": "object"
                          }
                        }
                      }
                    }
                  },
                  "required": [
                    "update"
                  ]
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "asset"
        ]
      },
      "projectCreate": {
        "name": "projectCreate",
        "title": "projectCreate",
        "summary": "Fired when a new project is created.",
        "description": "Fired when a new project is created.\n\nPayload for the project create event.\n\nDelivered as the `notification` socket event with `type` set to `projectCreate`.\n\nToken keys marked with (*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations.",
        "payload": {
          "description": "Fired when a new project is created.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "(*)requesterId": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "(*)requester": {
                      "type": "object"
                    },
                    "(*)projectId": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "(*)projectName": {
                      "type": "string"
                    },
                    "(*)workspaceId": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "(*)membership": {
                      "type": "object",
                      "description": "The initial membership object for the creator."
                    }
                  },
                  "required": [
                    "requesterId",
                    "requester",
                    "projectId",
                    "projectName",
                    "workspaceId",
                    "membership"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "create": {
                      "type": "array",
                      "items": {
                        "oneOf": [
                          {
                            "type": "object",
                            "properties": {
                              "resourceId": {
                                "type": "string",
                                "format": "uuid"
                              },
                              "resourceType": {
                                "type": "string",
                                "value": "project"
                              },
                              "resource": {
                                "type": "object",
                                "description": "New project object."
                              }
                            }
                          },
                          {
                            "type": "object",
                            "properties": {
                              "resourceId": {
                                "type": "string",
                                "format": "uuid"
                              },
                              "resourceType": {
                                "type": "string",
                                "value": "membership"
                              },
                              "resource": {
                                "type": "object",
                                "description": "New membership object."
                              }
                            }
                          }
                        ]
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "requesterId",
          "requester",
          "projectId",
          "projectName",
          "workspaceId",
          "membership"
        ]
      },
      "projectUpdate": {
        "name": "projectUpdate",
        "title": "projectUpdate",
        "summary": "Fired when a project name is changed.",
        "description": "Fired when a project name is changed.\n\nPayload for the project name change event.\n\nDelivered as the `notification` socket event with `type` set to `projectUpdate`.\n\nToken keys marked with (*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations.",
        "payload": {
          "description": "Fired when a project name is changed.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "(*)requesterId": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "(*)requester": {
                      "type": "object"
                    },
                    "(*)projectId": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "oldProjectName": {
                      "type": "string"
                    },
                    "newProjectName": {
                      "type": "string"
                    },
                    "(*)workspaceId": {
                      "type": "string",
                      "format": "uuid"
                    }
                  },
                  "required": [
                    "requesterId",
                    "requester",
                    "projectId",
                    "oldProjectName",
                    "newProjectName",
                    "workspaceId"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "update": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "value": "project"
                          },
                          "resource": {
                            "type": "object",
                            "description": "Updated project object."
                          },
                          "oldResource": {
                            "type": "object",
                            "description": "The project before the update."
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "requesterId",
          "requester",
          "projectId",
          "oldProjectName",
          "newProjectName",
          "workspaceId"
        ]
      },
      "projectDelete": {
        "name": "projectDelete",
        "title": "projectDelete",
        "summary": "Fired when a project is marked for deletion.",
        "description": "Fired when a project is marked for deletion.\n\nPayload for the project delete event.\n\nDelivered as the `notification` socket event with `type` set to `projectDelete`.\n\nToken keys marked with (*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations.",
        "payload": {
          "description": "Fired when a project is marked for deletion.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "(*)requesterId": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "(*)requester": {
                      "type": "object"
                    },
                    "(*)projectId": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "projectName": {
                      "type": "string"
                    },
                    "(*)workspaceId": {
                      "type": "string",
                      "format": "uuid"
                    }
                  },
                  "required": [
                    "requesterId",
                    "requester",
                    "projectId",
                    "projectName",
                    "workspaceId"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "delete": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "value": "project"
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "requesterId",
          "requester",
          "projectId",
          "projectName",
          "workspaceId"
        ]
      },
      "projectLogoUpdate": {
        "name": "projectLogoUpdate",
        "title": "projectLogoUpdate",
        "summary": "CURRENTLY UNUSED IN FAVOR OF logoUpdate event. Fired when a project logo is updated. Updates the project and returns the new asset object for the logo. Note that the logo will not be 'active' until the actual file is uploaded. So you will need to watch for updates to this asset before replacing the logo locally.",
        "description": "Fired when a project logo is updated. No code path currently emits this event; see logoUpdate.\n\nPayload for the projectLogoUpdate event.\n\nDelivered as the `notification` socket event with `type` set to `projectLogoUpdate`.\n\nToken keys marked with (*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations.",
        "payload": {
          "description": "Fired when a project logo is updated. No code path currently emits this event; see logoUpdate.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "(*)asset": {
                      "type": "object",
                      "description": "Deprecated. Use resource from changes.update where resourceType is 'asset'."
                    }
                  },
                  "required": [
                    "asset"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "create": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "enum": [
                              "asset"
                            ]
                          },
                          "resource": {
                            "type": "object",
                            "description": "The new logo asset."
                          }
                        }
                      }
                    },
                    "update": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "enum": [
                              "project"
                            ]
                          },
                          "resource": {
                            "type": "object",
                            "description": "The updated project."
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "asset"
        ]
      },
      "projectAssetsPublish": {
        "name": "projectAssetsPublish",
        "title": "projectAssetsPublish",
        "summary": "CURRENTLY UNUSED (the event type is still registered but nothing emits it). Fired when assets within a project are published.",
        "description": "Fired when assets within a project are published.\n\nPayload for the project assets publish event.\n\nDelivered as the `notification` socket event with `type` set to `projectAssetsPublish`.\n\nToken keys marked with (*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations.",
        "payload": {
          "description": "Fired when assets within a project are published.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "(*)requesterId": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "(*)requester": {
                      "type": "object"
                    },
                    "(*)assets": {
                      "type": "array",
                      "items": {
                        "type": "object"
                      },
                      "description": "Deprecated. Use resources from changes.update."
                    }
                  },
                  "required": [
                    "requesterId",
                    "requester",
                    "assets"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "update": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "value": "asset"
                          },
                          "resource": {
                            "type": "object"
                          }
                        }
                      }
                    }
                  },
                  "required": [
                    "update"
                  ]
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "requesterId",
          "requester",
          "assets"
        ]
      },
      "projectAssetsUnpublish": {
        "name": "projectAssetsUnpublish",
        "title": "projectAssetsUnpublish",
        "summary": "CURRENTLY UNUSED (the event type is still registered but nothing emits it). Fired when assets within a project are unpublished.",
        "description": "Fired when assets within a project are unpublished.\n\nPayload for the project assets unpublish event.\n\nDelivered as the `notification` socket event with `type` set to `projectAssetsUnpublish`.\n\nToken keys marked with (*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations.",
        "payload": {
          "description": "Fired when assets within a project are unpublished.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "(*)requesterId": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "(*)requester": {
                      "type": "object"
                    },
                    "(*)assets": {
                      "type": "array",
                      "items": {
                        "type": "object"
                      },
                      "description": "Deprecated. Use resources from changes.update."
                    }
                  },
                  "required": [
                    "requesterId",
                    "requester",
                    "assets"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "update": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "value": "asset"
                          },
                          "resource": {
                            "type": "object"
                          }
                        }
                      }
                    }
                  },
                  "required": [
                    "update"
                  ]
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "requesterId",
          "requester",
          "assets"
        ]
      },
      "assetNameChange": {
        "name": "assetNameChange",
        "title": "assetNameChange",
        "summary": "Fired when an asset's name is changed.",
        "description": "Fired when an asset's name is changed.\n\nPayload for the asset name change event.\n\nDelivered as the `notification` socket event with `type` set to `assetNameChange`.\n\nToken keys marked with (*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations.",
        "payload": {
          "description": "Fired when an asset's name is changed.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "(*)requesterId": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "(*)requester": {
                      "type": "object"
                    },
                    "(*)assetId": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "(*)ownerResourceType": {
                      "type": "string"
                    },
                    "(*)ownerResourceId": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "(*)visibility": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    },
                    "oldName": {
                      "type": "string"
                    },
                    "newName": {
                      "type": "string"
                    },
                    "(*)asset": {
                      "type": "object",
                      "description": "The updated asset object."
                    }
                  },
                  "required": [
                    "requesterId",
                    "requester",
                    "assetId",
                    "ownerResourceType",
                    "ownerResourceId",
                    "visibility",
                    "oldName",
                    "newName",
                    "asset"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "update": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "value": "asset"
                          },
                          "resource": {
                            "type": "object"
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "requesterId",
          "requester",
          "assetId",
          "ownerResourceType",
          "ownerResourceId",
          "visibility",
          "oldName",
          "newName",
          "asset"
        ]
      },
      "assetPublish": {
        "name": "assetPublish",
        "title": "assetPublish",
        "summary": "Fired for each individual asset published through the project publish flow (accompanies fileSystemPublish / projectItemsPublish).",
        "description": "Emitted per published asset on the asset's own channel (asset/{assetId}) plus the project channels. Folders published in the same operation emit folderPublish.\n\nPayload for the assetPublish event.\n\nDelivered as the `notification` socket event with `type` set to `assetPublish`.",
        "payload": {
          "description": "Emitted per published asset on the asset's own channel (asset/{assetId}) plus the project channels. Folders published in the same operation emit folderPublish.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "name": {
                      "type": "string",
                      "description": "Name of the published asset."
                    }
                  },
                  "required": [
                    "name"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "update": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "enum": [
                              "asset"
                            ]
                          },
                          "resource": {
                            "type": "object",
                            "description": "The published asset object."
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "name"
        ]
      },
      "assetUnpublish": {
        "name": "assetUnpublish",
        "title": "assetUnpublish",
        "summary": "Fired for each individual asset unpublished through the project unpublish flow (accompanies fileSystemUnpublish / projectItemsUnpublish).",
        "description": "Emitted per unpublished asset on the asset's own channel (asset/{assetId}) plus the project channels.\n\nPayload for the assetUnpublish event.\n\nDelivered as the `notification` socket event with `type` set to `assetUnpublish`.",
        "payload": {
          "description": "Emitted per unpublished asset on the asset's own channel (asset/{assetId}) plus the project channels.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "name": {
                      "type": "string",
                      "description": "Name of the unpublished asset."
                    }
                  },
                  "required": [
                    "name"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "update": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "enum": [
                              "asset"
                            ]
                          },
                          "resource": {
                            "type": "object",
                            "description": "The unpublished asset object."
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "name"
        ]
      },
      "assetTag": {
        "name": "assetTag",
        "title": "assetTag",
        "summary": "Fired when a tag is added to an asset.",
        "description": "Fired when a tag is added to an asset.\n\nPayload for the assetTag event.\n\nDelivered as the `notification` socket event with `type` set to `assetTag`.",
        "payload": {
          "description": "Fired when a tag is added to an asset.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "name": {
                      "type": "string",
                      "description": "Asset name."
                    },
                    "tagName": {
                      "type": "string",
                      "description": "Name of the tag that was added."
                    }
                  },
                  "required": [
                    "name",
                    "tagName"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "description": "Not populated for this event (the notification is created without a changes object)."
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "name",
          "tagName"
        ]
      },
      "assetUntag": {
        "name": "assetUntag",
        "title": "assetUntag",
        "summary": "Fired when a tag is removed from an asset.",
        "description": "Fired when a tag is removed from an asset.\n\nPayload for the assetUntag event.\n\nDelivered as the `notification` socket event with `type` set to `assetUntag`.",
        "payload": {
          "description": "Fired when a tag is removed from an asset.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "name": {
                      "type": "string",
                      "description": "Asset name."
                    },
                    "tagName": {
                      "type": "string",
                      "description": "Name of the tag that was removed."
                    }
                  },
                  "required": [
                    "name",
                    "tagName"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "description": "Not populated for this event (the notification is created without a changes object)."
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "name",
          "tagName"
        ]
      },
      "assetDelete": {
        "name": "assetDelete",
        "title": "assetDelete",
        "summary": "Fired when an asset is deleted.",
        "description": "Fired when an asset is deleted.\n\nPayload for the asset delete event.\n\nDelivered as the `notification` socket event with `type` set to `assetDelete`.\n\nToken keys marked with (*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations.",
        "payload": {
          "description": "Fired when an asset is deleted.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "(*)requesterId": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "(*)requester": {
                      "type": "object"
                    },
                    "(*)assetId": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "(*)name": {
                      "type": "string"
                    },
                    "(*)ownerResourceType": {
                      "type": "string"
                    },
                    "(*)ownerResourceId": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "(*)visibility": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    }
                  },
                  "required": [
                    "requesterId",
                    "requester",
                    "assetId",
                    "name",
                    "ownerResourceType",
                    "ownerResourceId",
                    "visibility"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "delete": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "value": "asset"
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "requesterId",
          "requester",
          "assetId",
          "name",
          "ownerResourceType",
          "ownerResourceId",
          "visibility"
        ]
      },
      "assetStatusUpdate": {
        "name": "assetStatusUpdate",
        "title": "assetStatusUpdate",
        "summary": "Fired when an asset's status changes (e.g., during processing).",
        "description": "Fired when an asset's status changes (e.g., during processing).\n\nPayload for the asset status update event.\n\nDelivered as the `notification` socket event with `type` set to `assetStatusUpdate`.\n\nToken keys marked with (*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations.",
        "payload": {
          "description": "Fired when an asset's status changes (e.g., during processing).",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "(*)assetId": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "name": {
                      "type": "string"
                    },
                    "oldStatus": {
                      "type": "string"
                    },
                    "newStatus": {
                      "type": "string"
                    },
                    "(*)updatedAsset": {
                      "type": "object",
                      "description": "The asset object with the updated status."
                    }
                  },
                  "required": [
                    "assetId",
                    "name",
                    "oldStatus",
                    "newStatus",
                    "updatedAsset"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "update": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "value": "asset"
                          },
                          "resource": {
                            "type": "object"
                          }
                        }
                      }
                    }
                  },
                  "required": [
                    "update"
                  ]
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "assetId",
          "name",
          "oldStatus",
          "newStatus",
          "updatedAsset"
        ]
      },
      "assetPostProcessUpdate": {
        "name": "assetPostProcessUpdate",
        "title": "assetPostProcessUpdate",
        "summary": "Fired periodically during asset post-processing (e.g., transcoding).",
        "description": "Fired periodically during asset post-processing (e.g., transcoding).\n\nPayload for the asset post-process update event.\n\nDelivered as the `notification` socket event with `type` set to `assetPostProcessUpdate`.",
        "payload": {
          "description": "Fired periodically during asset post-processing (e.g., transcoding).",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "assetId": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "percentComplete": {
                      "type": "number",
                      "format": "float"
                    },
                    "status": {
                      "type": "string"
                    },
                    "meta": {
                      "type": "object",
                      "description": "Additional metadata about the processing state."
                    }
                  },
                  "required": [
                    "assetId",
                    "percentComplete",
                    "status",
                    "meta"
                  ]
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "assetId",
          "percentComplete",
          "status",
          "meta"
        ]
      },
      "assetFileUpdate": {
        "name": "assetFileUpdate",
        "title": "assetFileUpdate",
        "summary": "Fired when a file associated with an asset is updated or added.",
        "description": "Fired when a file associated with an asset is updated or added (e.g., thumbnail generated).\n\nPayload for the asset file update event.\n\nDelivered as the `notification` socket event with `type` set to `assetFileUpdate`.\n\nToken keys marked with (*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations.",
        "payload": {
          "description": "Fired when a file associated with an asset is updated or added (e.g., thumbnail generated).",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "(*)assetId": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "(*)name": {
                      "type": "string"
                    },
                    "keyPath": {
                      "type": "string",
                      "description": "The storage key of the new/updated file."
                    },
                    "functionType": {
                      "type": "string",
                      "description": "The role of the file (e.g., 'original', 'thumbnail', 'stream')."
                    }
                  },
                  "required": [
                    "assetId",
                    "name",
                    "keyPath",
                    "functionType"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "update": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "enum": [
                              "asset"
                            ]
                          },
                          "resource": {
                            "type": "object"
                          }
                        }
                      }
                    }
                  },
                  "required": [
                    "update"
                  ]
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "assetId",
          "name",
          "keyPath",
          "functionType"
        ]
      },
      "assetGroupUploadComplete": {
        "name": "assetGroupUploadComplete",
        "title": "assetGroupUploadComplete",
        "summary": "Fired when an uploaded asset becomes active. Uploads by the same creator into the same resource/visibility within the grouping window (30 min) are accumulated into one notification, which is then re-sent via notificationUpdate.",
        "description": "Fired when a group of assets finishes uploading within a defined time window. Subsequent uploads in the window update this notification (tokens.assets and tokens.uploadCount grow) and emit notificationUpdate.\n\nPayload for the assetGroupUploadComplete event.\n\nDelivered as the `notification` socket event with `type` set to `assetGroupUploadComplete`.\n\nToken keys marked with (*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations.",
        "payload": {
          "description": "Fired when a group of assets finishes uploading within a defined time window. Subsequent uploads in the window update this notification (tokens.assets and tokens.uploadCount grow) and emit notificationUpdate.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "(*)creatorId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated. Use initiatorId."
                    },
                    "(*)creator": {
                      "type": "object",
                      "description": "Deprecated. Public user object of the uploader. Use initiator."
                    },
                    "visibility": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      },
                      "description": "Visibility of the uploaded asset(s)."
                    },
                    "(*)assets": {
                      "type": "array",
                      "items": {
                        "type": "object"
                      },
                      "description": "Deprecated. Uploaded asset objects. Use resources from changes.update."
                    },
                    "uploadCount": {
                      "type": "integer",
                      "description": "Number of assets accumulated in this group so far."
                    }
                  },
                  "required": [
                    "creatorId",
                    "creator",
                    "visibility",
                    "assets",
                    "uploadCount"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "description": "On the initial notification changes.update contains the first asset; the grouped notification delivered via notificationUpdate is NOT extended with later assets (only tokens are).",
                  "properties": {
                    "update": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "enum": [
                              "asset"
                            ]
                          },
                          "resource": {
                            "type": "object",
                            "description": "The uploaded asset."
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "creatorId",
          "creator",
          "visibility",
          "assets",
          "uploadCount"
        ]
      },
      "chatTopicChatCreate": {
        "name": "chatTopicChatCreate",
        "title": "chatTopicChatCreate",
        "summary": "Fired when a new topic-based chat is created.",
        "description": "Fired when a new topic-based chat is created (linked to an asset or project).\n\nPayload for the topic chat create event.\n\nDelivered as the `notification` socket event with `type` set to `chatTopicChatCreate`.\n\nToken keys marked with (*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations.",
        "payload": {
          "description": "Fired when a new topic-based chat is created (linked to an asset or project).",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "(*)requesterId": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "(*)requester": {
                      "type": "object"
                    },
                    "(*)chatId": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "(*)topicType": {
                      "type": "string"
                    },
                    "(*)topicId": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "(*)visibility": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    },
                    "(*)subject": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "requesterId",
                    "requester",
                    "chatId",
                    "topicType",
                    "topicId",
                    "visibility",
                    "subject"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "create": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "value": "chat"
                          },
                          "resource": {
                            "type": "object"
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "requesterId",
          "requester",
          "chatId",
          "topicType",
          "topicId",
          "visibility",
          "subject"
        ]
      },
      "chatMemberChatCreate": {
        "name": "chatMemberChatCreate",
        "title": "chatMemberChatCreate",
        "summary": "Fired when a new member-based chat (DM/group) is created.",
        "description": "Fired when a new member-based chat (direct message/group) is created.\n\nPayload for the member chat create event.\n\nDelivered as the `notification` socket event with `type` set to `chatMemberChatCreate`.\n\nToken keys marked with (*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations.",
        "payload": {
          "description": "Fired when a new member-based chat (direct message/group) is created.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "(*)requesterId": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "(*)requester": {
                      "type": "object"
                    },
                    "(*)chatId": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "(*)scopeType": {
                      "type": "string"
                    },
                    "(*)scopeId": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "(*)members": {
                      "type": "array",
                      "items": {
                        "type": "object"
                      }
                    },
                    "(*)subject": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "requesterId",
                    "requester",
                    "chatId",
                    "scopeType",
                    "scopeId",
                    "members",
                    "subject"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "create": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "value": "chatMember"
                          },
                          "resource": {
                            "type": "object"
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "requesterId",
          "requester",
          "chatId",
          "scopeType",
          "scopeId",
          "members",
          "subject"
        ]
      },
      "chatUpdateSubject": {
        "name": "chatUpdateSubject",
        "title": "chatUpdateSubject",
        "summary": "Fired when the subject of a topic-based chat is updated.",
        "description": "Fired when the subject of a topic-based chat is updated.\n\nPayload for the topic chat subject update event.\n\nDelivered as the `notification` socket event with `type` set to `chatUpdateSubject`.\n\nToken keys marked with (*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations.",
        "payload": {
          "description": "Fired when the subject of a topic-based chat is updated.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "(*)requesterId": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "(*)requester": {
                      "type": "object"
                    },
                    "(*)chatId": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "(*)topicType": {
                      "type": "string"
                    },
                    "(*)topicId": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "(*)visibility": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    },
                    "oldSubject": {
                      "type": "string"
                    },
                    "newSubject": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "requesterId",
                    "requester",
                    "chatId",
                    "topicType",
                    "topicId",
                    "visibility",
                    "oldSubject",
                    "newSubject"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "update": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "value": "chat"
                          },
                          "resource": {
                            "type": "object"
                          },
                          "oldResource": {
                            "type": "object",
                            "description": "The chat before the subject change."
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "requesterId",
          "requester",
          "chatId",
          "topicType",
          "topicId",
          "visibility",
          "oldSubject",
          "newSubject"
        ]
      },
      "chatMemberUpdate": {
        "name": "chatMemberUpdate",
        "title": "chatMemberUpdate",
        "summary": "Fired when a member chat's subject or colour is updated.",
        "description": "Fired when a member-based chat is updated (subject and/or color). Published on chat/{chatId} and user/{memberId} for every member.\n\nPayload for the chatMemberUpdate event.\n\nDelivered as the `notification` socket event with `type` set to `chatMemberUpdate`.",
        "payload": {
          "description": "Fired when a member-based chat is updated (subject and/or color). Published on chat/{chatId} and user/{memberId} for every member.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "update": {
                      "type": "object",
                      "description": "The submitted update: { subject, color }."
                    }
                  },
                  "required": [
                    "update"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "update": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "enum": [
                              "chatMember"
                            ]
                          },
                          "resource": {
                            "type": "object",
                            "description": "The updated member chat."
                          },
                          "oldResource": {
                            "type": "object",
                            "description": "The member chat before the update."
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "update"
        ]
      },
      "chatDelete": {
        "name": "chatDelete",
        "title": "chatDelete",
        "summary": "Fired when a topic-based chat is deleted.",
        "description": "Fired when a topic-based chat is deleted.\n\nPayload for the topic chat delete event.\n\nDelivered as the `notification` socket event with `type` set to `chatDelete`.\n\nToken keys marked with (*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations.",
        "payload": {
          "description": "Fired when a topic-based chat is deleted.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "(*)requesterId": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "(*)requester": {
                      "type": "object"
                    },
                    "(*)chatId": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "(*)topicType": {
                      "type": "string"
                    },
                    "(*)topicId": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "(*)visibility": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    }
                  },
                  "required": [
                    "requesterId",
                    "requester",
                    "chatId",
                    "topicType",
                    "topicId",
                    "visibility"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "delete": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "value": "chat"
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "requesterId",
          "requester",
          "chatId",
          "topicType",
          "topicId",
          "visibility"
        ]
      },
      "chatMemberDelete": {
        "name": "chatMemberDelete",
        "title": "chatMemberDelete",
        "summary": "Fired when a member-based chat is deleted.",
        "description": "Fired when a member-based chat is deleted.\n\nPayload for the member chat delete event.\n\nDelivered as the `notification` socket event with `type` set to `chatMemberDelete`.\n\nToken keys marked with (*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations.",
        "payload": {
          "description": "Fired when a member-based chat is deleted.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "(*)requesterId": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "(*)requester": {
                      "type": "object"
                    },
                    "(*)chatId": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "(*)scopeType": {
                      "type": "string"
                    },
                    "(*)scopeId": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "(*)members": {
                      "type": "array",
                      "items": {
                        "type": "object"
                      }
                    }
                  },
                  "required": [
                    "requesterId",
                    "requester",
                    "chatId",
                    "scopeType",
                    "scopeId",
                    "members"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "delete": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "value": "chatMember"
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "requesterId",
          "requester",
          "chatId",
          "scopeType",
          "scopeId",
          "members"
        ]
      },
      "chatCreateMessage": {
        "name": "chatCreateMessage",
        "title": "chatCreateMessage",
        "summary": "Fired when a new message is created in a chat (user messages, public/guest messages, AI assistant replies and system messages).",
        "description": "Fired when a new message is created in a chat. Published on chat/{chatId}, the topic resource channel(s) and user/{userId} for member chats.\n\nPayload for the chatCreateMessage event.\n\nDelivered as the `notification` socket event with `type` set to `chatCreateMessage`.\n\nToken keys marked with (*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations.",
        "payload": {
          "description": "Fired when a new message is created in a chat. Published on chat/{chatId}, the topic resource channel(s) and user/{userId} for member chats.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "(*)requesterId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated. Use initiatorId."
                    },
                    "(*)requester": {
                      "type": "object",
                      "description": "Deprecated. Use initiator."
                    },
                    "(*)chatId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated."
                    },
                    "(*)messageId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated."
                    },
                    "(*)resourceType": {
                      "type": "string",
                      "description": "Deprecated. Topic/scope resource type of the chat (e.g. 'project', 'asset', 'task', 'public')."
                    },
                    "(*)resourceId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated."
                    },
                    "(*)visibility": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      },
                      "description": "Deprecated."
                    },
                    "(*)mentions": {
                      "type": "array",
                      "items": {
                        "type": "object"
                      },
                      "description": "Deprecated. Mentions contained in the message."
                    },
                    "(*)message": {
                      "type": "object",
                      "description": "Deprecated. The created message object. Use resource from changes.create."
                    }
                  },
                  "required": [
                    "requesterId",
                    "requester",
                    "chatId",
                    "messageId",
                    "resourceType",
                    "resourceId",
                    "visibility",
                    "mentions",
                    "message"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "description": "changes.create holds the message and changes.update the parent chat (lastMessage etc.). When the message creates the chat itself (first message in a new topic chat) the chat entry appears in changes.create instead of changes.update.",
                  "properties": {
                    "create": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "enum": [
                              "chatMessage"
                            ]
                          },
                          "resource": {
                            "type": "object",
                            "description": "The created message."
                          }
                        }
                      }
                    },
                    "update": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "enum": [
                              "chat",
                              "chatMember",
                              "chatSubmission"
                            ]
                          },
                          "resource": {
                            "type": "object",
                            "description": "The chat the message belongs to (resourceType reflects the chat model: 'chat' for topic chats, 'chatMember' for member chats, 'chatSubmission' for submission chats)."
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "requesterId",
          "requester",
          "chatId",
          "messageId",
          "resourceType",
          "resourceId",
          "visibility",
          "mentions",
          "message"
        ]
      },
      "chatReviseMessage": {
        "name": "chatReviseMessage",
        "title": "chatReviseMessage",
        "summary": "Fired when a chat message is revised (edited).",
        "description": "Fired when a chat message is revised (edited).\n\nPayload for the chatReviseMessage event.\n\nDelivered as the `notification` socket event with `type` set to `chatReviseMessage`.\n\nToken keys marked with (*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations.",
        "payload": {
          "description": "Fired when a chat message is revised (edited).",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "(*)requesterId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated. Use initiatorId."
                    },
                    "(*)requester": {
                      "type": "object",
                      "description": "Deprecated. Use initiator."
                    },
                    "(*)chatId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated."
                    },
                    "(*)messageId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated."
                    },
                    "(*)resourceType": {
                      "type": "string",
                      "description": "Deprecated."
                    },
                    "(*)resourceId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated."
                    },
                    "(*)visibility": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      },
                      "description": "Deprecated."
                    },
                    "(*)mentions": {
                      "type": "array",
                      "items": {
                        "type": "object"
                      },
                      "description": "Deprecated."
                    },
                    "(*)message": {
                      "type": "object",
                      "description": "Deprecated. The revised message object. Use resource from changes.update."
                    }
                  },
                  "required": [
                    "requesterId",
                    "requester",
                    "chatId",
                    "messageId",
                    "resourceType",
                    "resourceId",
                    "visibility",
                    "mentions",
                    "message"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "update": {
                      "type": "array",
                      "items": {
                        "oneOf": [
                          {
                            "type": "object",
                            "properties": {
                              "resourceId": {
                                "type": "string",
                                "format": "uuid"
                              },
                              "resourceType": {
                                "type": "string",
                                "enum": [
                                  "chatMessage"
                                ]
                              },
                              "resource": {
                                "type": "object",
                                "description": "The revised message."
                              },
                              "oldResource": {
                                "type": "object",
                                "description": "The message before the revision."
                              }
                            }
                          },
                          {
                            "type": "object",
                            "properties": {
                              "resourceId": {
                                "type": "string",
                                "format": "uuid"
                              },
                              "resourceType": {
                                "type": "string",
                                "enum": [
                                  "chat",
                                  "chatMember",
                                  "chatSubmission"
                                ]
                              },
                              "resource": {
                                "type": "object",
                                "description": "The chat the message belongs to (resourceType reflects the chat model: 'chat' for topic chats, 'chatMember' for member chats, 'chatSubmission' for submission chats)."
                              }
                            }
                          }
                        ]
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "requesterId",
          "requester",
          "chatId",
          "messageId",
          "resourceType",
          "resourceId",
          "visibility",
          "mentions",
          "message"
        ]
      },
      "chatRefreshMessage": {
        "name": "chatRefreshMessage",
        "title": "chatRefreshMessage",
        "summary": "Provides an updated representation of a system message (e.g. after the assets it references finish processing).",
        "description": "Fired by the system to provide an updated representation of a message. initiatorType is always system.\n\nPayload for the chatRefreshMessage event.\n\nDelivered as the `notification` socket event with `type` set to `chatRefreshMessage`.\n\nToken keys marked with (*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations.",
        "payload": {
          "description": "Fired by the system to provide an updated representation of a message. initiatorType is always system.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "(*)chatId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated."
                    },
                    "(*)messageId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated."
                    },
                    "(*)message": {
                      "type": "object",
                      "description": "Deprecated. The refreshed message object. Use resource from changes.update."
                    }
                  },
                  "required": [
                    "chatId",
                    "messageId",
                    "message"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "update": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "enum": [
                              "chatMessage"
                            ]
                          },
                          "resource": {
                            "type": "object",
                            "description": "The refreshed message."
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "chatId",
          "messageId",
          "message"
        ]
      },
      "chatMention": {
        "name": "chatMention",
        "title": "chatMention",
        "summary": "Fired when user(s) are mentioned in a created or revised chat message. Published only on the mentioned users' channels (user/{userId}).",
        "description": "Fired specifically when a user is mentioned in a chat message. Tokens are the same set as chatCreateMessage / chatReviseMessage.\n\nPayload for the chatMention event.\n\nDelivered as the `notification` socket event with `type` set to `chatMention`.\n\nToken keys marked with (*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations.",
        "payload": {
          "description": "Fired specifically when a user is mentioned in a chat message. Tokens are the same set as chatCreateMessage / chatReviseMessage.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "(*)requesterId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated. Use initiatorId."
                    },
                    "(*)requester": {
                      "type": "object",
                      "description": "Deprecated. Use initiator."
                    },
                    "(*)chatId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated."
                    },
                    "(*)messageId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated."
                    },
                    "mentions": {
                      "type": "array",
                      "items": {
                        "type": "object"
                      },
                      "description": "Mentions contained in the message."
                    },
                    "(*)message": {
                      "type": "object",
                      "description": "Deprecated. The message containing the mention. Use resource from changes.update."
                    },
                    "(*)resourceType": {
                      "type": "string",
                      "description": "Deprecated. Topic/scope resource type of the chat."
                    },
                    "(*)resourceId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated."
                    },
                    "(*)visibility": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      },
                      "description": "Deprecated."
                    }
                  },
                  "required": [
                    "requesterId",
                    "requester",
                    "chatId",
                    "messageId",
                    "mentions",
                    "message",
                    "resourceType",
                    "resourceId",
                    "visibility"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "update": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "enum": [
                              "chatMessage"
                            ]
                          },
                          "resource": {
                            "type": "object",
                            "description": "The message containing the mention."
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "requesterId",
          "requester",
          "chatId",
          "messageId",
          "mentions",
          "message",
          "resourceType",
          "resourceId",
          "visibility"
        ]
      },
      "chatDeleteMessage": {
        "name": "chatDeleteMessage",
        "title": "chatDeleteMessage",
        "summary": "Fired when a chat message is deleted.",
        "description": "Fired when a chat message is deleted.\n\nPayload for the chatDeleteMessage event.\n\nDelivered as the `notification` socket event with `type` set to `chatDeleteMessage`.\n\nToken keys marked with (*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations.",
        "payload": {
          "description": "Fired when a chat message is deleted.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "(*)requesterId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated. Use initiatorId."
                    },
                    "(*)requester": {
                      "type": "object",
                      "description": "Deprecated. Use initiator."
                    },
                    "(*)chatId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated."
                    },
                    "(*)messageId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated."
                    },
                    "(*)resourceType": {
                      "type": "string",
                      "description": "Deprecated."
                    },
                    "(*)resourceId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated."
                    },
                    "(*)visibility": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      },
                      "description": "Deprecated."
                    },
                    "(*)replyToId": {
                      "type": "string",
                      "format": "uuid",
                      "nullable": true,
                      "description": "Deprecated. ID of the message this was a reply to, if any."
                    }
                  },
                  "required": [
                    "requesterId",
                    "requester",
                    "chatId",
                    "messageId",
                    "resourceType",
                    "resourceId",
                    "visibility",
                    "replyToId"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "update": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "enum": [
                              "chat",
                              "chatMember",
                              "chatSubmission"
                            ]
                          },
                          "resource": {
                            "type": "object",
                            "description": "The parent chat after the deletion (message counts etc.)."
                          }
                        }
                      }
                    },
                    "delete": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "enum": [
                              "chatMessage"
                            ]
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "requesterId",
          "requester",
          "chatId",
          "messageId",
          "resourceType",
          "resourceId",
          "visibility",
          "replyToId"
        ]
      },
      "chatRemoveAttachment": {
        "name": "chatRemoveAttachment",
        "title": "chatRemoveAttachment",
        "summary": "Fired when an attachment is removed from a chat message.",
        "description": "Fired when an attachment is removed from a chat message.\n\nPayload for the chat remove attachment event.\n\nDelivered as the `notification` socket event with `type` set to `chatRemoveAttachment`.\n\nToken keys marked with (*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations.",
        "payload": {
          "description": "Fired when an attachment is removed from a chat message.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "(*)requesterId": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "(*)requester": {
                      "type": "object"
                    },
                    "(*)chatId": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "(*)messageId": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "(*)assetId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "ID of the asset that was removed."
                    },
                    "(*)resourceType": {
                      "type": "string"
                    },
                    "(*)resourceId": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "(*)visibility": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    }
                  },
                  "required": [
                    "requesterId",
                    "requester",
                    "chatId",
                    "messageId",
                    "assetId",
                    "resourceType",
                    "resourceId",
                    "visibility"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "update": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "value": "chatMessage"
                          },
                          "resource": {
                            "type": "object"
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "requesterId",
          "requester",
          "chatId",
          "messageId",
          "assetId",
          "resourceType",
          "resourceId",
          "visibility"
        ]
      },
      "folderCreate": {
        "name": "folderCreate",
        "title": "folderCreate",
        "summary": "CURRENTLY UNUSED (the event type is still registered but nothing emits it). Fired when a new folder is created.",
        "description": "Fired when a new folder is created.\n\nPayload for the folder create event.\n\nDelivered as the `notification` socket event with `type` set to `folderCreate`.\n\nToken keys marked with (*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations.",
        "payload": {
          "description": "Fired when a new folder is created.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "(*)requesterId": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "(*)requester": {
                      "type": "object"
                    },
                    "(*)folder": {
                      "type": "object",
                      "description": "The newly created folder object."
                    }
                  },
                  "required": [
                    "requesterId",
                    "requester",
                    "folder"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "create": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "value": "folder"
                          },
                          "resource": {
                            "type": "object"
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "requesterId",
          "requester",
          "folder"
        ]
      },
      "folderUpdate": {
        "name": "folderUpdate",
        "title": "folderUpdate",
        "summary": "CURRENTLY UNUSED (the event type is still registered but nothing emits it). Fired when a folder is updated.",
        "description": "Fired when a folder is updated (name, color, etc.).\n\nPayload for the folder update event.\n\nDelivered as the `notification` socket event with `type` set to `folderUpdate`.\n\nToken keys marked with (*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations.",
        "payload": {
          "description": "Fired when a folder is updated (name, color, etc.).",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "(*)requesterId": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "(*)requester": {
                      "type": "object"
                    },
                    "(*)originalFolder": {
                      "type": "object",
                      "description": "The folder object before the update."
                    },
                    "(*)updatedFolder": {
                      "type": "object",
                      "description": "The folder object after the update."
                    }
                  },
                  "required": [
                    "requesterId",
                    "requester",
                    "originalFolder",
                    "updatedFolder"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "update": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "value": "folder"
                          },
                          "resource": {
                            "type": "object"
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "requesterId",
          "requester",
          "originalFolder",
          "updatedFolder"
        ]
      },
      "folderDelete": {
        "name": "folderDelete",
        "title": "folderDelete",
        "summary": "CURRENTLY UNUSED (the event type is still registered but nothing emits it). Fired when a folder is deleted.",
        "description": "Fired when a folder is deleted.\n\nPayload for the folder delete event.\n\nDelivered as the `notification` socket event with `type` set to `folderDelete`.\n\nToken keys marked with (*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations.",
        "payload": {
          "description": "Fired when a folder is deleted.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "(*)requesterId": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "(*)requester": {
                      "type": "object"
                    },
                    "(*)folder": {
                      "type": "object",
                      "description": "The folder object that was deleted."
                    }
                  },
                  "required": [
                    "requesterId",
                    "requester",
                    "folder"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "delete": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "value": "folder"
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "requesterId",
          "requester",
          "folder"
        ]
      },
      "inviteCreate": {
        "name": "inviteCreate",
        "title": "inviteCreate",
        "summary": "Fired when a new invitation is created.",
        "description": "Fired when a new invitation is created.\n\nPayload for the invite create event.\n\nDelivered as the `notification` socket event with `type` set to `inviteCreate`.\n\nToken keys marked with (*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations.",
        "payload": {
          "description": "Fired when a new invitation is created.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "(*)requesterId": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "(*)requester": {
                      "type": "object"
                    },
                    "(*)inviteeEmail": {
                      "type": "string",
                      "format": "email"
                    },
                    "(*)resourceType": {
                      "type": "string"
                    },
                    "(*)resourceId": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "(*)role": {
                      "type": "string"
                    },
                    "(*)resourceName": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "requesterId",
                    "requester",
                    "inviteeEmail",
                    "resourceType",
                    "resourceId",
                    "role",
                    "resourceName"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "create": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "value": "invite"
                          },
                          "resource": {
                            "type": "object"
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "requesterId",
          "requester",
          "inviteeEmail",
          "resourceType",
          "resourceId",
          "role",
          "resourceName"
        ]
      },
      "inviteCancel": {
        "name": "inviteCancel",
        "title": "inviteCancel",
        "summary": "Fired when an invitation is cancelled.",
        "description": "Fired when an invitation is cancelled.\n\nPayload for the invite cancel event.\n\nDelivered as the `notification` socket event with `type` set to `inviteCancel`.\n\nToken keys marked with (*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations.",
        "payload": {
          "description": "Fired when an invitation is cancelled.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "(*)requesterId": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "(*)requester": {
                      "type": "object"
                    },
                    "(*)inviteeEmail": {
                      "type": "string",
                      "format": "email"
                    },
                    "(*)resourceType": {
                      "type": "string"
                    },
                    "(*)resourceId": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "(*)role": {
                      "type": "string"
                    },
                    "(*)invite": {
                      "type": "object",
                      "description": "The invite object that was cancelled."
                    }
                  },
                  "required": [
                    "requesterId",
                    "requester",
                    "inviteeEmail",
                    "resourceType",
                    "resourceId",
                    "role",
                    "invite"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "update": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "value": "invite"
                          },
                          "resource": {
                            "type": "object"
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "requesterId",
          "requester",
          "inviteeEmail",
          "resourceType",
          "resourceId",
          "role",
          "invite"
        ]
      },
      "inviteAccept": {
        "name": "inviteAccept",
        "title": "inviteAccept",
        "summary": "Fired when an invitation is accepted.",
        "description": "Fired when an invitation is accepted.\n\nPayload for the inviteAccept event.\n\nDelivered as the `notification` socket event with `type` set to `inviteAccept`.\n\nToken keys marked with (*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations.",
        "payload": {
          "description": "Fired when an invitation is accepted.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "(*)requesterId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated. Use initiatorId."
                    },
                    "(*)requester": {
                      "type": "object",
                      "description": "Deprecated. Use initiator."
                    },
                    "(*)resourceType": {
                      "type": "string",
                      "description": "Deprecated."
                    },
                    "(*)resourceId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated."
                    },
                    "(*)role": {
                      "type": "string",
                      "description": "Deprecated."
                    },
                    "(*)invite": {
                      "type": "object",
                      "description": "Deprecated. The invite object that was accepted."
                    },
                    "(*)membership": {
                      "type": "object",
                      "description": "Deprecated. The newly created membership object."
                    }
                  },
                  "required": [
                    "requesterId",
                    "requester",
                    "resourceType",
                    "resourceId",
                    "role",
                    "invite",
                    "membership"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "update": {
                      "type": "array",
                      "items": {
                        "oneOf": [
                          {
                            "type": "object",
                            "properties": {
                              "resourceId": {
                                "type": "string",
                                "format": "uuid",
                                "description": "Note: the ID of the resource the membership belongs to (not the membership ID)."
                              },
                              "resourceType": {
                                "type": "string",
                                "enum": [
                                  "membership"
                                ]
                              },
                              "resource": {
                                "type": "object",
                                "description": "The membership created by accepting the invite."
                              }
                            }
                          },
                          {
                            "type": "object",
                            "properties": {
                              "resourceId": {
                                "type": "string",
                                "format": "uuid",
                                "description": "Note: the ID of the resource the invite belongs to (not the invite ID)."
                              },
                              "resourceType": {
                                "type": "string",
                                "enum": [
                                  "invite"
                                ]
                              },
                              "resource": {
                                "type": "object",
                                "description": "The accepted invite."
                              }
                            }
                          }
                        ]
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "requesterId",
          "requester",
          "resourceType",
          "resourceId",
          "role",
          "invite",
          "membership"
        ]
      },
      "membershipDelete": {
        "name": "membershipDelete",
        "title": "membershipDelete",
        "summary": "Fired when a user's membership to a resource is deleted (removed).",
        "description": "Fired when a user's membership to a resource is deleted (removed).\n\nPayload for the membership delete event.\n\nDelivered as the `notification` socket event with `type` set to `membershipDelete`.\n\nToken keys marked with (*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations.",
        "payload": {
          "description": "Fired when a user's membership to a resource is deleted (removed).",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "(*)requesterId": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "(*)requester": {
                      "type": "object"
                    },
                    "(*)memberId": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "(*)member": {
                      "type": "object"
                    },
                    "(*)resourceType": {
                      "type": "string"
                    },
                    "(*)resourceId": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "resourceName": {
                      "type": "string"
                    },
                    "roles": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    }
                  },
                  "required": [
                    "requesterId",
                    "requester",
                    "memberId",
                    "member",
                    "resourceType",
                    "resourceId",
                    "resourceName",
                    "roles"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "delete": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "value": "membership"
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "requesterId",
          "requester",
          "memberId",
          "member",
          "resourceType",
          "resourceId",
          "resourceName",
          "roles"
        ]
      },
      "membershipAddRole": {
        "name": "membershipAddRole",
        "title": "membershipAddRole",
        "summary": "Fired when a role is added to a user's membership.",
        "description": "Fired when a role is added to a user's membership for a resource.\n\nPayload for the membership add role event.\n\nDelivered as the `notification` socket event with `type` set to `membershipAddRole`.\n\nToken keys marked with (*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations.",
        "payload": {
          "description": "Fired when a role is added to a user's membership for a resource.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "(*)requesterId": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "(*)requester": {
                      "type": "object"
                    },
                    "(*)memberId": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "member": {
                      "type": "object"
                    },
                    "(*)resourceType": {
                      "type": "string"
                    },
                    "(*)resourceId": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "resourceName": {
                      "type": "string"
                    },
                    "role": {
                      "type": "string"
                    },
                    "(*)membership": {
                      "type": "object"
                    }
                  },
                  "required": [
                    "requesterId",
                    "requester",
                    "memberId",
                    "member",
                    "resourceType",
                    "resourceId",
                    "resourceName",
                    "role",
                    "membership"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "update": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "value": "membership"
                          },
                          "resource": {
                            "type": "object"
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "requesterId",
          "requester",
          "memberId",
          "member",
          "resourceType",
          "resourceId",
          "resourceName",
          "role",
          "membership"
        ]
      },
      "membershipRemoveRole": {
        "name": "membershipRemoveRole",
        "title": "membershipRemoveRole",
        "summary": "Fired when a role is removed from a user's membership.",
        "description": "Fired when a role is removed from a user's membership for a resource.\n\nPayload for the membership remove role event.\n\nDelivered as the `notification` socket event with `type` set to `membershipRemoveRole`.\n\nToken keys marked with (*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations.",
        "payload": {
          "description": "Fired when a role is removed from a user's membership for a resource.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "(*)requesterId": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "(*)requester": {
                      "type": "object"
                    },
                    "(*)memberId": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "member": {
                      "type": "object"
                    },
                    "(*)resourceType": {
                      "type": "string"
                    },
                    "(*)resourceId": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "resourceName": {
                      "type": "string"
                    },
                    "role": {
                      "type": "string"
                    },
                    "(*)membership": {
                      "type": "object",
                      "description": "The updated membership object."
                    }
                  },
                  "required": [
                    "requesterId",
                    "requester",
                    "memberId",
                    "member",
                    "resourceType",
                    "resourceId",
                    "resourceName",
                    "role",
                    "membership"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "update": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "value": "membership"
                          },
                          "resource": {
                            "type": "object"
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "requesterId",
          "requester",
          "memberId",
          "member",
          "resourceType",
          "resourceId",
          "resourceName",
          "role",
          "membership"
        ]
      },
      "membershipLeaveResource": {
        "name": "membershipLeaveResource",
        "title": "membershipLeaveResource",
        "summary": "Fired when a user leaves a resource themselves.",
        "description": "Fired when a user leaves a resource themselves.\n\nPayload for the membershipLeaveResource event.\n\nDelivered as the `notification` socket event with `type` set to `membershipLeaveResource`.\n\nToken keys marked with (*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations.",
        "payload": {
          "description": "Fired when a user leaves a resource themselves.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "(*)requesterId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated. Use initiatorId."
                    },
                    "(*)requester": {
                      "type": "object",
                      "description": "Deprecated. Use initiator."
                    },
                    "(*)memberId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated."
                    },
                    "member": {
                      "type": "object"
                    },
                    "(*)resourceType": {
                      "type": "string",
                      "description": "Deprecated."
                    },
                    "(*)resourceId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated."
                    },
                    "resourceName": {
                      "type": "string"
                    },
                    "roles": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    }
                  },
                  "required": [
                    "requesterId",
                    "requester",
                    "memberId",
                    "member",
                    "resourceType",
                    "resourceId",
                    "resourceName",
                    "roles"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "delete": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid",
                            "description": "ID of the deleted membership record."
                          },
                          "resourceType": {
                            "type": "string",
                            "enum": [
                              "membership"
                            ]
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "requesterId",
          "requester",
          "memberId",
          "member",
          "resourceType",
          "resourceId",
          "resourceName",
          "roles"
        ]
      },
      "workspaceStorageLimitWarning": {
        "name": "workspaceStorageLimitWarning",
        "title": "workspaceStorageLimitWarning",
        "summary": "Fired when a workspace's storage usage exceeds a threshold.",
        "description": "Fired when a workspace's storage usage exceeds a predefined threshold.\n\nPayload for the workspace storage limit warning event.\n\nDelivered as the `notification` socket event with `type` set to `workspaceStorageLimitWarning`.",
        "payload": {
          "description": "Fired when a workspace's storage usage exceeds a predefined threshold.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "workspaceId": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "storageLimitInBytes": {
                      "type": "number"
                    },
                    "storageUsedInBytes": {
                      "type": "number"
                    }
                  },
                  "required": [
                    "workspaceId",
                    "storageLimitInBytes",
                    "storageUsedInBytes"
                  ]
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "workspaceId",
          "storageLimitInBytes",
          "storageUsedInBytes"
        ]
      },
      "userSelfUpdate": {
        "name": "userSelfUpdate",
        "title": "userSelfUpdate",
        "summary": "Fired when a user updates their own profile information.",
        "description": "Fired when a user updates their own profile information.\n\nPayload for the user self update event.\n\nDelivered as the `notification` socket event with `type` set to `userSelfUpdate`.\n\nToken keys marked with (*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations.",
        "payload": {
          "description": "Fired when a user updates their own profile information.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "(*)update": {
                      "type": "object",
                      "description": "Object containing the fields that were updated."
                    }
                  },
                  "required": [
                    "update"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "update": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "value": "user"
                          },
                          "resource": {
                            "type": "object"
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "update"
        ]
      },
      "userPublicUpdate": {
        "name": "userPublicUpdate",
        "title": "userPublicUpdate",
        "summary": "Fired when a user's public information is updated.",
        "description": "Fired when a user's public information (e.g., display name, avatar) is updated, visible to others.\n\nPayload for the user public update event.\n\nDelivered as the `notification` socket event with `type` set to `userPublicUpdate`.\n\nToken keys marked with (*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations.",
        "payload": {
          "description": "Fired when a user's public information (e.g., display name, avatar) is updated, visible to others.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "(*)update": {
                      "type": "object",
                      "description": "Object containing the public fields that were updated."
                    }
                  },
                  "required": [
                    "update"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "update": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "value": "user"
                          },
                          "resource": {
                            "type": "object"
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "update"
        ]
      },
      "userDeleted": {
        "name": "userDeleted",
        "title": "userDeleted",
        "summary": "Fired when a user account is deleted.",
        "description": "Fired when a user account is deleted.\n\nPayload for the user deleted event.\n\nDelivered as the `notification` socket event with `type` set to `userDeleted`.\n\nToken keys marked with (*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations.",
        "payload": {
          "description": "Fired when a user account is deleted.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "(*)userData": {
                      "type": "object",
                      "description": "Information about the user who was deleted."
                    }
                  },
                  "required": [
                    "userData"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "delete": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "value": "user"
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "userData"
        ]
      },
      "userAvatarUpdate": {
        "name": "userAvatarUpdate",
        "title": "userAvatarUpdate",
        "summary": "Fired when a avatars status is set to active. Note that this is an asset event and not a user event so it is fired when the asset's status is set to active not when a user's object is updated.",
        "description": "Fired when a user updates their avatar.\n\nPayload for the user avatar update event.\n\nDelivered as the `notification` socket event with `type` set to `userAvatarUpdate`.\n\nToken keys marked with (*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations.",
        "payload": {
          "description": "Fired when a user updates their avatar.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "(*)userId": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "(*)asset": {
                      "type": "object",
                      "description": "The asset object representing the new avatar."
                    }
                  },
                  "required": [
                    "userId",
                    "asset"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "update": {
                      "type": "array",
                      "items": {
                        "oneOf": [
                          {
                            "type": "object",
                            "properties": {
                              "resourceId": {
                                "type": "string",
                                "format": "uuid"
                              },
                              "resourceType": {
                                "type": "string",
                                "value": "asset"
                              },
                              "resource": {
                                "type": "object"
                              }
                            }
                          },
                          {
                            "type": "object",
                            "properties": {
                              "resourceId": {
                                "type": "string",
                                "format": "uuid"
                              },
                              "resourceType": {
                                "type": "string",
                                "value": "user"
                              },
                              "resource": {
                                "type": "object"
                              }
                            }
                          }
                        ]
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "userId",
          "asset"
        ]
      },
      "logoUpdate": {
        "name": "logoUpdate",
        "title": "logoUpdate",
        "summary": "Generic event for when a workspace or project logo asset becomes active. Includes the updated owner resource in changes.",
        "description": "Fired by the system when a logo asset's upload completes. changes.update contains the asset and the owning workspace/project.\n\nPayload for the logoUpdate event.\n\nDelivered as the `notification` socket event with `type` set to `logoUpdate`.\n\nToken keys marked with (*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations.",
        "payload": {
          "description": "Fired by the system when a logo asset's upload completes. changes.update contains the asset and the owning workspace/project.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "(*)resourceType": {
                      "type": "string",
                      "enum": [
                        "workspace",
                        "project"
                      ],
                      "description": "Deprecated."
                    },
                    "(*)resourceId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated."
                    },
                    "(*)asset": {
                      "type": "object",
                      "description": "Deprecated. The asset object representing the new logo."
                    }
                  },
                  "required": [
                    "resourceType",
                    "resourceId",
                    "asset"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "update": {
                      "type": "array",
                      "items": {
                        "oneOf": [
                          {
                            "type": "object",
                            "properties": {
                              "resourceId": {
                                "type": "string",
                                "format": "uuid"
                              },
                              "resourceType": {
                                "type": "string",
                                "enum": [
                                  "asset"
                                ]
                              },
                              "resource": {
                                "type": "object",
                                "description": "The logo asset."
                              }
                            }
                          },
                          {
                            "type": "object",
                            "properties": {
                              "resourceId": {
                                "type": "string",
                                "format": "uuid"
                              },
                              "resourceType": {
                                "type": "string",
                                "enum": [
                                  "workspace",
                                  "project"
                                ]
                              },
                              "resource": {
                                "type": "object",
                                "description": "The owning resource with the new logo applied."
                              }
                            }
                          }
                        ]
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "resourceType",
          "resourceId",
          "asset"
        ]
      },
      "iconUpdate": {
        "name": "iconUpdate",
        "title": "iconUpdate",
        "summary": "Generic event for when a workspace or project icon asset becomes active. Includes the updated owner resource in changes.",
        "description": "Fired by the system when an icon asset's upload completes. changes.update contains the asset and the owning workspace/project.\n\nPayload for the iconUpdate event.\n\nDelivered as the `notification` socket event with `type` set to `iconUpdate`.\n\nToken keys marked with (*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations.",
        "payload": {
          "description": "Fired by the system when an icon asset's upload completes. changes.update contains the asset and the owning workspace/project.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "(*)resourceType": {
                      "type": "string",
                      "enum": [
                        "workspace",
                        "project"
                      ],
                      "description": "Deprecated."
                    },
                    "(*)resourceId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated."
                    },
                    "(*)asset": {
                      "type": "object",
                      "description": "Deprecated. The asset object representing the new icon."
                    }
                  },
                  "required": [
                    "resourceType",
                    "resourceId",
                    "asset"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "update": {
                      "type": "array",
                      "items": {
                        "oneOf": [
                          {
                            "type": "object",
                            "properties": {
                              "resourceId": {
                                "type": "string",
                                "format": "uuid"
                              },
                              "resourceType": {
                                "type": "string",
                                "enum": [
                                  "asset"
                                ]
                              },
                              "resource": {
                                "type": "object",
                                "description": "The icon asset."
                              }
                            }
                          },
                          {
                            "type": "object",
                            "properties": {
                              "resourceId": {
                                "type": "string",
                                "format": "uuid"
                              },
                              "resourceType": {
                                "type": "string",
                                "enum": [
                                  "workspace",
                                  "project"
                                ]
                              },
                              "resource": {
                                "type": "object",
                                "description": "The owning resource with the new icon applied."
                              }
                            }
                          }
                        ]
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "resourceType",
          "resourceId",
          "asset"
        ]
      },
      "taskAcknowledged": {
        "name": "taskAcknowledged",
        "title": "taskAcknowledged",
        "summary": "Fired when tasks are acknowledged within a project.",
        "description": "Fired when tasks are acknowledged within a project.\n\nPayload for the task acknowledged event.\n\nDelivered as the `notification` socket event with `type` set to `taskAcknowledged`.\n\nToken keys marked with (*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations.",
        "payload": {
          "description": "Fired when tasks are acknowledged within a project.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "(*)projectId": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "newUnacknowledgedCount": {
                      "type": "integer",
                      "description": "The remaining count of unacknowledged tasks."
                    },
                    "(*)acknowledgedTasks": {
                      "type": "array",
                      "items": {
                        "type": "object"
                      },
                      "description": "List of tasks that were acknowledged."
                    }
                  },
                  "required": [
                    "projectId",
                    "newUnacknowledgedCount",
                    "acknowledgedTasks"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "update": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "value": "task"
                          },
                          "resource": {
                            "type": "object"
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "projectId",
          "newUnacknowledgedCount",
          "acknowledgedTasks"
        ]
      },
      "taskStatusUpdate": {
        "name": "taskStatusUpdate",
        "title": "taskStatusUpdate",
        "summary": "Fired when the status of a task is updated.",
        "description": "Fired when the status of a task is updated.\n\nPayload for the task status update event.\n\nDelivered as the `notification` socket event with `type` set to `taskStatusUpdate`.\n\nToken keys marked with (*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations.",
        "payload": {
          "description": "Fired when the status of a task is updated.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "(*)projectId": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "originalStatus": {
                      "type": "string"
                    },
                    "updatedStatus": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "projectId",
                    "originalStatus",
                    "updatedStatus"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "update": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "value": "task"
                          },
                          "resource": {
                            "type": "object"
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "projectId",
          "originalStatus",
          "updatedStatus"
        ]
      },
      "taskCreate": {
        "name": "taskCreate",
        "title": "taskCreate",
        "summary": "Fired when a new task is created within a project.",
        "description": "Fired when a new task is created within a project.\n\nPayload for the task create event.\n\nDelivered as the `notification` socket event with `type` set to `taskCreate`.\n\nToken keys marked with (*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations.",
        "payload": {
          "description": "Fired when a new task is created within a project.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "(*)projectId": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "(*)task": {
                      "type": "object",
                      "description": "The newly created task object."
                    }
                  },
                  "required": [
                    "projectId",
                    "task"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "create": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "value": "task"
                          },
                          "resource": {
                            "type": "object"
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "projectId",
          "task"
        ]
      },
      "notificationUpdateLastSeen": {
        "name": "notificationUpdateLastSeen",
        "title": "notificationUpdateLastSeen",
        "summary": "Fired to update a client's 'last seen' timestamp for notifications.",
        "description": "Fired internally or for specific clients to update their 'last seen' timestamp for certain notification channels/types.\n\nPayload for the notification update last seen event.\n\nDelivered as the `notification` socket event with `type` set to `notificationUpdateLastSeen`.\n\nToken keys marked with (*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations.",
        "payload": {
          "description": "Fired internally or for specific clients to update their 'last seen' timestamp for certain notification channels/types.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "(*)channels": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    },
                    "(*)types": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    },
                    "(*)lastSeen": {
                      "type": "string",
                      "format": "date-time"
                    }
                  },
                  "required": [
                    "channels",
                    "types",
                    "lastSeen"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "update": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "value": "lastSeen"
                          },
                          "resource": {
                            "type": "object"
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "channels",
          "types",
          "lastSeen"
        ]
      },
      "submissionCreate": {
        "name": "submissionCreate",
        "title": "submissionCreate",
        "summary": "Fired when a submission is released for the first time. Published on project/{projectId}, project/{projectId}/creator and project/{projectId}/reviewer.",
        "description": "Fired when a submission is released for the first time. Published on project/{projectId}, project/{projectId}/creator and project/{projectId}/reviewer.\n\nPayload for the submissionCreate event.\n\nDelivered as the `notification` socket event with `type` set to `submissionCreate`.\n\nToken keys marked with (*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations.",
        "payload": {
          "description": "Fired when a submission is released for the first time. Published on project/{projectId}, project/{projectId}/creator and project/{projectId}/reviewer.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "(*)requesterId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated. Use initiatorId."
                    },
                    "(*)requester": {
                      "type": "object",
                      "description": "Deprecated. Use initiator."
                    },
                    "(*)submission": {
                      "type": "object",
                      "description": "Deprecated. The submission (chatSubmission) object. Use resource from changes.create."
                    }
                  },
                  "required": [
                    "requesterId",
                    "requester",
                    "submission"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "create": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "enum": [
                              "chatSubmission"
                            ]
                          },
                          "resource": {
                            "type": "object",
                            "description": "The released submission."
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "requesterId",
          "requester",
          "submission"
        ]
      },
      "projectItemsPublish": {
        "name": "projectItemsPublish",
        "title": "projectItemsPublish",
        "summary": "Fired when multiple items (assets/folders) within a project are published.",
        "description": "Fired when multiple items (assets/folders) within a project are published.\n\nPayload for the project items publish event.\n\nDelivered as the `notification` socket event with `type` set to `projectItemsPublish`.",
        "payload": {
          "description": "Fired when multiple items (assets/folders) within a project are published.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {}
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "update": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "enum": [
                              "asset",
                              "folder"
                            ]
                          },
                          "resource": {
                            "type": "object"
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": []
      },
      "projectItemsUnpublish": {
        "name": "projectItemsUnpublish",
        "title": "projectItemsUnpublish",
        "summary": "Fired when multiple items (assets/folders) within a project are unpublished.",
        "description": "Fired when multiple items (assets/folders) within a project are unpublished.\n\nPayload for the project items unpublish event.\n\nDelivered as the `notification` socket event with `type` set to `projectItemsUnpublish`.",
        "payload": {
          "description": "Fired when multiple items (assets/folders) within a project are unpublished.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {}
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "update": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "enum": [
                              "asset",
                              "folder"
                            ]
                          },
                          "resource": {
                            "type": "object"
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": []
      },
      "folderPublish": {
        "name": "folderPublish",
        "title": "folderPublish",
        "summary": "Fired when an individual folder is published.",
        "description": "Fired when an individual folder is published.\n\nPayload for the folder publish event.\n\nDelivered as the `notification` socket event with `type` set to `folderPublish`.\n\nToken keys marked with (*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations.",
        "payload": {
          "description": "Fired when an individual folder is published.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "(*)name": {
                      "type": "string",
                      "description": "Name of the folder that was published."
                    }
                  },
                  "required": [
                    "name"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "update": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "value": "folder"
                          },
                          "resource": {
                            "type": "object"
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "name"
        ]
      },
      "folderTag": {
        "name": "folderTag",
        "title": "folderTag",
        "summary": "Fired when a tag is added to a folder.",
        "description": "Fired when a tag is added to a folder.\n\nPayload for the folderTag event.\n\nDelivered as the `notification` socket event with `type` set to `folderTag`.",
        "payload": {
          "description": "Fired when a tag is added to a folder.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "name": {
                      "type": "string",
                      "description": "Folder name."
                    },
                    "tagName": {
                      "type": "string",
                      "description": "Name of the tag that was added."
                    }
                  },
                  "required": [
                    "name",
                    "tagName"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "description": "Not populated for this event (the notification is created without a changes object)."
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "name",
          "tagName"
        ]
      },
      "folderUntag": {
        "name": "folderUntag",
        "title": "folderUntag",
        "summary": "Fired when a tag is removed from a folder.",
        "description": "Fired when a tag is removed from a folder.\n\nPayload for the folderUntag event.\n\nDelivered as the `notification` socket event with `type` set to `folderUntag`.",
        "payload": {
          "description": "Fired when a tag is removed from a folder.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "name": {
                      "type": "string",
                      "description": "Folder name."
                    },
                    "tagName": {
                      "type": "string",
                      "description": "Name of the tag that was removed."
                    }
                  },
                  "required": [
                    "name",
                    "tagName"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "description": "Not populated for this event (the notification is created without a changes object)."
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "name",
          "tagName"
        ]
      },
      "tagCreate": {
        "name": "tagCreate",
        "title": "tagCreate",
        "summary": "Fired when a new tag is created.",
        "description": "Fired when a new tag is created.\n\nPayload for the tag create event.\n\nDelivered as the `notification` socket event with `type` set to `tagCreate`.\n\nToken keys marked with (*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations.",
        "payload": {
          "description": "Fired when a new tag is created.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "(*)tagName": {
                      "type": "string",
                      "description": "Name of the created tag."
                    },
                    "(*)color": {
                      "type": "string",
                      "description": "Color of the created tag."
                    }
                  },
                  "required": [
                    "tagName",
                    "color"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "create": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "value": "tag"
                          },
                          "resource": {
                            "type": "object"
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "tagName",
          "color"
        ]
      },
      "tagUpdate": {
        "name": "tagUpdate",
        "title": "tagUpdate",
        "summary": "Fired when a tag is updated.",
        "description": "Fired when a tag is updated (name or color change).\n\nPayload for the tag update event.\n\nDelivered as the `notification` socket event with `type` set to `tagUpdate`.\n\nToken keys marked with (*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations.",
        "payload": {
          "description": "Fired when a tag is updated (name or color change).",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "(*)oldTagName": {
                      "type": "string",
                      "description": "Previous name of the tag."
                    },
                    "(*)newTagName": {
                      "type": "string",
                      "description": "New name of the tag."
                    },
                    "(*)oldColor": {
                      "type": "string",
                      "description": "Previous color of the tag."
                    },
                    "(*)newColor": {
                      "type": "string",
                      "description": "New color of the tag."
                    }
                  },
                  "required": [
                    "oldTagName",
                    "newTagName",
                    "oldColor",
                    "newColor"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "update": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "value": "tag"
                          },
                          "resource": {
                            "type": "object"
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "oldTagName",
          "newTagName",
          "oldColor",
          "newColor"
        ]
      },
      "tagDelete": {
        "name": "tagDelete",
        "title": "tagDelete",
        "summary": "Fired when a tag is deleted.",
        "description": "Fired when a tag is deleted.\n\nPayload for the tagDelete event.\n\nDelivered as the `notification` socket event with `type` set to `tagDelete`.\n\nToken keys marked with (*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations.",
        "payload": {
          "description": "Fired when a tag is deleted.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "(*)tagName": {
                      "type": "string",
                      "description": "Deprecated. Name of the deleted tag."
                    },
                    "(*)color": {
                      "type": "string",
                      "description": "Deprecated. Color of the deleted tag."
                    }
                  },
                  "required": [
                    "tagName",
                    "color"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "delete": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "enum": [
                              "tag"
                            ]
                          },
                          "resource": {
                            "type": "object",
                            "description": "The deleted tag object."
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "tagName",
          "color"
        ]
      },
      "fileSystemCreate": {
        "name": "fileSystemCreate",
        "title": "fileSystemCreate",
        "summary": "Fired when items are created at a file system path (folder created, single uploaded asset activated, or items copied into a public release).",
        "description": "Signals clients to refresh the destination path. The changes object is usually absent; it is populated only for the single-asset activation (create asset) and public release (update public) cases.\n\nPayload for the fileSystemCreate event.\n\nDelivered as the `notification` socket event with `type` set to `fileSystemCreate`.",
        "payload": {
          "description": "Signals clients to refresh the destination path. The changes object is usually absent; it is populated only for the single-asset activation (create asset) and public release (update public) cases.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "itemsCount": {
                      "type": "integer",
                      "description": "Number of items created."
                    },
                    "destinationPath": {
                      "type": "string",
                      "description": "File system path where items were created (e.g. 'project/{projectId}/creator/{basePath}')."
                    }
                  },
                  "required": [
                    "itemsCount",
                    "destinationPath"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "description": "Optional. Present only in some code paths (see description).",
                  "properties": {
                    "create": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "enum": [
                              "asset"
                            ]
                          },
                          "resource": {
                            "type": "object",
                            "description": "The activated asset (upload completion path)."
                          }
                        }
                      }
                    },
                    "update": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "enum": [
                              "public"
                            ]
                          },
                          "resource": {
                            "type": "object",
                            "description": "The public release record with recalculated inventory (add-items-to-release path)."
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "itemsCount",
          "destinationPath"
        ]
      },
      "fileSystemMove": {
        "name": "fileSystemMove",
        "title": "fileSystemMove",
        "summary": "Fired when items are moved to a new file system path.",
        "description": "Fired when items are moved to a new file system path.\n\nPayload for the fileSystemMove event.\n\nDelivered as the `notification` socket event with `type` set to `fileSystemMove`.",
        "payload": {
          "description": "Fired when items are moved to a new file system path.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "itemsCount": {
                      "type": "integer",
                      "description": "Number of items moved."
                    },
                    "itemPaths": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      },
                      "description": "Original file system paths of the moved items."
                    },
                    "destinationPath": {
                      "type": "string",
                      "description": "Destination file system path where items were moved."
                    }
                  },
                  "required": [
                    "itemsCount",
                    "itemPaths",
                    "destinationPath"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "description": "Not populated for this event (the notification is created without a changes object)."
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "itemsCount",
          "itemPaths",
          "destinationPath"
        ]
      },
      "fileSystemCopy": {
        "name": "fileSystemCopy",
        "title": "fileSystemCopy",
        "summary": "Fired when items are copied to a new file system path.",
        "description": "Fired when items are copied to a new file system path.\n\nPayload for the fileSystemCopy event.\n\nDelivered as the `notification` socket event with `type` set to `fileSystemCopy`.",
        "payload": {
          "description": "Fired when items are copied to a new file system path.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "itemsCount": {
                      "type": "integer",
                      "description": "Number of items copied."
                    },
                    "itemPaths": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      },
                      "description": "Original file system paths of the copied items."
                    },
                    "destinationPath": {
                      "type": "string",
                      "description": "Destination file system path where items were copied."
                    }
                  },
                  "required": [
                    "itemsCount",
                    "itemPaths",
                    "destinationPath"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "description": "Not populated for this event (the notification is created without a changes object)."
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "itemsCount",
          "itemPaths",
          "destinationPath"
        ]
      },
      "fileSystemDelete": {
        "name": "fileSystemDelete",
        "title": "fileSystemDelete",
        "summary": "Fired when items are deleted from file system paths.",
        "description": "Fired when items are deleted from file system paths.\n\nPayload for the fileSystemDelete event.\n\nDelivered as the `notification` socket event with `type` set to `fileSystemDelete`.",
        "payload": {
          "description": "Fired when items are deleted from file system paths.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "itemsCount": {
                      "type": "integer",
                      "description": "Number of items deleted."
                    },
                    "itemPaths": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      },
                      "description": "File system paths of the deleted items."
                    }
                  },
                  "required": [
                    "itemsCount",
                    "itemPaths"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "description": "Not populated for this event (the notification is created without a changes object)."
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "itemsCount",
          "itemPaths"
        ]
      },
      "fileSystemPublish": {
        "name": "fileSystemPublish",
        "title": "fileSystemPublish",
        "summary": "Fired when multiple items are published at a file system path.",
        "description": "Fired when multiple items (assets/folders) are published at a file system path.\n\nPayload for the items published event.\n\nDelivered as the `notification` socket event with `type` set to `fileSystemPublish`.\n\nToken keys marked with (*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations.",
        "payload": {
          "description": "Fired when multiple items (assets/folders) are published at a file system path.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "(*)itemsCount": {
                      "type": "integer",
                      "description": "Number of items published."
                    },
                    "(*)destinationPath": {
                      "type": "string",
                      "description": "File system path where items were published."
                    }
                  },
                  "required": [
                    "itemsCount",
                    "destinationPath"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "update": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "enum": [
                              "asset",
                              "folder"
                            ]
                          },
                          "resource": {
                            "type": "object"
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "itemsCount",
          "destinationPath"
        ]
      },
      "fileSystemUnpublish": {
        "name": "fileSystemUnpublish",
        "title": "fileSystemUnpublish",
        "summary": "Fired when multiple items are unpublished from file system paths.",
        "description": "Fired when multiple items (assets/folders) are unpublished from file system paths.\n\nPayload for the items unpublished event.\n\nDelivered as the `notification` socket event with `type` set to `fileSystemUnpublish`.\n\nToken keys marked with (*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations.",
        "payload": {
          "description": "Fired when multiple items (assets/folders) are unpublished from file system paths.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "(*)itemsCount": {
                      "type": "integer",
                      "description": "Number of items unpublished."
                    },
                    "(*)itemPaths": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      },
                      "description": "File system paths of the unpublished items."
                    }
                  },
                  "required": [
                    "itemsCount",
                    "itemPaths"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "update": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "enum": [
                              "asset",
                              "folder"
                            ]
                          },
                          "resource": {
                            "type": "object"
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "itemsCount",
          "itemPaths"
        ]
      },
      "subscriptionCreate": {
        "name": "subscriptionCreate",
        "title": "subscriptionCreate",
        "summary": "Fired when a new billing subscription is created for a workspace (Stripe webhook). Published on user/{ownerId} and {resourceType}/{resourceId}.",
        "description": "Fired when a new billing subscription is created for a workspace (Stripe webhook). Published on user/{ownerId} and {resourceType}/{resourceId}.\n\nPayload for the subscriptionCreate event.\n\nDelivered as the `notification` socket event with `type` set to `subscriptionCreate`.",
        "payload": {
          "description": "Fired when a new billing subscription is created for a workspace (Stripe webhook). Published on user/{ownerId} and {resourceType}/{resourceId}.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "description": "Always an empty object for this event."
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "create": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "enum": [
                              "subscription"
                            ]
                          },
                          "resource": {
                            "type": "object",
                            "description": "The newly created subscription object."
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": []
      },
      "subscriptionUpdate": {
        "name": "subscriptionUpdate",
        "title": "subscriptionUpdate",
        "summary": "Fired when an existing billing subscription is updated, paused, resumed or deleted (Stripe webhook). Published on user/{ownerId} and {resourceType}/{resourceId}.",
        "description": "Fired when an existing billing subscription is updated, paused, resumed or deleted (Stripe webhook). Published on user/{ownerId} and {resourceType}/{resourceId}.\n\nPayload for the subscriptionUpdate event.\n\nDelivered as the `notification` socket event with `type` set to `subscriptionUpdate`.",
        "payload": {
          "description": "Fired when an existing billing subscription is updated, paused, resumed or deleted (Stripe webhook). Published on user/{ownerId} and {resourceType}/{resourceId}.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "description": "Always an empty object for this event."
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "update": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "enum": [
                              "subscription"
                            ]
                          },
                          "resource": {
                            "type": "object",
                            "description": "The updated subscription object."
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": []
      },
      "projectGroupItemPublish": {
        "name": "projectGroupItemPublish",
        "title": "projectGroupItemPublish",
        "summary": "Grouped notification for items published in a project. Items published by the same user within the grouping window (30 min) are accumulated and re-sent via notificationUpdate.",
        "description": "Grouped notification for items published in a project. Items published by the same user within the grouping window (30 min) are accumulated and re-sent via notificationUpdate.\n\nPayload for the projectGroupItemPublish event.\n\nDelivered as the `notification` socket event with `type` set to `projectGroupItemPublish`.\n\nToken keys marked with (*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations.",
        "payload": {
          "description": "Grouped notification for items published in a project. Items published by the same user within the grouping window (30 min) are accumulated and re-sent via notificationUpdate.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "(*)items": {
                      "type": "array",
                      "items": {
                        "type": "object"
                      },
                      "description": "Deprecated. Published asset/folder objects. Use resources from changes.update."
                    }
                  },
                  "required": [
                    "items"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "update": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "enum": [
                              "asset",
                              "folder"
                            ]
                          },
                          "resource": {
                            "type": "object",
                            "description": "A published item."
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "items"
        ]
      },
      "publicAssetLinkCreate": {
        "name": "publicAssetLinkCreate",
        "title": "publicAssetLinkCreate",
        "summary": "Fired when a public (share) link is created for an asset. Published on project/{projectId}/creator and workspace/{workspaceId}.",
        "description": "Fired when a public (share) link is created for an asset. Published on project/{projectId}/creator and workspace/{workspaceId}.\n\nPayload for the publicAssetLinkCreate event.\n\nDelivered as the `notification` socket event with `type` set to `publicAssetLinkCreate`.\n\nToken keys marked with (*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations.",
        "payload": {
          "description": "Fired when a public (share) link is created for an asset. Published on project/{projectId}/creator and workspace/{workspaceId}.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "assetName": {
                      "type": "string"
                    },
                    "(*)assetId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated. Use resourceId."
                    },
                    "(*)projectId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated."
                    },
                    "projectName": {
                      "type": "string"
                    },
                    "creatorName": {
                      "type": "string",
                      "description": "Display name (or email) of the user who created the link."
                    },
                    "expires": {
                      "type": "string",
                      "format": "date-time",
                      "nullable": true,
                      "description": "Expiry of the link, null when it does not expire."
                    },
                    "deepLink": {
                      "type": "string",
                      "description": "Deep link to the asset in the app."
                    }
                  },
                  "required": [
                    "assetName",
                    "assetId",
                    "projectId",
                    "projectName",
                    "creatorName",
                    "expires",
                    "deepLink"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "create": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "enum": [
                              "publicAssetLink"
                            ]
                          },
                          "resource": {
                            "type": "object",
                            "description": "The created public asset link record."
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "assetName",
          "assetId",
          "projectId",
          "projectName",
          "creatorName",
          "expires",
          "deepLink"
        ]
      },
      "uploadPushSummary": {
        "name": "uploadPushSummary",
        "title": "uploadPushSummary",
        "summary": "Delayed push-notification summary of assets uploaded to a project by one user. Primarily used to send a push notification after scheduledSendAt, but also broadcast on the project visibility channels when created.",
        "description": "Created directly (bypasses template validation) and grouped per creator/project while pushStatus is pending; later uploads are appended to tokens.assets and the timer is reset. Not intended for UI rendering.\n\nPayload for the uploadPushSummary event.\n\nDelivered as the `notification` socket event with `type` set to `uploadPushSummary`.",
        "payload": {
          "description": "Created directly (bypasses template validation) and grouped per creator/project while pushStatus is pending; later uploads are appended to tokens.assets and the timer is reset. Not intended for UI rendering.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "creatorId": {
                      "type": "string",
                      "description": "ID of the uploader."
                    },
                    "creator": {
                      "type": "object",
                      "description": "Public user snapshot of the uploader (present in the payload although not part of the template)."
                    },
                    "projectId": {
                      "type": "string"
                    },
                    "projectName": {
                      "type": "string"
                    },
                    "assets": {
                      "type": "array",
                      "items": {
                        "type": "object"
                      },
                      "description": "Minimal asset summaries: { _id, mediaType, name }."
                    }
                  },
                  "required": [
                    "creatorId",
                    "projectId",
                    "projectName",
                    "assets"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "description": "Not populated for this event (the notification is created without a changes object)."
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "creatorId",
          "projectId",
          "projectName",
          "assets"
        ]
      },
      "publishPushSummary": {
        "name": "publishPushSummary",
        "title": "publishPushSummary",
        "summary": "Push-notification summary of items published to reviewers. Used to send a push notification; broadcast on project/{projectId}/reviewer.",
        "description": "Created directly (bypasses template validation). Not intended for UI rendering.\n\nPayload for the publishPushSummary event.\n\nDelivered as the `notification` socket event with `type` set to `publishPushSummary`.",
        "payload": {
          "description": "Created directly (bypasses template validation). Not intended for UI rendering.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "publisherId": {
                      "type": "string"
                    },
                    "projectId": {
                      "type": "string"
                    },
                    "projectName": {
                      "type": "string"
                    },
                    "items": {
                      "type": "array",
                      "items": {
                        "type": "object"
                      },
                      "description": "Minimal item summaries: { _id, mediaType (null for folders), name }."
                    }
                  },
                  "required": [
                    "publisherId",
                    "projectId",
                    "projectName",
                    "items"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "description": "Not populated for this event (the notification is created without a changes object)."
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "publisherId",
          "projectId",
          "projectName",
          "items"
        ]
      },
      "submissionPushSummary": {
        "name": "submissionPushSummary",
        "title": "submissionPushSummary",
        "summary": "Push-notification summary for a newly created submission. Used to send a push notification; broadcast on project/{projectId}.",
        "description": "Created directly (bypasses template validation). Not intended for UI rendering.\n\nPayload for the submissionPushSummary event.\n\nDelivered as the `notification` socket event with `type` set to `submissionPushSummary`.",
        "payload": {
          "description": "Created directly (bypasses template validation). Not intended for UI rendering.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "publisherId": {
                      "type": "string"
                    },
                    "projectId": {
                      "type": "string"
                    },
                    "projectName": {
                      "type": "string"
                    },
                    "submissionId": {
                      "type": "string"
                    },
                    "submissionSubject": {
                      "type": "string"
                    },
                    "description": {
                      "type": "string",
                      "description": "Submission description (empty string when none)."
                    }
                  },
                  "required": [
                    "publisherId",
                    "projectId",
                    "projectName",
                    "submissionId",
                    "submissionSubject",
                    "description"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "description": "Not populated for this event (the notification is created without a changes object)."
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "publisherId",
          "projectId",
          "projectName",
          "submissionId",
          "submissionSubject",
          "description"
        ]
      },
      "memberJoinPush": {
        "name": "memberJoinPush",
        "title": "memberJoinPush",
        "summary": "Push-notification record created when a user joins a workspace or project. Used to send a push notification; broadcast on {resourceType}/{resourceId}.",
        "description": "Created directly (bypasses template validation). Not intended for UI rendering.\n\nPayload for the memberJoinPush event.\n\nDelivered as the `notification` socket event with `type` set to `memberJoinPush`.",
        "payload": {
          "description": "Created directly (bypasses template validation). Not intended for UI rendering.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "userId": {
                      "type": "string",
                      "description": "The user who joined."
                    },
                    "resourceId": {
                      "type": "string"
                    },
                    "resourceType": {
                      "type": "string",
                      "enum": [
                        "workspace",
                        "project"
                      ]
                    },
                    "resourceName": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "userId",
                    "resourceId",
                    "resourceType",
                    "resourceName"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "description": "Not populated for this event (the notification is created without a changes object)."
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "userId",
          "resourceId",
          "resourceType",
          "resourceName"
        ]
      },
      "chatMemberArchive": {
        "name": "chatMemberArchive",
        "title": "chatMemberArchive",
        "summary": "Fired when the requesting user archives a member chat for themselves. Published on user/{userId} only.",
        "description": "Fired when the requesting user archives a member chat for themselves. Published on user/{userId} only.\n\nPayload for the chatMemberArchive event.\n\nDelivered as the `notification` socket event with `type` set to `chatMemberArchive`.\n\nToken keys marked with (*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations.",
        "payload": {
          "description": "Fired when the requesting user archives a member chat for themselves. Published on user/{userId} only.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "(*)chatId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated. Use resourceId."
                    }
                  },
                  "required": [
                    "chatId"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "update": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "enum": [
                              "chatMember"
                            ]
                          },
                          "resource": {
                            "type": "object",
                            "description": "The member chat (with the archive state for the user)."
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "chatId"
        ]
      },
      "chatMemberUnarchive": {
        "name": "chatMemberUnarchive",
        "title": "chatMemberUnarchive",
        "summary": "Fired when the requesting user un-archives a member chat for themselves. Published on user/{userId} only.",
        "description": "Fired when the requesting user un-archives a member chat for themselves. Published on user/{userId} only.\n\nPayload for the chatMemberUnarchive event.\n\nDelivered as the `notification` socket event with `type` set to `chatMemberUnarchive`.\n\nToken keys marked with (*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations.",
        "payload": {
          "description": "Fired when the requesting user un-archives a member chat for themselves. Published on user/{userId} only.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "(*)chatId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated. Use resourceId."
                    }
                  },
                  "required": [
                    "chatId"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "update": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "enum": [
                              "chatMember"
                            ]
                          },
                          "resource": {
                            "type": "object",
                            "description": "The member chat."
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "chatId"
        ]
      },
      "chatHighlightMessage": {
        "name": "chatHighlightMessage",
        "title": "chatHighlightMessage",
        "summary": "Fired when a message in a project-scoped chat is highlighted. Published on project/{projectId}/{visibility} of the chat.",
        "description": "Fired when a message in a project-scoped chat is highlighted. Published on project/{projectId}/{visibility} of the chat.\n\nPayload for the chatHighlightMessage event.\n\nDelivered as the `notification` socket event with `type` set to `chatHighlightMessage`.\n\nToken keys marked with (*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations.",
        "payload": {
          "description": "Fired when a message in a project-scoped chat is highlighted. Published on project/{projectId}/{visibility} of the chat.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "(*)requesterId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated. Use initiatorId."
                    },
                    "(*)requester": {
                      "type": "object",
                      "description": "Deprecated. Use initiator."
                    },
                    "(*)chatId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated."
                    },
                    "(*)messageId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated."
                    },
                    "(*)projectId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated."
                    }
                  },
                  "required": [
                    "requesterId",
                    "requester",
                    "chatId",
                    "messageId",
                    "projectId"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "update": {
                      "type": "array",
                      "items": {
                        "oneOf": [
                          {
                            "type": "object",
                            "properties": {
                              "resourceId": {
                                "type": "string",
                                "format": "uuid"
                              },
                              "resourceType": {
                                "type": "string",
                                "enum": [
                                  "chat"
                                ]
                              },
                              "resource": {
                                "type": "object",
                                "description": "The chat containing the highlighted message."
                              }
                            }
                          },
                          {
                            "type": "object",
                            "properties": {
                              "resourceId": {
                                "type": "string",
                                "format": "uuid"
                              },
                              "resourceType": {
                                "type": "string",
                                "enum": [
                                  "chatMessage"
                                ]
                              },
                              "resource": {
                                "type": "object",
                                "description": "The highlighted message."
                              }
                            }
                          }
                        ]
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "requesterId",
          "requester",
          "chatId",
          "messageId",
          "projectId"
        ]
      },
      "chatFollow": {
        "name": "chatFollow",
        "title": "chatFollow",
        "summary": "Fired when a user follows a chat. Published on the chat channels.",
        "description": "Fired when a user follows a chat. Published on the chat channels.\n\nPayload for the chatFollow event.\n\nDelivered as the `notification` socket event with `type` set to `chatFollow`.",
        "payload": {
          "description": "Fired when a user follows a chat. Published on the chat channels.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "description": "Always an empty object for this event."
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "update": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "enum": [
                              "chat"
                            ]
                          },
                          "resource": {
                            "type": "object",
                            "description": "The chat with updated followers."
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": []
      },
      "chatUnfollow": {
        "name": "chatUnfollow",
        "title": "chatUnfollow",
        "summary": "Fired when a user unfollows a chat. Published on the chat channels.",
        "description": "Fired when a user unfollows a chat. Published on the chat channels.\n\nPayload for the chatUnfollow event.\n\nDelivered as the `notification` socket event with `type` set to `chatUnfollow`.",
        "payload": {
          "description": "Fired when a user unfollows a chat. Published on the chat channels.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "description": "Always an empty object for this event."
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "update": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "enum": [
                              "chat"
                            ]
                          },
                          "resource": {
                            "type": "object",
                            "description": "The chat with updated followers."
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": []
      },
      "userEmailVerify": {
        "name": "userEmailVerify",
        "title": "userEmailVerify",
        "summary": "Fired when a user's email address is verified. Published on user/{userId}.",
        "description": "Fired when a user's email address is verified. Published on user/{userId}.\n\nPayload for the userEmailVerify event.\n\nDelivered as the `notification` socket event with `type` set to `userEmailVerify`.",
        "payload": {
          "description": "Fired when a user's email address is verified. Published on user/{userId}.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "description": "Always an empty object for this event."
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "update": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "enum": [
                              "user"
                            ]
                          },
                          "resource": {
                            "type": "object",
                            "description": "The user object (includes isEmailVerified)."
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": []
      },
      "botCreate": {
        "name": "botCreate",
        "title": "botCreate",
        "summary": "Fired when a bot user is created in a workspace. Published on workspace/{workspaceId}.",
        "description": "Fired when a bot user is created in a workspace. Published on workspace/{workspaceId}.\n\nPayload for the botCreate event.\n\nDelivered as the `notification` socket event with `type` set to `botCreate`.\n\nToken keys marked with (*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations.",
        "payload": {
          "description": "Fired when a bot user is created in a workspace. Published on workspace/{workspaceId}.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "(*)workspaceId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated. Use resourceId."
                    },
                    "(*)bot": {
                      "type": "object",
                      "description": "Deprecated. The bot user object. Use resource from changes.create."
                    }
                  },
                  "required": [
                    "workspaceId",
                    "bot"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "create": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "enum": [
                              "user"
                            ]
                          },
                          "resource": {
                            "type": "object",
                            "description": "The created bot user (accountType bot)."
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "workspaceId",
          "bot"
        ]
      },
      "webhookTest": {
        "name": "webhookTest",
        "title": "webhookTest",
        "summary": "Synthetic event fired when an admin tests a webhook subscription. Published on workspace/{workspaceId}; delivered by the webhook dispatcher as webhook.test.",
        "description": "Synthetic event fired when an admin tests a webhook subscription. Published on workspace/{workspaceId}; delivered by the webhook dispatcher as webhook.test.\n\nPayload for the webhookTest event.\n\nDelivered as the `notification` socket event with `type` set to `webhookTest`.",
        "payload": {
          "description": "Synthetic event fired when an admin tests a webhook subscription. Published on workspace/{workspaceId}; delivered by the webhook dispatcher as webhook.test.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "triggeredById": {
                      "type": "string",
                      "format": "uuid",
                      "description": "User who triggered the test."
                    },
                    "subscriptionId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Webhook subscription being tested (also resourceId; resourceType is webhookSubscription)."
                    },
                    "message": {
                      "type": "string",
                      "description": "Human readable banner message."
                    }
                  },
                  "required": [
                    "triggeredById",
                    "subscriptionId",
                    "message"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "description": "Not populated for this event (the notification is created without a changes object)."
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "triggeredById",
          "subscriptionId",
          "message"
        ]
      },
      "taskFollow": {
        "name": "taskFollow",
        "title": "taskFollow",
        "summary": "Fired when a user follows a task.",
        "description": "Fired when a user follows a task.\n\nPayload for the taskFollow event.\n\nDelivered as the `notification` socket event with `type` set to `taskFollow`.\n\nToken keys marked with (*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations.",
        "payload": {
          "description": "Fired when a user follows a task.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "(*)projectId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated."
                    },
                    "(*)taskId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated. Use resourceId."
                    }
                  },
                  "required": [
                    "projectId",
                    "taskId"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "update": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "enum": [
                              "task"
                            ]
                          },
                          "resource": {
                            "type": "object",
                            "description": "The task with updated followers."
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "projectId",
          "taskId"
        ]
      },
      "taskUnfollow": {
        "name": "taskUnfollow",
        "title": "taskUnfollow",
        "summary": "Fired when a user unfollows a task.",
        "description": "Fired when a user unfollows a task.\n\nPayload for the taskUnfollow event.\n\nDelivered as the `notification` socket event with `type` set to `taskUnfollow`.\n\nToken keys marked with (*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations.",
        "payload": {
          "description": "Fired when a user unfollows a task.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "(*)projectId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated."
                    },
                    "(*)taskId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated. Use resourceId."
                    }
                  },
                  "required": [
                    "projectId",
                    "taskId"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "update": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "enum": [
                              "task"
                            ]
                          },
                          "resource": {
                            "type": "object",
                            "description": "The task with updated followers."
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "projectId",
          "taskId"
        ]
      },
      "submissionUpdate": {
        "name": "submissionUpdate",
        "title": "submissionUpdate",
        "summary": "Fired when an already-released submission is re-released. Published on project/{projectId}, project/{projectId}/creator and project/{projectId}/reviewer.",
        "description": "Fired when an already-released submission is re-released. Published on project/{projectId}, project/{projectId}/creator and project/{projectId}/reviewer.\n\nPayload for the submissionUpdate event.\n\nDelivered as the `notification` socket event with `type` set to `submissionUpdate`.\n\nToken keys marked with (*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations.",
        "payload": {
          "description": "Fired when an already-released submission is re-released. Published on project/{projectId}, project/{projectId}/creator and project/{projectId}/reviewer.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "(*)requesterId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated. Use initiatorId."
                    },
                    "(*)requester": {
                      "type": "object",
                      "description": "Deprecated. Use initiator."
                    },
                    "(*)submission": {
                      "type": "object",
                      "description": "Deprecated. The submission (chatSubmission) object. Use resource from changes.update."
                    }
                  },
                  "required": [
                    "requesterId",
                    "requester",
                    "submission"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "update": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "enum": [
                              "chatSubmission"
                            ]
                          },
                          "resource": {
                            "type": "object",
                            "description": "The re-released submission."
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "requesterId",
          "requester",
          "submission"
        ]
      },
      "submissionTag": {
        "name": "submissionTag",
        "title": "submissionTag",
        "summary": "Fired when a tag is added to a submission. resourceType is chatSubmission.",
        "description": "Fired when a tag is added to a submission. resourceType is chatSubmission.\n\nPayload for the submissionTag event.\n\nDelivered as the `notification` socket event with `type` set to `submissionTag`.",
        "payload": {
          "description": "Fired when a tag is added to a submission. resourceType is chatSubmission.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "subject": {
                      "type": "string",
                      "description": "Submission subject ('Submission' when empty)."
                    },
                    "tagName": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "subject",
                    "tagName"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "description": "Not populated for this event (the notification is created without a changes object)."
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "subject",
          "tagName"
        ]
      },
      "submissionUntag": {
        "name": "submissionUntag",
        "title": "submissionUntag",
        "summary": "Fired when a tag is removed from a submission. resourceType is chatSubmission.",
        "description": "Fired when a tag is removed from a submission. resourceType is chatSubmission.\n\nPayload for the submissionUntag event.\n\nDelivered as the `notification` socket event with `type` set to `submissionUntag`.",
        "payload": {
          "description": "Fired when a tag is removed from a submission. resourceType is chatSubmission.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "subject": {
                      "type": "string",
                      "description": "Submission subject ('Submission' when empty)."
                    },
                    "tagName": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "subject",
                    "tagName"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "description": "Not populated for this event (the notification is created without a changes object)."
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "subject",
          "tagName"
        ]
      },
      "aiChatTopicCreate": {
        "name": "aiChatTopicCreate",
        "title": "aiChatTopicCreate",
        "summary": "Fired when an AI chat topic is created. Published on user/{userId} of the topic owner.",
        "description": "Fired when an AI chat topic is created. Published on user/{userId} of the topic owner.\n\nPayload for the aiChatTopicCreate event.\n\nDelivered as the `notification` socket event with `type` set to `aiChatTopicCreate`.\n\nToken keys marked with (*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations.",
        "payload": {
          "description": "Fired when an AI chat topic is created. Published on user/{userId} of the topic owner.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "(*)userId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated."
                    },
                    "(*)topic": {
                      "type": "object",
                      "description": "Deprecated. The AI chat topic. Use resource from changes.create."
                    }
                  },
                  "required": [
                    "userId",
                    "topic"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "create": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "enum": [
                              "aiChatTopic"
                            ]
                          },
                          "resource": {
                            "type": "object",
                            "description": "The created topic."
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "userId",
          "topic"
        ]
      },
      "aiChatTopicUpdate": {
        "name": "aiChatTopicUpdate",
        "title": "aiChatTopicUpdate",
        "summary": "Fired when an AI chat topic is updated (title, archive state, context items, last message preview) or deleted. Published on user/{userId} of the topic owner.",
        "description": "Fired when an AI chat topic is updated (title, archive state, context items, last message preview) or deleted. Published on user/{userId} of the topic owner.\n\nPayload for the aiChatTopicUpdate event.\n\nDelivered as the `notification` socket event with `type` set to `aiChatTopicUpdate`.\n\nToken keys marked with (*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations.",
        "payload": {
          "description": "Fired when an AI chat topic is updated (title, archive state, context items, last message preview) or deleted. Published on user/{userId} of the topic owner.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "(*)userId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated."
                    },
                    "(*)topic": {
                      "type": "object",
                      "description": "Deprecated. The AI chat topic (status pendingDelete when deleted)."
                    }
                  },
                  "required": [
                    "userId",
                    "topic"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "description": "changes.update on updates; changes.delete (no resource) when the topic is deleted.",
                  "properties": {
                    "update": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "enum": [
                              "aiChatTopic"
                            ]
                          },
                          "resource": {
                            "type": "object",
                            "description": "The updated topic."
                          }
                        }
                      }
                    },
                    "delete": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "enum": [
                              "aiChatTopic"
                            ]
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "userId",
          "topic"
        ]
      },
      "aiChatMessageCreate": {
        "name": "aiChatMessageCreate",
        "title": "aiChatMessageCreate",
        "summary": "Fired when the AI assistant posts a message in an AI chat topic. Published on user/{userId} of the topic owner.",
        "description": "Fired when the AI assistant posts a message in an AI chat topic. Published on user/{userId} of the topic owner.\n\nPayload for the aiChatMessageCreate event.\n\nDelivered as the `notification` socket event with `type` set to `aiChatMessageCreate`.\n\nToken keys marked with (*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations.",
        "payload": {
          "description": "Fired when the AI assistant posts a message in an AI chat topic. Published on user/{userId} of the topic owner.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "(*)userId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated."
                    },
                    "(*)topicId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated."
                    },
                    "(*)message": {
                      "type": "object",
                      "description": "Deprecated. The assistant message. Use resource from changes.create."
                    }
                  },
                  "required": [
                    "userId",
                    "topicId",
                    "message"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "create": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "enum": [
                              "aiChatMessage"
                            ]
                          },
                          "resource": {
                            "type": "object",
                            "description": "The created assistant message."
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "userId",
          "topicId",
          "message"
        ]
      },
      "publicFileSystemCreate": {
        "name": "publicFileSystemCreate",
        "title": "publicFileSystemCreate",
        "summary": "Fired when a public release (public file system) is created. Published on project/{projectId}/creator.",
        "description": "Fired when a public release (public file system) is created. Published on project/{projectId}/creator.\n\nPayload for the publicFileSystemCreate event.\n\nDelivered as the `notification` socket event with `type` set to `publicFileSystemCreate`.",
        "payload": {
          "description": "Fired when a public release (public file system) is created. Published on project/{projectId}/creator.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "title": {
                      "type": "string"
                    },
                    "inventory": {
                      "type": "object",
                      "description": "Inventory summary of the items in the release."
                    }
                  },
                  "required": [
                    "title",
                    "inventory"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "create": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "enum": [
                              "public"
                            ]
                          },
                          "resource": {
                            "type": "object",
                            "description": "The public release record."
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "title",
          "inventory"
        ]
      },
      "publicFileSystemUpdate": {
        "name": "publicFileSystemUpdate",
        "title": "publicFileSystemUpdate",
        "summary": "Fired when a public release is updated (title, description, validity, options). Published on project/{projectId}/creator.",
        "description": "Fired when a public release is updated (title, description, validity, options). Published on project/{projectId}/creator.\n\nPayload for the publicFileSystemUpdate event.\n\nDelivered as the `notification` socket event with `type` set to `publicFileSystemUpdate`.",
        "payload": {
          "description": "Fired when a public release is updated (title, description, validity, options). Published on project/{projectId}/creator.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "title": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "title"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "update": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "enum": [
                              "public"
                            ]
                          },
                          "resource": {
                            "type": "object",
                            "description": "The updated public release record."
                          },
                          "oldResource": {
                            "type": "object",
                            "description": "The record before the update."
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "title"
        ]
      },
      "publicFileSystemDelete": {
        "name": "publicFileSystemDelete",
        "title": "publicFileSystemDelete",
        "summary": "Fired when a public release is deleted. Published on project/{projectId}/creator.",
        "description": "Fired when a public release is deleted. Published on project/{projectId}/creator.\n\nPayload for the publicFileSystemDelete event.\n\nDelivered as the `notification` socket event with `type` set to `publicFileSystemDelete`.",
        "payload": {
          "description": "Fired when a public release is deleted. Published on project/{projectId}/creator.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "title": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "title"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "delete": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "enum": [
                              "public"
                            ]
                          },
                          "resource": {
                            "type": "object",
                            "description": "The deleted public release record."
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "title"
        ]
      },
      "settingsUpdate": {
        "name": "settingsUpdate",
        "title": "settingsUpdate",
        "summary": "Fired when a user's settings for a resource are updated or reset. Published on user/{userId} only.",
        "description": "Fired when a user's settings for a resource are updated or reset. Published on user/{userId} only.\n\nPayload for the settingsUpdate event.\n\nDelivered as the `notification` socket event with `type` set to `settingsUpdate`.",
        "payload": {
          "description": "Fired when a user's settings for a resource are updated or reset. Published on user/{userId} only.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "resourceType": {
                      "type": "string",
                      "description": "Type of the resource the settings apply to."
                    },
                    "resourceId": {
                      "type": "string"
                    },
                    "settings": {
                      "type": "object",
                      "description": "The updated settings (empty object on reset)."
                    }
                  },
                  "required": [
                    "resourceType",
                    "resourceId",
                    "settings"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "description": "changes.update on update, changes.delete on reset. resourceId of the entry is the user ID.",
                  "properties": {
                    "update": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "enum": [
                              "settings"
                            ]
                          },
                          "resource": {
                            "type": "object",
                            "description": "The updated settings object."
                          }
                        }
                      }
                    },
                    "delete": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "enum": [
                              "settings"
                            ]
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "resourceType",
          "resourceId",
          "settings"
        ]
      },
      "convoStart": {
        "name": "convoStart",
        "title": "convoStart",
        "summary": "Fired when a convo (call) is started in a chat. Published on the chat channels and user/{userId} of the starter.",
        "description": "Fired when a convo (call) is started in a chat. Published on the chat channels and user/{userId} of the starter.\n\nPayload for the convoStart event.\n\nDelivered as the `notification` socket event with `type` set to `convoStart`.\n\nToken keys marked with (*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations.",
        "payload": {
          "description": "Fired when a convo (call) is started in a chat. Published on the chat channels and user/{userId} of the starter.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "(*)convoId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated."
                    },
                    "(*)chatId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated."
                    },
                    "chatType": {
                      "type": "string",
                      "enum": [
                        "chat",
                        "chatMember",
                        "chatSubmission"
                      ]
                    },
                    "convoType": {
                      "type": "string"
                    },
                    "(*)userId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated."
                    },
                    "userName": {
                      "type": "string"
                    },
                    "roomUrl": {
                      "type": "string",
                      "description": "URL of the call room."
                    }
                  },
                  "required": [
                    "convoId",
                    "chatId",
                    "chatType",
                    "convoType",
                    "userId",
                    "userName",
                    "roomUrl"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "create": {
                      "type": "array",
                      "items": {
                        "oneOf": [
                          {
                            "type": "object",
                            "properties": {
                              "resourceId": {
                                "type": "string",
                                "format": "uuid"
                              },
                              "resourceType": {
                                "type": "string",
                                "enum": [
                                  "convo"
                                ]
                              },
                              "resource": {
                                "type": "object",
                                "description": "The started convo."
                              }
                            }
                          },
                          {
                            "type": "object",
                            "properties": {
                              "resourceId": {
                                "type": "string",
                                "format": "uuid"
                              },
                              "resourceType": {
                                "type": "string",
                                "enum": [
                                  "chatMessage"
                                ]
                              },
                              "resource": {
                                "type": "object",
                                "description": "The system message posted to the chat."
                              }
                            }
                          }
                        ]
                      }
                    },
                    "update": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "enum": [
                              "chat",
                              "chatMember",
                              "chatSubmission"
                            ]
                          },
                          "resource": {
                            "type": "object",
                            "description": "The chat the convo belongs to."
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "convoId",
          "chatId",
          "chatType",
          "convoType",
          "userId",
          "userName",
          "roomUrl"
        ]
      },
      "convoJoin": {
        "name": "convoJoin",
        "title": "convoJoin",
        "summary": "Fired when a user joins a convo.",
        "description": "Fired when a user joins a convo.\n\nPayload for the convoJoin event.\n\nDelivered as the `notification` socket event with `type` set to `convoJoin`.\n\nToken keys marked with (*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations.",
        "payload": {
          "description": "Fired when a user joins a convo.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "(*)convoId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated."
                    },
                    "(*)userId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated."
                    },
                    "userName": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "convoId",
                    "userId",
                    "userName"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "update": {
                      "type": "array",
                      "items": {
                        "oneOf": [
                          {
                            "type": "object",
                            "properties": {
                              "resourceId": {
                                "type": "string",
                                "format": "uuid"
                              },
                              "resourceType": {
                                "type": "string",
                                "enum": [
                                  "convo"
                                ]
                              },
                              "resource": {
                                "type": "object",
                                "description": "The convo."
                              }
                            }
                          },
                          {
                            "type": "object",
                            "properties": {
                              "resourceId": {
                                "type": "string",
                                "format": "uuid"
                              },
                              "resourceType": {
                                "type": "string",
                                "enum": [
                                  "chat",
                                  "chatMember",
                                  "chatSubmission"
                                ]
                              },
                              "resource": {
                                "type": "object",
                                "description": "The chat the convo belongs to (resourceType is the chat model name)."
                              }
                            }
                          },
                          {
                            "type": "object",
                            "properties": {
                              "resourceId": {
                                "type": "string",
                                "format": "uuid"
                              },
                              "resourceType": {
                                "type": "string",
                                "enum": [
                                  "chatMessage"
                                ]
                              },
                              "resource": {
                                "type": "object",
                                "description": "The system message posted to the chat for this event."
                              }
                            }
                          }
                        ]
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "convoId",
          "userId",
          "userName"
        ]
      },
      "convoLeave": {
        "name": "convoLeave",
        "title": "convoLeave",
        "summary": "Fired when a user leaves a convo.",
        "description": "Fired when a user leaves a convo.\n\nPayload for the convoLeave event.\n\nDelivered as the `notification` socket event with `type` set to `convoLeave`.\n\nToken keys marked with (*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations.",
        "payload": {
          "description": "Fired when a user leaves a convo.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "(*)convoId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated."
                    },
                    "(*)userId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated."
                    },
                    "userName": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "convoId",
                    "userId",
                    "userName"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "update": {
                      "type": "array",
                      "items": {
                        "oneOf": [
                          {
                            "type": "object",
                            "properties": {
                              "resourceId": {
                                "type": "string",
                                "format": "uuid"
                              },
                              "resourceType": {
                                "type": "string",
                                "enum": [
                                  "convo"
                                ]
                              },
                              "resource": {
                                "type": "object",
                                "description": "The convo."
                              }
                            }
                          },
                          {
                            "type": "object",
                            "properties": {
                              "resourceId": {
                                "type": "string",
                                "format": "uuid"
                              },
                              "resourceType": {
                                "type": "string",
                                "enum": [
                                  "chat",
                                  "chatMember",
                                  "chatSubmission"
                                ]
                              },
                              "resource": {
                                "type": "object",
                                "description": "The chat the convo belongs to (resourceType is the chat model name)."
                              }
                            }
                          },
                          {
                            "type": "object",
                            "properties": {
                              "resourceId": {
                                "type": "string",
                                "format": "uuid"
                              },
                              "resourceType": {
                                "type": "string",
                                "enum": [
                                  "chatMessage"
                                ]
                              },
                              "resource": {
                                "type": "object",
                                "description": "The system message posted to the chat for this event."
                              }
                            }
                          }
                        ]
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "convoId",
          "userId",
          "userName"
        ]
      },
      "convoComplete": {
        "name": "convoComplete",
        "title": "convoComplete",
        "summary": "Fired when a convo is completed (ended by a user or when the last participant leaves).",
        "description": "Fired when a convo is completed (ended by a user or when the last participant leaves).\n\nPayload for the convoComplete event.\n\nDelivered as the `notification` socket event with `type` set to `convoComplete`.\n\nToken keys marked with (*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations.",
        "payload": {
          "description": "Fired when a convo is completed (ended by a user or when the last participant leaves).",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "(*)convoId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated."
                    },
                    "(*)chatId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated."
                    },
                    "(*)userId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated."
                    },
                    "userName": {
                      "type": "string"
                    },
                    "durationMinutes": {
                      "type": "number"
                    },
                    "participantNames": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    }
                  },
                  "required": [
                    "convoId",
                    "chatId",
                    "userId",
                    "userName",
                    "durationMinutes",
                    "participantNames"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "update": {
                      "type": "array",
                      "items": {
                        "oneOf": [
                          {
                            "type": "object",
                            "properties": {
                              "resourceId": {
                                "type": "string",
                                "format": "uuid"
                              },
                              "resourceType": {
                                "type": "string",
                                "enum": [
                                  "convo"
                                ]
                              },
                              "resource": {
                                "type": "object",
                                "description": "The convo."
                              }
                            }
                          },
                          {
                            "type": "object",
                            "properties": {
                              "resourceId": {
                                "type": "string",
                                "format": "uuid"
                              },
                              "resourceType": {
                                "type": "string",
                                "enum": [
                                  "chat",
                                  "chatMember",
                                  "chatSubmission"
                                ]
                              },
                              "resource": {
                                "type": "object",
                                "description": "The chat the convo belongs to (resourceType is the chat model name)."
                              }
                            }
                          },
                          {
                            "type": "object",
                            "properties": {
                              "resourceId": {
                                "type": "string",
                                "format": "uuid"
                              },
                              "resourceType": {
                                "type": "string",
                                "enum": [
                                  "chatMessage"
                                ]
                              },
                              "resource": {
                                "type": "object",
                                "description": "The system message posted to the chat for this event."
                              }
                            }
                          }
                        ]
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "convoId",
          "chatId",
          "userId",
          "userName",
          "durationMinutes",
          "participantNames"
        ]
      },
      "convoUpdate": {
        "name": "convoUpdate",
        "title": "convoUpdate",
        "summary": "Fired when a convo is updated (subject / notes).",
        "description": "Fired when a convo is updated (subject / notes).\n\nPayload for the convoUpdate event.\n\nDelivered as the `notification` socket event with `type` set to `convoUpdate`.\n\nToken keys marked with (*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations.",
        "payload": {
          "description": "Fired when a convo is updated (subject / notes).",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "(*)convoId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated."
                    },
                    "(*)chatId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated."
                    },
                    "chatType": {
                      "type": "string",
                      "enum": [
                        "chat",
                        "chatMember",
                        "chatSubmission"
                      ]
                    },
                    "(*)userId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated."
                    },
                    "userName": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "convoId",
                    "chatId",
                    "chatType",
                    "userId",
                    "userName"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "update": {
                      "type": "array",
                      "items": {
                        "oneOf": [
                          {
                            "type": "object",
                            "properties": {
                              "resourceId": {
                                "type": "string",
                                "format": "uuid"
                              },
                              "resourceType": {
                                "type": "string",
                                "enum": [
                                  "convo"
                                ]
                              },
                              "resource": {
                                "type": "object",
                                "description": "The convo."
                              }
                            }
                          },
                          {
                            "type": "object",
                            "properties": {
                              "resourceId": {
                                "type": "string",
                                "format": "uuid"
                              },
                              "resourceType": {
                                "type": "string",
                                "enum": [
                                  "chat",
                                  "chatMember",
                                  "chatSubmission"
                                ]
                              },
                              "resource": {
                                "type": "object",
                                "description": "The chat the convo belongs to (resourceType is the chat model name)."
                              }
                            }
                          },
                          {
                            "type": "object",
                            "properties": {
                              "resourceId": {
                                "type": "string",
                                "format": "uuid"
                              },
                              "resourceType": {
                                "type": "string",
                                "enum": [
                                  "chatMessage"
                                ]
                              },
                              "resource": {
                                "type": "object",
                                "description": "The system message posted to the chat for this event."
                              }
                            }
                          }
                        ]
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "convoId",
          "chatId",
          "chatType",
          "userId",
          "userName"
        ]
      },
      "convoDelete": {
        "name": "convoDelete",
        "title": "convoDelete",
        "summary": "Fired when a convo is deleted.",
        "description": "Fired when a convo is deleted.\n\nPayload for the convoDelete event.\n\nDelivered as the `notification` socket event with `type` set to `convoDelete`.\n\nToken keys marked with (*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations.",
        "payload": {
          "description": "Fired when a convo is deleted.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "(*)convoId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated."
                    },
                    "(*)chatId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated."
                    },
                    "chatType": {
                      "type": "string",
                      "enum": [
                        "chat",
                        "chatMember",
                        "chatSubmission"
                      ]
                    },
                    "(*)userId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated."
                    },
                    "userName": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "convoId",
                    "chatId",
                    "chatType",
                    "userId",
                    "userName"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "update": {
                      "type": "array",
                      "items": {
                        "oneOf": [
                          {
                            "type": "object",
                            "properties": {
                              "resourceId": {
                                "type": "string",
                                "format": "uuid"
                              },
                              "resourceType": {
                                "type": "string",
                                "enum": [
                                  "chat",
                                  "chatMember",
                                  "chatSubmission"
                                ]
                              },
                              "resource": {
                                "type": "object",
                                "description": "The chat the convo belonged to."
                              }
                            }
                          },
                          {
                            "type": "object",
                            "properties": {
                              "resourceId": {
                                "type": "string",
                                "format": "uuid"
                              },
                              "resourceType": {
                                "type": "string",
                                "enum": [
                                  "chatMessage"
                                ]
                              },
                              "resource": {
                                "type": "object",
                                "description": "The system message posted to the chat."
                              }
                            }
                          }
                        ]
                      }
                    },
                    "delete": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "enum": [
                              "convo"
                            ]
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "convoId",
          "chatId",
          "chatType",
          "userId",
          "userName"
        ]
      },
      "convoParticipantJoined": {
        "name": "convoParticipantJoined",
        "title": "convoParticipantJoined",
        "summary": "Fired (from the call-provider webhook) when a participant actually joins the call room.",
        "description": "Fired (from the call-provider webhook) when a participant actually joins the call room.\n\nPayload for the convoParticipantJoined event.\n\nDelivered as the `notification` socket event with `type` set to `convoParticipantJoined`.\n\nToken keys marked with (*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations.",
        "payload": {
          "description": "Fired (from the call-provider webhook) when a participant actually joins the call room.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "userName": {
                      "type": "string"
                    },
                    "convoType": {
                      "type": "string"
                    },
                    "(*)chatId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated."
                    }
                  },
                  "required": [
                    "userName",
                    "convoType",
                    "chatId"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "update": {
                      "type": "array",
                      "items": {
                        "oneOf": [
                          {
                            "type": "object",
                            "properties": {
                              "resourceId": {
                                "type": "string",
                                "format": "uuid"
                              },
                              "resourceType": {
                                "type": "string",
                                "enum": [
                                  "convo"
                                ]
                              },
                              "resource": {
                                "type": "object",
                                "description": "The convo with updated participants."
                              }
                            }
                          },
                          {
                            "type": "object",
                            "properties": {
                              "resourceId": {
                                "type": "string",
                                "format": "uuid"
                              },
                              "resourceType": {
                                "type": "string",
                                "enum": [
                                  "chat",
                                  "chatMember",
                                  "chatSubmission"
                                ]
                              },
                              "resource": {
                                "type": "object",
                                "description": "The chat the convo belongs to."
                              }
                            }
                          }
                        ]
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "userName",
          "convoType",
          "chatId"
        ]
      },
      "convoParticipantLeft": {
        "name": "convoParticipantLeft",
        "title": "convoParticipantLeft",
        "summary": "Fired (from the call-provider webhook) when a participant leaves the call room.",
        "description": "Fired (from the call-provider webhook) when a participant leaves the call room.\n\nPayload for the convoParticipantLeft event.\n\nDelivered as the `notification` socket event with `type` set to `convoParticipantLeft`.\n\nToken keys marked with (*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations.",
        "payload": {
          "description": "Fired (from the call-provider webhook) when a participant leaves the call room.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "userName": {
                      "type": "string"
                    },
                    "convoType": {
                      "type": "string"
                    },
                    "(*)chatId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated."
                    }
                  },
                  "required": [
                    "userName",
                    "convoType",
                    "chatId"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "update": {
                      "type": "array",
                      "items": {
                        "oneOf": [
                          {
                            "type": "object",
                            "properties": {
                              "resourceId": {
                                "type": "string",
                                "format": "uuid"
                              },
                              "resourceType": {
                                "type": "string",
                                "enum": [
                                  "convo"
                                ]
                              },
                              "resource": {
                                "type": "object",
                                "description": "The convo with updated participants."
                              }
                            }
                          },
                          {
                            "type": "object",
                            "properties": {
                              "resourceId": {
                                "type": "string",
                                "format": "uuid"
                              },
                              "resourceType": {
                                "type": "string",
                                "enum": [
                                  "chat",
                                  "chatMember",
                                  "chatSubmission"
                                ]
                              },
                              "resource": {
                                "type": "object",
                                "description": "The chat the convo belongs to."
                              }
                            }
                          }
                        ]
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "userName",
          "convoType",
          "chatId"
        ]
      },
      "convoHandover": {
        "name": "convoHandover",
        "title": "convoHandover",
        "summary": "Fired on user/{userId} when the user joins a convo from a second device, so the previous device can leave the call.",
        "description": "Fired on user/{userId} when the user joins a convo from a second device, so the previous device can leave the call.\n\nPayload for the convoHandover event.\n\nDelivered as the `notification` socket event with `type` set to `convoHandover`.\n\nToken keys marked with (*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations.",
        "payload": {
          "description": "Fired on user/{userId} when the user joins a convo from a second device, so the previous device can leave the call.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "(*)convoId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated. Use resourceId."
                    },
                    "(*)userId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated. Use initiatorId."
                    }
                  },
                  "required": [
                    "convoId",
                    "userId"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "description": "Not populated for this event (the notification is created without a changes object)."
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "convoId",
          "userId"
        ]
      },
      "boardCreate": {
        "name": "boardCreate",
        "title": "boardCreate",
        "summary": "Fired when a kanban board is created. Published on the project visibility channels of the board.",
        "description": "Fired when a kanban board is created. Published on the project visibility channels of the board.\n\nPayload for the boardCreate event.\n\nDelivered as the `notification` socket event with `type` set to `boardCreate`.\n\nToken keys marked with (*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations.",
        "payload": {
          "description": "Fired when a kanban board is created. Published on the project visibility channels of the board.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "(*)projectId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated."
                    },
                    "boardName": {
                      "type": "string"
                    },
                    "(*)board": {
                      "type": "object",
                      "description": "Deprecated. Use resource from changes.create."
                    }
                  },
                  "required": [
                    "projectId",
                    "boardName",
                    "board"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "create": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "enum": [
                              "board"
                            ]
                          },
                          "resource": {
                            "type": "object",
                            "description": "The created board."
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "projectId",
          "boardName",
          "board"
        ]
      },
      "boardUpdate": {
        "name": "boardUpdate",
        "title": "boardUpdate",
        "summary": "Fired when a kanban board is updated (name, visibility, options).",
        "description": "Fired when a kanban board is updated (name, visibility, options).\n\nPayload for the boardUpdate event.\n\nDelivered as the `notification` socket event with `type` set to `boardUpdate`.\n\nToken keys marked with (*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations.",
        "payload": {
          "description": "Fired when a kanban board is updated (name, visibility, options).",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "(*)projectId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated."
                    },
                    "boardName": {
                      "type": "string"
                    },
                    "(*)board": {
                      "type": "object",
                      "description": "Deprecated. Use resource from changes.update."
                    }
                  },
                  "required": [
                    "projectId",
                    "boardName",
                    "board"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "update": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "enum": [
                              "board"
                            ]
                          },
                          "resource": {
                            "type": "object",
                            "description": "The updated board."
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "projectId",
          "boardName",
          "board"
        ]
      },
      "boardDelete": {
        "name": "boardDelete",
        "title": "boardDelete",
        "summary": "Fired when a kanban board is deleted. Cascaded task deletions / reassignments are included in changes.",
        "description": "Fired when a kanban board is deleted. Cascaded task deletions / reassignments are included in changes.\n\nPayload for the boardDelete event.\n\nDelivered as the `notification` socket event with `type` set to `boardDelete`.\n\nToken keys marked with (*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations.",
        "payload": {
          "description": "Fired when a kanban board is deleted. Cascaded task deletions / reassignments are included in changes.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "(*)projectId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated."
                    },
                    "boardName": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "projectId",
                    "boardName"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "description": "changes.delete always contains the board plus one entry per task deleted with it; changes.update (present only when tasks were moved to another board) lists the reassigned tasks without a resource object.",
                  "properties": {
                    "update": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid",
                            "description": "ID of a task reassigned to another board/column."
                          },
                          "resourceType": {
                            "type": "string",
                            "enum": [
                              "task"
                            ]
                          }
                        }
                      }
                    },
                    "delete": {
                      "type": "array",
                      "items": {
                        "oneOf": [
                          {
                            "type": "object",
                            "properties": {
                              "resourceId": {
                                "type": "string",
                                "format": "uuid"
                              },
                              "resourceType": {
                                "type": "string",
                                "enum": [
                                  "board"
                                ]
                              }
                            }
                          },
                          {
                            "type": "object",
                            "properties": {
                              "resourceId": {
                                "type": "string",
                                "format": "uuid",
                                "description": "ID of a task deleted with the board."
                              },
                              "resourceType": {
                                "type": "string",
                                "enum": [
                                  "task"
                                ]
                              }
                            }
                          }
                        ]
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "projectId",
          "boardName"
        ]
      },
      "boardTaskCreate": {
        "name": "boardTaskCreate",
        "title": "boardTaskCreate",
        "summary": "Fired when a task is created on a board (UI, AI tool or bulk create). Also used for push notifications.",
        "description": "Fired when a task is created on a board (UI, AI tool or bulk create). Also used for push notifications.\n\nPayload for the boardTaskCreate event.\n\nDelivered as the `notification` socket event with `type` set to `boardTaskCreate`.\n\nToken keys marked with (*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations.",
        "payload": {
          "description": "Fired when a task is created on a board (UI, AI tool or bulk create). Also used for push notifications.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "(*)projectId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated."
                    },
                    "taskNumber": {
                      "type": "integer"
                    },
                    "taskSubject": {
                      "type": "string"
                    },
                    "boardName": {
                      "type": "string"
                    },
                    "(*)boardId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated."
                    }
                  },
                  "required": [
                    "projectId",
                    "taskNumber",
                    "taskSubject",
                    "boardName",
                    "boardId"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "create": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "enum": [
                              "task"
                            ]
                          },
                          "resource": {
                            "type": "object",
                            "description": "The created task."
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "projectId",
          "taskNumber",
          "taskSubject",
          "boardName",
          "boardId"
        ]
      },
      "boardTaskMove": {
        "name": "boardTaskMove",
        "title": "boardTaskMove",
        "summary": "Fired when a task is moved between columns or boards. Published on the visibility channels of both boards for cross-board moves.",
        "description": "Fired when a task is moved between columns or boards. Published on the visibility channels of both boards for cross-board moves.\n\nPayload for the boardTaskMove event.\n\nDelivered as the `notification` socket event with `type` set to `boardTaskMove`.\n\nToken keys marked with (*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations.",
        "payload": {
          "description": "Fired when a task is moved between columns or boards. Published on the visibility channels of both boards for cross-board moves.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "(*)projectId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated."
                    },
                    "taskNumber": {
                      "type": "integer"
                    },
                    "taskSubject": {
                      "type": "string"
                    },
                    "fromColumnName": {
                      "type": "string"
                    },
                    "toColumnName": {
                      "type": "string"
                    },
                    "boardName": {
                      "type": "string",
                      "description": "Destination board name."
                    },
                    "(*)boardId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated. Destination board ID."
                    },
                    "fromBoardName": {
                      "type": "string",
                      "nullable": true,
                      "description": "Source board name for cross-board moves, null for same-board moves."
                    },
                    "fromBoardId": {
                      "type": "string",
                      "format": "uuid",
                      "nullable": true,
                      "description": "Source board ID for cross-board moves, null for same-board moves."
                    }
                  },
                  "required": [
                    "projectId",
                    "taskNumber",
                    "taskSubject",
                    "fromColumnName",
                    "toColumnName",
                    "boardName",
                    "boardId",
                    "fromBoardName",
                    "fromBoardId"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "update": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "enum": [
                              "task"
                            ]
                          },
                          "resource": {
                            "type": "object",
                            "description": "The moved task."
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "projectId",
          "taskNumber",
          "taskSubject",
          "fromColumnName",
          "toColumnName",
          "boardName",
          "boardId",
          "fromBoardName",
          "fromBoardId"
        ]
      },
      "boardTaskAssign": {
        "name": "boardTaskAssign",
        "title": "boardTaskAssign",
        "summary": "Fired when a task is assigned or unassigned. Published on the board visibility channels and user/{assignedToId}.",
        "description": "Fired when a task is assigned or unassigned. Published on the board visibility channels and user/{assignedToId}.\n\nPayload for the boardTaskAssign event.\n\nDelivered as the `notification` socket event with `type` set to `boardTaskAssign`.\n\nToken keys marked with (*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations.",
        "payload": {
          "description": "Fired when a task is assigned or unassigned. Published on the board visibility channels and user/{assignedToId}.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "(*)projectId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated."
                    },
                    "taskNumber": {
                      "type": "integer"
                    },
                    "taskSubject": {
                      "type": "string"
                    },
                    "assignedToId": {
                      "type": "string",
                      "format": "uuid",
                      "nullable": true,
                      "description": "New assignee, null when unassigned."
                    },
                    "boardName": {
                      "type": "string",
                      "nullable": true
                    },
                    "(*)boardId": {
                      "type": "string",
                      "format": "uuid",
                      "nullable": true,
                      "description": "Deprecated."
                    }
                  },
                  "required": [
                    "projectId",
                    "taskNumber",
                    "taskSubject",
                    "assignedToId",
                    "boardName",
                    "boardId"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "update": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "enum": [
                              "task"
                            ]
                          },
                          "resource": {
                            "type": "object",
                            "description": "The task with the new assignee."
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "projectId",
          "taskNumber",
          "taskSubject",
          "assignedToId",
          "boardName",
          "boardId"
        ]
      },
      "boardColumnAdd": {
        "name": "boardColumnAdd",
        "title": "boardColumnAdd",
        "summary": "Fired when a column is added to a board.",
        "description": "Fired when a column is added to a board.\n\nPayload for the boardColumnAdd event.\n\nDelivered as the `notification` socket event with `type` set to `boardColumnAdd`.\n\nToken keys marked with (*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations.",
        "payload": {
          "description": "Fired when a column is added to a board.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "(*)projectId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated."
                    },
                    "(*)boardId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated."
                    },
                    "boardName": {
                      "type": "string"
                    },
                    "columnName": {
                      "type": "string"
                    },
                    "(*)column": {
                      "type": "object",
                      "description": "Deprecated. Use resource from changes.create."
                    }
                  },
                  "required": [
                    "projectId",
                    "boardId",
                    "boardName",
                    "columnName",
                    "column"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "create": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "enum": [
                              "boardColumn"
                            ]
                          },
                          "resource": {
                            "type": "object",
                            "description": "The created column."
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "projectId",
          "boardId",
          "boardName",
          "columnName",
          "column"
        ]
      },
      "boardColumnUpdate": {
        "name": "boardColumnUpdate",
        "title": "boardColumnUpdate",
        "summary": "Fired when a board column is updated.",
        "description": "Fired when a board column is updated.\n\nPayload for the boardColumnUpdate event.\n\nDelivered as the `notification` socket event with `type` set to `boardColumnUpdate`.\n\nToken keys marked with (*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations.",
        "payload": {
          "description": "Fired when a board column is updated.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "(*)projectId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated."
                    },
                    "(*)boardId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated."
                    },
                    "boardName": {
                      "type": "string"
                    },
                    "(*)columnId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated."
                    },
                    "columnName": {
                      "type": "string"
                    },
                    "(*)column": {
                      "type": "object",
                      "description": "Deprecated. Use resource from changes.update."
                    }
                  },
                  "required": [
                    "projectId",
                    "boardId",
                    "boardName",
                    "columnId",
                    "columnName",
                    "column"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "update": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "enum": [
                              "boardColumn"
                            ]
                          },
                          "resource": {
                            "type": "object",
                            "description": "The updated column."
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "projectId",
          "boardId",
          "boardName",
          "columnId",
          "columnName",
          "column"
        ]
      },
      "boardColumnDelete": {
        "name": "boardColumnDelete",
        "title": "boardColumnDelete",
        "summary": "Fired when a board column is deleted.",
        "description": "Fired when a board column is deleted.\n\nPayload for the boardColumnDelete event.\n\nDelivered as the `notification` socket event with `type` set to `boardColumnDelete`.\n\nToken keys marked with (*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations.",
        "payload": {
          "description": "Fired when a board column is deleted.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "(*)projectId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated."
                    },
                    "(*)boardId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated."
                    },
                    "boardName": {
                      "type": "string"
                    },
                    "(*)columnId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated."
                    },
                    "columnName": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "projectId",
                    "boardId",
                    "boardName",
                    "columnId",
                    "columnName"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "delete": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "enum": [
                              "boardColumn"
                            ]
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "projectId",
          "boardId",
          "boardName",
          "columnId",
          "columnName"
        ]
      },
      "boardColumnReorder": {
        "name": "boardColumnReorder",
        "title": "boardColumnReorder",
        "summary": "Fired when the columns of a board are reordered. changes.update contains every column with its new order.",
        "description": "Fired when the columns of a board are reordered. changes.update contains every column with its new order.\n\nPayload for the boardColumnReorder event.\n\nDelivered as the `notification` socket event with `type` set to `boardColumnReorder`.\n\nToken keys marked with (*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations.",
        "payload": {
          "description": "Fired when the columns of a board are reordered. changes.update contains every column with its new order.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "(*)projectId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated."
                    },
                    "(*)boardId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated."
                    },
                    "boardName": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "projectId",
                    "boardId",
                    "boardName"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "update": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "enum": [
                              "boardColumn"
                            ]
                          },
                          "resource": {
                            "type": "object",
                            "description": "A column with its updated order."
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "projectId",
          "boardId",
          "boardName"
        ]
      },
      "boardTaskAdd": {
        "name": "boardTaskAdd",
        "title": "boardTaskAdd",
        "summary": "Fired when an existing task is added to a board.",
        "description": "Fired when an existing task is added to a board.\n\nPayload for the boardTaskAdd event.\n\nDelivered as the `notification` socket event with `type` set to `boardTaskAdd`.\n\nToken keys marked with (*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations.",
        "payload": {
          "description": "Fired when an existing task is added to a board.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "(*)projectId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated."
                    },
                    "(*)boardId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated."
                    },
                    "boardName": {
                      "type": "string"
                    },
                    "(*)taskId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated."
                    },
                    "taskSubject": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "projectId",
                    "boardId",
                    "boardName",
                    "taskId",
                    "taskSubject"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "update": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "enum": [
                              "task"
                            ]
                          },
                          "resource": {
                            "type": "object",
                            "description": "The task now placed on the board."
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "projectId",
          "boardId",
          "boardName",
          "taskId",
          "taskSubject"
        ]
      },
      "boardTaskRemove": {
        "name": "boardTaskRemove",
        "title": "boardTaskRemove",
        "summary": "Fired when a task is removed from a board (the task itself is kept).",
        "description": "Fired when a task is removed from a board (the task itself is kept).\n\nPayload for the boardTaskRemove event.\n\nDelivered as the `notification` socket event with `type` set to `boardTaskRemove`.\n\nToken keys marked with (*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations.",
        "payload": {
          "description": "Fired when a task is removed from a board (the task itself is kept).",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "(*)projectId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated."
                    },
                    "(*)boardId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated."
                    },
                    "boardName": {
                      "type": "string"
                    },
                    "(*)taskId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated."
                    },
                    "taskSubject": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "projectId",
                    "boardId",
                    "boardName",
                    "taskId",
                    "taskSubject"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "update": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "enum": [
                              "task"
                            ]
                          },
                          "resource": {
                            "type": "object",
                            "description": "The task after removal from the board."
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "projectId",
          "boardId",
          "boardName",
          "taskId",
          "taskSubject"
        ]
      },
      "boardTaskUpdate": {
        "name": "boardTaskUpdate",
        "title": "boardTaskUpdate",
        "summary": "Fired when a task's details are updated (subject, description, priority, dates, etc.).",
        "description": "Fired when a task's details are updated (subject, description, priority, dates, etc.).\n\nPayload for the boardTaskUpdate event.\n\nDelivered as the `notification` socket event with `type` set to `boardTaskUpdate`.\n\nToken keys marked with (*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations.",
        "payload": {
          "description": "Fired when a task's details are updated (subject, description, priority, dates, etc.).",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "(*)projectId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated."
                    },
                    "(*)boardId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated."
                    },
                    "boardName": {
                      "type": "string"
                    },
                    "(*)taskId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated."
                    },
                    "taskSubject": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "projectId",
                    "boardId",
                    "boardName",
                    "taskId",
                    "taskSubject"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "update": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "enum": [
                              "task"
                            ]
                          },
                          "resource": {
                            "type": "object",
                            "description": "The updated task."
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "projectId",
          "boardId",
          "boardName",
          "taskId",
          "taskSubject"
        ]
      },
      "boardTaskLink": {
        "name": "boardTaskLink",
        "title": "boardTaskLink",
        "summary": "Fired when two tasks are linked.",
        "description": "Fired when two tasks are linked.\n\nPayload for the boardTaskLink event.\n\nDelivered as the `notification` socket event with `type` set to `boardTaskLink`.\n\nToken keys marked with (*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations.",
        "payload": {
          "description": "Fired when two tasks are linked.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "(*)projectId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated."
                    },
                    "(*)taskId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated."
                    },
                    "(*)linkedTaskId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated."
                    },
                    "linkType": {
                      "type": "string",
                      "description": "Link type (defaults to 'related')."
                    }
                  },
                  "required": [
                    "projectId",
                    "taskId",
                    "linkedTaskId",
                    "linkType"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "create": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "enum": [
                              "taskLink"
                            ]
                          },
                          "resource": {
                            "type": "object",
                            "description": "The created link record."
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "projectId",
          "taskId",
          "linkedTaskId",
          "linkType"
        ]
      },
      "boardTaskUnlink": {
        "name": "boardTaskUnlink",
        "title": "boardTaskUnlink",
        "summary": "Fired when a task link is removed.",
        "description": "Fired when a task link is removed.\n\nPayload for the boardTaskUnlink event.\n\nDelivered as the `notification` socket event with `type` set to `boardTaskUnlink`.\n\nToken keys marked with (*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations.",
        "payload": {
          "description": "Fired when a task link is removed.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "(*)projectId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated."
                    },
                    "(*)taskId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated."
                    },
                    "(*)linkedTaskId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated."
                    }
                  },
                  "required": [
                    "projectId",
                    "taskId",
                    "linkedTaskId"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "delete": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid",
                            "description": "Note: the source task ID, not the link record ID."
                          },
                          "resourceType": {
                            "type": "string",
                            "enum": [
                              "taskLink"
                            ]
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "projectId",
          "taskId",
          "linkedTaskId"
        ]
      },
      "boardTaskRelationAdd": {
        "name": "boardTaskRelationAdd",
        "title": "boardTaskRelationAdd",
        "summary": "Fired when a resource (asset, folder, message, chat, ...) is related to a task. Also used for push notifications.",
        "description": "Fired when a resource (asset, folder, message, chat, ...) is related to a task. Also used for push notifications.\n\nPayload for the boardTaskRelationAdd event.\n\nDelivered as the `notification` socket event with `type` set to `boardTaskRelationAdd`.\n\nToken keys marked with (*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations.",
        "payload": {
          "description": "Fired when a resource (asset, folder, message, chat, ...) is related to a task. Also used for push notifications.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "(*)projectId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated."
                    },
                    "(*)taskId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated."
                    },
                    "resourceId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "ID of the related resource."
                    },
                    "resourceType": {
                      "type": "string",
                      "description": "Type of the related resource."
                    }
                  },
                  "required": [
                    "projectId",
                    "taskId",
                    "resourceId",
                    "resourceType"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "create": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "enum": [
                              "taskRelation"
                            ]
                          },
                          "resource": {
                            "type": "object",
                            "description": "The created relation record."
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "projectId",
          "taskId",
          "resourceId",
          "resourceType"
        ]
      },
      "boardTaskRelationRemove": {
        "name": "boardTaskRelationRemove",
        "title": "boardTaskRelationRemove",
        "summary": "Fired when a task relation is removed (explicitly, or cascaded when a board visibility change removes access).",
        "description": "Fired when a task relation is removed (explicitly, or cascaded when a board visibility change removes access).\n\nPayload for the boardTaskRelationRemove event.\n\nDelivered as the `notification` socket event with `type` set to `boardTaskRelationRemove`.\n\nToken keys marked with (*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations.",
        "payload": {
          "description": "Fired when a task relation is removed (explicitly, or cascaded when a board visibility change removes access).",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "(*)projectId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated."
                    },
                    "(*)taskId": {
                      "type": "string",
                      "format": "uuid",
                      "nullable": true,
                      "description": "Deprecated. Null for cascaded removals."
                    },
                    "resourceId": {
                      "type": "string",
                      "format": "uuid",
                      "nullable": true,
                      "description": "ID of the related resource. Null for cascaded removals."
                    },
                    "resourceType": {
                      "type": "string",
                      "nullable": true,
                      "description": "Type of the related resource. Null for cascaded removals."
                    }
                  },
                  "required": [
                    "projectId",
                    "taskId",
                    "resourceId",
                    "resourceType"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "delete": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "enum": [
                              "taskRelation"
                            ]
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "projectId",
          "taskId",
          "resourceId",
          "resourceType"
        ]
      },
      "boardFollow": {
        "name": "boardFollow",
        "title": "boardFollow",
        "summary": "Fired when a user follows a board.",
        "description": "Fired when a user follows a board.\n\nPayload for the boardFollow event.\n\nDelivered as the `notification` socket event with `type` set to `boardFollow`.\n\nToken keys marked with (*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations.",
        "payload": {
          "description": "Fired when a user follows a board.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "(*)projectId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated."
                    },
                    "(*)boardId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated. Use resourceId."
                    }
                  },
                  "required": [
                    "projectId",
                    "boardId"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "update": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "enum": [
                              "board"
                            ]
                          },
                          "resource": {
                            "type": "object",
                            "description": "The board with updated followers."
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "projectId",
          "boardId"
        ]
      },
      "boardUnfollow": {
        "name": "boardUnfollow",
        "title": "boardUnfollow",
        "summary": "Fired when a user unfollows a board.",
        "description": "Fired when a user unfollows a board.\n\nPayload for the boardUnfollow event.\n\nDelivered as the `notification` socket event with `type` set to `boardUnfollow`.\n\nToken keys marked with (*) will be deprecated in a future release and should not be used for new development; replace them with the values and objects in the `changes` key in existing implementations.",
        "payload": {
          "description": "Fired when a user unfollows a board.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "properties": {
                    "(*)projectId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated."
                    },
                    "(*)boardId": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Deprecated. Use resourceId."
                    }
                  },
                  "required": [
                    "projectId",
                    "boardId"
                  ]
                }
              }
            },
            {
              "type": "object",
              "properties": {
                "changes": {
                  "type": "object",
                  "properties": {
                    "update": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "resourceId": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "resourceType": {
                            "type": "string",
                            "enum": [
                              "board"
                            ]
                          },
                          "resource": {
                            "type": "object",
                            "description": "The board with updated followers."
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          ]
        },
        "x-notification-tokens": [
          "projectId",
          "boardId"
        ]
      },
      "notification": {
        "name": "notification",
        "title": "notification",
        "summary": "Envelope event on which every notification listed in this section is delivered. The type property tells you which event schema applies.",
        "description": "Emitted on every channel (namespace) listed in the notification's channels array. Unlike the REST notification objects, the socket payload does NOT include id or channels. tokens and changes are shaped per event type as documented under each event.\n\nPayload of the 'notification' socket event.",
        "payload": {
          "description": "Emitted on every channel (namespace) listed in the notification's channels array. Unlike the REST notification objects, the socket payload does NOT include id or channels. tokens and changes are shaped per event type as documented under each event.",
          "allOf": [
            {
              "$ref": "#/components/schemas/BaseNotificationEvent"
            },
            {
              "type": "object",
              "properties": {
                "tokens": {
                  "type": "object",
                  "description": "Event specific tokens (see the individual event)."
                },
                "changes": {
                  "type": "object",
                  "description": "Event specific create/update/delete arrays (see the individual event). May be null.",
                  "nullable": true
                }
              }
            }
          ]
        }
      },
      "tokenEvent": {
        "name": "tokenEvent",
        "title": "tokenEvent",
        "summary": "Emitted by the server right before it force-disconnects a socket whose credential is no longer valid.",
        "description": "Payload is a plain string, not an object. 'TokenExpired' is sent when the JWT exp has passed, 'tokenBlacklisted' when the JWT was blacklisted (logout) or a bot API key was revoked. The socket is disconnected ~1 second later; re-authenticate and reconnect.\n\nPayload of the 'tokenEvent' socket event.",
        "payload": {
          "description": "Payload is a plain string, not an object. 'TokenExpired' is sent when the JWT exp has passed, 'tokenBlacklisted' when the JWT was blacklisted (logout) or a bot API key was revoked. The socket is disconnected ~1 second later; re-authenticate and reconnect.",
          "type": "string",
          "enum": [
            "TokenExpired",
            "tokenBlacklisted"
          ]
        }
      },
      "ws-probe": {
        "name": "ws:probe",
        "title": "ws:probe",
        "summary": "Client -> server liveness probe. Emit with an acknowledgement callback; the server acks immediately with no payload.",
        "description": "Client emits ws:probe (any/no data) using socket.io acks, e.g. socket.timeout(2000).emit('ws:probe', null, (err) => ...). A missing ack means the connection is stale and should be torn down. Nothing is emitted by the server other than the ack.\n\nAcknowledgement only; the server sends no payload.",
        "payload": {
          "description": "Client emits ws:probe (any/no data) using socket.io acks, e.g. socket.timeout(2000).emit('ws:probe', null, (err) => ...). A missing ack means the connection is stale and should be torn down. Nothing is emitted by the server other than the ack.",
          "type": "object",
          "additionalProperties": false
        }
      },
      "typing-start": {
        "name": "typing:start",
        "title": "typing:start",
        "summary": "Ephemeral typing indicator. Client -> server: emit { chatId }. Server -> clients: relayed with the authenticated userId to every other socket on the chat channels.",
        "description": "Client emits typing:start with { chatId: string }. The server resolves the same channels a chatCreateMessage for that chat would use (chat/{chatId}, project/{projectId}/{visibility}, public/{token}; never user/* channels) and emits typing:start on each of them to every socket except the sender. Not persisted; not delivered as a 'notification' event.\n\nPayload of the 'typing:start' socket event.",
        "payload": {
          "description": "Client emits typing:start with { chatId: string }. The server resolves the same channels a chatCreateMessage for that chat would use (chat/{chatId}, project/{projectId}/{visibility}, public/{token}; never user/* channels) and emits typing:start on each of them to every socket except the sender. Not persisted; not delivered as a 'notification' event.",
          "type": "object",
          "properties": {
            "chatId": {
              "type": "string",
              "format": "uuid",
              "description": "Chat the typing indicator belongs to."
            },
            "userId": {
              "type": "string",
              "format": "uuid",
              "description": "User who is typing. Equals the AI system user ID when the AI assistant is composing a reply."
            },
            "timestamp": {
              "type": "integer",
              "description": "Server time in milliseconds since epoch."
            }
          }
        }
      },
      "typing-stop": {
        "name": "typing:stop",
        "title": "typing:stop",
        "summary": "Ephemeral typing indicator stop. Client -> server: emit { chatId }. Server -> clients: relayed with the authenticated userId to every other socket on the chat channels.",
        "description": "Same routing and payload as typing:start.\n\nPayload of the 'typing:stop' socket event.",
        "payload": {
          "description": "Same routing and payload as typing:start.",
          "type": "object",
          "properties": {
            "chatId": {
              "type": "string",
              "format": "uuid",
              "description": "Chat the typing indicator belongs to."
            },
            "userId": {
              "type": "string",
              "format": "uuid",
              "description": "User who is typing. Equals the AI system user ID when the AI assistant is composing a reply."
            },
            "timestamp": {
              "type": "integer",
              "description": "Server time in milliseconds since epoch."
            }
          }
        }
      },
      "collab-join": {
        "name": "collab:join",
        "title": "collab:join",
        "summary": "A user joined the collab session on this chat namespace (broadcast to the other members).",
        "description": "Client emits collab:join with optional { preferredAnnotationColor }. Client -> server -> all other sockets in the same /chat/{chatId} namespace. The server spreads the client payload and appends the authenticated user identity (userId, displayName, color, avatarUrl), the annotationColor assigned on collab:join and a timestamp; client supplied values for those keys are overwritten. The joining socket additionally receives collab:self-color, collab:members (if others are present) and either collab:presenter-assign (first member) or collab:presenter-state.\n\nPayload of the 'collab:join' socket event.",
        "payload": {
          "description": "Client emits collab:join with optional { preferredAnnotationColor }. Client -> server -> all other sockets in the same /chat/{chatId} namespace. The server spreads the client payload and appends the authenticated user identity (userId, displayName, color, avatarUrl), the annotationColor assigned on collab:join and a timestamp; client supplied values for those keys are overwritten. The joining socket additionally receives collab:self-color, collab:members (if others are present) and either collab:presenter-assign (first member) or collab:presenter-state.",
          "type": "object",
          "properties": {
            "preferredAnnotationColor": {
              "type": "string",
              "description": "Echo of the colour the client asked for, if it sent one."
            },
            "userId": {
              "type": "string",
              "description": "Authenticated user ID (server supplied, cannot be spoofed)."
            },
            "displayName": {
              "type": "string",
              "nullable": true,
              "description": "Display name (falls back to first + last name)."
            },
            "color": {
              "type": "string",
              "nullable": true,
              "description": "The user's profile colour."
            },
            "avatarUrl": {
              "type": "string",
              "nullable": true,
              "description": "keyPath of the user's avatar thumbnail file, if any."
            },
            "annotationColor": {
              "type": "string",
              "description": "Annotation colour assigned to this user for the collab session."
            },
            "timestamp": {
              "type": "integer",
              "description": "Server time in milliseconds since epoch when the event was relayed."
            }
          }
        }
      },
      "collab-leave": {
        "name": "collab:leave",
        "title": "collab:leave",
        "summary": "A user left the collab session (explicit collab:leave from the client or socket disconnect).",
        "description": "Client -> server -> all other sockets in the same /chat/{chatId} namespace. The server spreads the client payload and appends the authenticated user identity (userId, displayName, color, avatarUrl), the annotationColor assigned on collab:join and a timestamp; client supplied values for those keys are overwritten. On disconnect the server emits it on behalf of the leaving socket; if they were the presenter a collab:presenter-assign (reason transfer-on-leave) follows.\n\nPayload of the 'collab:leave' socket event.",
        "payload": {
          "description": "Client -> server -> all other sockets in the same /chat/{chatId} namespace. The server spreads the client payload and appends the authenticated user identity (userId, displayName, color, avatarUrl), the annotationColor assigned on collab:join and a timestamp; client supplied values for those keys are overwritten. On disconnect the server emits it on behalf of the leaving socket; if they were the presenter a collab:presenter-assign (reason transfer-on-leave) follows.",
          "type": "object",
          "properties": {
            "userId": {
              "type": "string",
              "description": "Authenticated user ID (server supplied, cannot be spoofed)."
            },
            "displayName": {
              "type": "string",
              "nullable": true,
              "description": "Display name (falls back to first + last name)."
            },
            "color": {
              "type": "string",
              "nullable": true,
              "description": "The user's profile colour."
            },
            "avatarUrl": {
              "type": "string",
              "nullable": true,
              "description": "keyPath of the user's avatar thumbnail file, if any."
            },
            "annotationColor": {
              "type": "string",
              "description": "Annotation colour assigned to this user for the collab session."
            },
            "timestamp": {
              "type": "integer",
              "description": "Server time in milliseconds since epoch when the event was relayed."
            }
          }
        }
      },
      "collab-cursor-move": {
        "name": "collab:cursor-move",
        "title": "collab:cursor-move",
        "summary": "Remote cursor position update (percentage coordinates).",
        "description": "Client -> server -> all other sockets in the same /chat/{chatId} namespace. The server spreads the client payload and appends the authenticated user identity (userId, displayName, color, avatarUrl), the annotationColor assigned on collab:join and a timestamp; client supplied values for those keys are overwritten.\n\nPayload of the 'collab:cursor-move' socket event.",
        "payload": {
          "description": "Client -> server -> all other sockets in the same /chat/{chatId} namespace. The server spreads the client payload and appends the authenticated user identity (userId, displayName, color, avatarUrl), the annotationColor assigned on collab:join and a timestamp; client supplied values for those keys are overwritten.",
          "type": "object",
          "properties": {
            "x": {
              "type": "number",
              "description": "Client supplied X position as a percentage of the asset area."
            },
            "y": {
              "type": "number",
              "description": "Client supplied Y position as a percentage of the asset area."
            },
            "visible": {
              "type": "boolean",
              "description": "Client supplied visibility flag."
            },
            "userId": {
              "type": "string",
              "description": "Authenticated user ID (server supplied, cannot be spoofed)."
            },
            "displayName": {
              "type": "string",
              "nullable": true,
              "description": "Display name (falls back to first + last name)."
            },
            "color": {
              "type": "string",
              "nullable": true,
              "description": "The user's profile colour."
            },
            "avatarUrl": {
              "type": "string",
              "nullable": true,
              "description": "keyPath of the user's avatar thumbnail file, if any."
            },
            "annotationColor": {
              "type": "string",
              "description": "Annotation colour assigned to this user for the collab session."
            },
            "timestamp": {
              "type": "integer",
              "description": "Server time in milliseconds since epoch when the event was relayed."
            }
          }
        }
      },
      "collab-cursor-hide": {
        "name": "collab:cursor-hide",
        "title": "collab:cursor-hide",
        "summary": "Remote cursor left the asset area.",
        "description": "Client -> server -> all other sockets in the same /chat/{chatId} namespace. The server spreads the client payload and appends the authenticated user identity (userId, displayName, color, avatarUrl), the annotationColor assigned on collab:join and a timestamp; client supplied values for those keys are overwritten.\n\nPayload of the 'collab:cursor-hide' socket event.",
        "payload": {
          "description": "Client -> server -> all other sockets in the same /chat/{chatId} namespace. The server spreads the client payload and appends the authenticated user identity (userId, displayName, color, avatarUrl), the annotationColor assigned on collab:join and a timestamp; client supplied values for those keys are overwritten.",
          "type": "object",
          "properties": {
            "userId": {
              "type": "string",
              "description": "Authenticated user ID (server supplied, cannot be spoofed)."
            },
            "displayName": {
              "type": "string",
              "nullable": true,
              "description": "Display name (falls back to first + last name)."
            },
            "color": {
              "type": "string",
              "nullable": true,
              "description": "The user's profile colour."
            },
            "avatarUrl": {
              "type": "string",
              "nullable": true,
              "description": "keyPath of the user's avatar thumbnail file, if any."
            },
            "annotationColor": {
              "type": "string",
              "description": "Annotation colour assigned to this user for the collab session."
            },
            "timestamp": {
              "type": "integer",
              "description": "Server time in milliseconds since epoch when the event was relayed."
            }
          }
        }
      },
      "collab-path-start": {
        "name": "collab:path-start",
        "title": "collab:path-start",
        "summary": "Pen drawing started.",
        "description": "Client -> server -> all other sockets in the same /chat/{chatId} namespace. The server spreads the client payload and appends the authenticated user identity (userId, displayName, color, avatarUrl), the annotationColor assigned on collab:join and a timestamp; client supplied values for those keys are overwritten.\n\nPayload of the 'collab:path-start' socket event.",
        "payload": {
          "description": "Client -> server -> all other sockets in the same /chat/{chatId} namespace. The server spreads the client payload and appends the authenticated user identity (userId, displayName, color, avatarUrl), the annotationColor assigned on collab:join and a timestamp; client supplied values for those keys are overwritten.",
          "type": "object",
          "properties": {
            "pathId": {
              "type": "string",
              "description": "Client generated path ID."
            },
            "strokeColor": {
              "type": "string"
            },
            "strokeWidth": {
              "type": "number"
            },
            "points": {
              "type": "array",
              "items": {
                "type": "object"
              },
              "description": "Initial point(s) of the path (client defined shape)."
            },
            "fadeDuration": {
              "type": "number",
              "description": "Milliseconds after which the path fades (0 = persistent)."
            },
            "userId": {
              "type": "string",
              "description": "Authenticated user ID (server supplied, cannot be spoofed)."
            },
            "displayName": {
              "type": "string",
              "nullable": true,
              "description": "Display name (falls back to first + last name)."
            },
            "color": {
              "type": "string",
              "nullable": true,
              "description": "The user's profile colour."
            },
            "avatarUrl": {
              "type": "string",
              "nullable": true,
              "description": "keyPath of the user's avatar thumbnail file, if any."
            },
            "annotationColor": {
              "type": "string",
              "description": "Annotation colour assigned to this user for the collab session."
            },
            "timestamp": {
              "type": "integer",
              "description": "Server time in milliseconds since epoch when the event was relayed."
            }
          }
        }
      },
      "collab-path-update": {
        "name": "collab:path-update",
        "title": "collab:path-update",
        "summary": "Pen drawing continued with additional points.",
        "description": "Client -> server -> all other sockets in the same /chat/{chatId} namespace. The server spreads the client payload and appends the authenticated user identity (userId, displayName, color, avatarUrl), the annotationColor assigned on collab:join and a timestamp; client supplied values for those keys are overwritten.\n\nPayload of the 'collab:path-update' socket event.",
        "payload": {
          "description": "Client -> server -> all other sockets in the same /chat/{chatId} namespace. The server spreads the client payload and appends the authenticated user identity (userId, displayName, color, avatarUrl), the annotationColor assigned on collab:join and a timestamp; client supplied values for those keys are overwritten.",
          "type": "object",
          "properties": {
            "pathId": {
              "type": "string"
            },
            "points": {
              "type": "array",
              "items": {
                "type": "object"
              },
              "description": "Additional points appended to the path."
            },
            "userId": {
              "type": "string",
              "description": "Authenticated user ID (server supplied, cannot be spoofed)."
            },
            "displayName": {
              "type": "string",
              "nullable": true,
              "description": "Display name (falls back to first + last name)."
            },
            "color": {
              "type": "string",
              "nullable": true,
              "description": "The user's profile colour."
            },
            "avatarUrl": {
              "type": "string",
              "nullable": true,
              "description": "keyPath of the user's avatar thumbnail file, if any."
            },
            "annotationColor": {
              "type": "string",
              "description": "Annotation colour assigned to this user for the collab session."
            },
            "timestamp": {
              "type": "integer",
              "description": "Server time in milliseconds since epoch when the event was relayed."
            }
          }
        }
      },
      "collab-path-end": {
        "name": "collab:path-end",
        "title": "collab:path-end",
        "summary": "Pen drawing completed.",
        "description": "Client -> server -> all other sockets in the same /chat/{chatId} namespace. The server spreads the client payload and appends the authenticated user identity (userId, displayName, color, avatarUrl), the annotationColor assigned on collab:join and a timestamp; client supplied values for those keys are overwritten.\n\nPayload of the 'collab:path-end' socket event.",
        "payload": {
          "description": "Client -> server -> all other sockets in the same /chat/{chatId} namespace. The server spreads the client payload and appends the authenticated user identity (userId, displayName, color, avatarUrl), the annotationColor assigned on collab:join and a timestamp; client supplied values for those keys are overwritten.",
          "type": "object",
          "properties": {
            "pathId": {
              "type": "string"
            },
            "pathData": {
              "type": "string",
              "description": "Final SVG path data."
            },
            "fadeDuration": {
              "type": "number"
            },
            "userId": {
              "type": "string",
              "description": "Authenticated user ID (server supplied, cannot be spoofed)."
            },
            "displayName": {
              "type": "string",
              "nullable": true,
              "description": "Display name (falls back to first + last name)."
            },
            "color": {
              "type": "string",
              "nullable": true,
              "description": "The user's profile colour."
            },
            "avatarUrl": {
              "type": "string",
              "nullable": true,
              "description": "keyPath of the user's avatar thumbnail file, if any."
            },
            "annotationColor": {
              "type": "string",
              "description": "Annotation colour assigned to this user for the collab session."
            },
            "timestamp": {
              "type": "integer",
              "description": "Server time in milliseconds since epoch when the event was relayed."
            }
          }
        }
      },
      "collab-path-clear": {
        "name": "collab:path-clear",
        "title": "collab:path-clear",
        "summary": "Drawn path(s) cleared. With pathId only that path is cleared, otherwise all paths of the user.",
        "description": "Client -> server -> all other sockets in the same /chat/{chatId} namespace. The server spreads the client payload and appends the authenticated user identity (userId, displayName, color, avatarUrl), the annotationColor assigned on collab:join and a timestamp; client supplied values for those keys are overwritten.\n\nPayload of the 'collab:path-clear' socket event.",
        "payload": {
          "description": "Client -> server -> all other sockets in the same /chat/{chatId} namespace. The server spreads the client payload and appends the authenticated user identity (userId, displayName, color, avatarUrl), the annotationColor assigned on collab:join and a timestamp; client supplied values for those keys are overwritten.",
          "type": "object",
          "properties": {
            "pathId": {
              "type": "string",
              "nullable": true
            },
            "userId": {
              "type": "string",
              "description": "Authenticated user ID (server supplied, cannot be spoofed)."
            },
            "displayName": {
              "type": "string",
              "nullable": true,
              "description": "Display name (falls back to first + last name)."
            },
            "color": {
              "type": "string",
              "nullable": true,
              "description": "The user's profile colour."
            },
            "avatarUrl": {
              "type": "string",
              "nullable": true,
              "description": "keyPath of the user's avatar thumbnail file, if any."
            },
            "annotationColor": {
              "type": "string",
              "description": "Annotation colour assigned to this user for the collab session."
            },
            "timestamp": {
              "type": "integer",
              "description": "Server time in milliseconds since epoch when the event was relayed."
            }
          }
        }
      },
      "collab-click": {
        "name": "collab:click",
        "title": "collab:click",
        "summary": "Click ripple at percentage coordinates.",
        "description": "Client -> server -> all other sockets in the same /chat/{chatId} namespace. The server spreads the client payload and appends the authenticated user identity (userId, displayName, color, avatarUrl), the annotationColor assigned on collab:join and a timestamp; client supplied values for those keys are overwritten.\n\nPayload of the 'collab:click' socket event.",
        "payload": {
          "description": "Client -> server -> all other sockets in the same /chat/{chatId} namespace. The server spreads the client payload and appends the authenticated user identity (userId, displayName, color, avatarUrl), the annotationColor assigned on collab:join and a timestamp; client supplied values for those keys are overwritten.",
          "type": "object",
          "properties": {
            "x": {
              "type": "number"
            },
            "y": {
              "type": "number"
            },
            "userId": {
              "type": "string",
              "description": "Authenticated user ID (server supplied, cannot be spoofed)."
            },
            "displayName": {
              "type": "string",
              "nullable": true,
              "description": "Display name (falls back to first + last name)."
            },
            "color": {
              "type": "string",
              "nullable": true,
              "description": "The user's profile colour."
            },
            "avatarUrl": {
              "type": "string",
              "nullable": true,
              "description": "keyPath of the user's avatar thumbnail file, if any."
            },
            "annotationColor": {
              "type": "string",
              "description": "Annotation colour assigned to this user for the collab session."
            },
            "timestamp": {
              "type": "integer",
              "description": "Server time in milliseconds since epoch when the event was relayed."
            }
          }
        }
      },
      "collab-color-change": {
        "name": "collab:color-change",
        "title": "collab:color-change",
        "summary": "User changed their annotation colour. The server stores the new colour on the socket, so subsequent relayed events carry it.",
        "description": "Client -> server -> all other sockets in the same /chat/{chatId} namespace. The server spreads the client payload and appends the authenticated user identity (userId, displayName, color, avatarUrl), the annotationColor assigned on collab:join and a timestamp; client supplied values for those keys are overwritten.\n\nPayload of the 'collab:color-change' socket event.",
        "payload": {
          "description": "Client -> server -> all other sockets in the same /chat/{chatId} namespace. The server spreads the client payload and appends the authenticated user identity (userId, displayName, color, avatarUrl), the annotationColor assigned on collab:join and a timestamp; client supplied values for those keys are overwritten.",
          "type": "object",
          "properties": {
            "userId": {
              "type": "string",
              "description": "Authenticated user ID (server supplied, cannot be spoofed)."
            },
            "displayName": {
              "type": "string",
              "nullable": true,
              "description": "Display name (falls back to first + last name)."
            },
            "color": {
              "type": "string",
              "nullable": true,
              "description": "The user's profile colour."
            },
            "avatarUrl": {
              "type": "string",
              "nullable": true,
              "description": "keyPath of the user's avatar thumbnail file, if any."
            },
            "annotationColor": {
              "type": "string",
              "description": "Annotation colour assigned to this user for the collab session."
            },
            "timestamp": {
              "type": "integer",
              "description": "Server time in milliseconds since epoch when the event was relayed."
            }
          }
        }
      },
      "collab-region-create": {
        "name": "collab:region-create",
        "title": "collab:region-create",
        "summary": "Audio/video region created on the waveform/timeline.",
        "description": "Client -> server -> all other sockets in the same /chat/{chatId} namespace. The server spreads the client payload and appends the authenticated user identity (userId, displayName, color, avatarUrl), the annotationColor assigned on collab:join and a timestamp; client supplied values for those keys are overwritten.\n\nPayload of the 'collab:region-create' socket event.",
        "payload": {
          "description": "Client -> server -> all other sockets in the same /chat/{chatId} namespace. The server spreads the client payload and appends the authenticated user identity (userId, displayName, color, avatarUrl), the annotationColor assigned on collab:join and a timestamp; client supplied values for those keys are overwritten.",
          "type": "object",
          "properties": {
            "regionId": {
              "type": "string"
            },
            "startTime": {
              "type": "number"
            },
            "endTime": {
              "type": "number"
            },
            "userId": {
              "type": "string",
              "description": "Authenticated user ID (server supplied, cannot be spoofed)."
            },
            "displayName": {
              "type": "string",
              "nullable": true,
              "description": "Display name (falls back to first + last name)."
            },
            "color": {
              "type": "string",
              "nullable": true,
              "description": "The user's profile colour."
            },
            "avatarUrl": {
              "type": "string",
              "nullable": true,
              "description": "keyPath of the user's avatar thumbnail file, if any."
            },
            "annotationColor": {
              "type": "string",
              "description": "Annotation colour assigned to this user for the collab session."
            },
            "timestamp": {
              "type": "integer",
              "description": "Server time in milliseconds since epoch when the event was relayed."
            }
          }
        }
      },
      "collab-region-remove": {
        "name": "collab:region-remove",
        "title": "collab:region-remove",
        "summary": "Region removed.",
        "description": "Client -> server -> all other sockets in the same /chat/{chatId} namespace. The server spreads the client payload and appends the authenticated user identity (userId, displayName, color, avatarUrl), the annotationColor assigned on collab:join and a timestamp; client supplied values for those keys are overwritten.\n\nPayload of the 'collab:region-remove' socket event.",
        "payload": {
          "description": "Client -> server -> all other sockets in the same /chat/{chatId} namespace. The server spreads the client payload and appends the authenticated user identity (userId, displayName, color, avatarUrl), the annotationColor assigned on collab:join and a timestamp; client supplied values for those keys are overwritten.",
          "type": "object",
          "properties": {
            "regionId": {
              "type": "string"
            },
            "userId": {
              "type": "string",
              "description": "Authenticated user ID (server supplied, cannot be spoofed)."
            },
            "displayName": {
              "type": "string",
              "nullable": true,
              "description": "Display name (falls back to first + last name)."
            },
            "color": {
              "type": "string",
              "nullable": true,
              "description": "The user's profile colour."
            },
            "avatarUrl": {
              "type": "string",
              "nullable": true,
              "description": "keyPath of the user's avatar thumbnail file, if any."
            },
            "annotationColor": {
              "type": "string",
              "description": "Annotation colour assigned to this user for the collab session."
            },
            "timestamp": {
              "type": "integer",
              "description": "Server time in milliseconds since epoch when the event was relayed."
            }
          }
        }
      },
      "collab-zoom-sync": {
        "name": "collab:zoom-sync",
        "title": "collab:zoom-sync",
        "summary": "Zoom level broadcast (followers of the presenter apply it).",
        "description": "Client -> server -> all other sockets in the same /chat/{chatId} namespace. The server spreads the client payload and appends the authenticated user identity (userId, displayName, color, avatarUrl), the annotationColor assigned on collab:join and a timestamp; client supplied values for those keys are overwritten.\n\nPayload of the 'collab:zoom-sync' socket event.",
        "payload": {
          "description": "Client -> server -> all other sockets in the same /chat/{chatId} namespace. The server spreads the client payload and appends the authenticated user identity (userId, displayName, color, avatarUrl), the annotationColor assigned on collab:join and a timestamp; client supplied values for those keys are overwritten.",
          "type": "object",
          "properties": {
            "zoom": {
              "type": "number"
            },
            "userId": {
              "type": "string",
              "description": "Authenticated user ID (server supplied, cannot be spoofed)."
            },
            "displayName": {
              "type": "string",
              "nullable": true,
              "description": "Display name (falls back to first + last name)."
            },
            "color": {
              "type": "string",
              "nullable": true,
              "description": "The user's profile colour."
            },
            "avatarUrl": {
              "type": "string",
              "nullable": true,
              "description": "keyPath of the user's avatar thumbnail file, if any."
            },
            "annotationColor": {
              "type": "string",
              "description": "Annotation colour assigned to this user for the collab session."
            },
            "timestamp": {
              "type": "integer",
              "description": "Server time in milliseconds since epoch when the event was relayed."
            }
          }
        }
      },
      "collab-playback-sync": {
        "name": "collab:playback-sync",
        "title": "collab:playback-sync",
        "summary": "Play/pause/seek state broadcast by the presenter to the other members.",
        "description": "Only the current presenter socket may broadcast; other senders receive collab:playback-sync:rejected instead and nothing is relayed. Client -> server -> all other sockets in the same /chat/{chatId} namespace. The server spreads the client payload and appends the authenticated user identity (userId, displayName, color, avatarUrl), the annotationColor assigned on collab:join and a timestamp; client supplied values for those keys are overwritten. The server also stores currentTime/playing as the namespace playback state.\n\nPayload of the 'collab:playback-sync' socket event.",
        "payload": {
          "description": "Only the current presenter socket may broadcast; other senders receive collab:playback-sync:rejected instead and nothing is relayed. Client -> server -> all other sockets in the same /chat/{chatId} namespace. The server spreads the client payload and appends the authenticated user identity (userId, displayName, color, avatarUrl), the annotationColor assigned on collab:join and a timestamp; client supplied values for those keys are overwritten. The server also stores currentTime/playing as the namespace playback state.",
          "type": "object",
          "properties": {
            "action": {
              "type": "string",
              "description": "Client supplied action (e.g. 'play', 'pause', 'seek')."
            },
            "currentTime": {
              "type": "number"
            },
            "playing": {
              "type": "boolean"
            },
            "duration": {
              "type": "number"
            },
            "playbackRate": {
              "type": "number"
            },
            "userId": {
              "type": "string",
              "description": "Authenticated user ID (server supplied, cannot be spoofed)."
            },
            "displayName": {
              "type": "string",
              "nullable": true,
              "description": "Display name (falls back to first + last name)."
            },
            "color": {
              "type": "string",
              "nullable": true,
              "description": "The user's profile colour."
            },
            "avatarUrl": {
              "type": "string",
              "nullable": true,
              "description": "keyPath of the user's avatar thumbnail file, if any."
            },
            "annotationColor": {
              "type": "string",
              "description": "Annotation colour assigned to this user for the collab session."
            },
            "timestamp": {
              "type": "integer",
              "description": "Server time in milliseconds since epoch when the event was relayed."
            }
          }
        }
      },
      "collab-playback-sync-rejected": {
        "name": "collab:playback-sync:rejected",
        "title": "collab:playback-sync:rejected",
        "summary": "Server -> sender only: the sender is not the presenter, so its collab:playback-sync was dropped. Carries the real presenter and playback position so the client can snap back to follower mode.",
        "description": "Emitted only to the rejected sender.\n\nPayload of the 'collab:playback-sync:rejected' socket event.",
        "payload": {
          "description": "Emitted only to the rejected sender.",
          "type": "object",
          "properties": {
            "reason": {
              "type": "string",
              "enum": [
                "not-presenter"
              ]
            },
            "presenterId": {
              "type": "string",
              "nullable": true
            },
            "presenterDisplayName": {
              "type": "string",
              "nullable": true
            },
            "playback": {
              "type": "object",
              "description": "{ currentTime: number, playing: boolean } of the current presenter."
            },
            "timestamp": {
              "type": "integer"
            }
          }
        }
      },
      "collab-presenter-assign": {
        "name": "collab:presenter-assign",
        "title": "collab:presenter-assign",
        "summary": "Server -> all sockets in the namespace: a new presenter was assigned.",
        "description": "Emitted when the first member joins (first-join), when an admin takes over or a presenter/admin reassigns via collab:presenter-takeover (admin-takeover), and when the presenter disconnects and control transfers to an admin or the earliest joined member (transfer-on-leave).\n\nPayload of the 'collab:presenter-assign' socket event.",
        "payload": {
          "description": "Emitted when the first member joins (first-join), when an admin takes over or a presenter/admin reassigns via collab:presenter-takeover (admin-takeover), and when the presenter disconnects and control transfers to an admin or the earliest joined member (transfer-on-leave).",
          "type": "object",
          "properties": {
            "presenterId": {
              "type": "string"
            },
            "presenterDisplayName": {
              "type": "string",
              "nullable": true
            },
            "reason": {
              "type": "string",
              "enum": [
                "first-join",
                "admin-takeover",
                "transfer-on-leave"
              ]
            },
            "timestamp": {
              "type": "integer"
            }
          }
        }
      },
      "collab-presenter-state": {
        "name": "collab:presenter-state",
        "title": "collab:presenter-state",
        "summary": "Server -> joining socket: current presenter and playback state when a presenter already exists.",
        "description": "Sent instead of collab:presenter-assign to a socket that joins a namespace that already has a presenter.\n\nPayload of the 'collab:presenter-state' socket event.",
        "payload": {
          "description": "Sent instead of collab:presenter-assign to a socket that joins a namespace that already has a presenter.",
          "type": "object",
          "properties": {
            "presenterId": {
              "type": "string"
            },
            "presenterDisplayName": {
              "type": "string",
              "nullable": true
            },
            "playback": {
              "type": "object",
              "description": "{ currentTime: number, playing: boolean }."
            },
            "timestamp": {
              "type": "integer"
            }
          }
        }
      },
      "collab-presenter-request": {
        "name": "collab:presenter-request",
        "title": "collab:presenter-request",
        "summary": "Request for presenter control. From an admin it is granted immediately (collab:presenter-assign, reason admin-takeover); from a non-admin it is relayed to the current presenter socket only.",
        "description": "Client emits collab:presenter-request (any data). Client -> server -> the current presenter socket only. The server spreads the client payload and appends the authenticated user identity (userId, displayName, color, avatarUrl), the annotationColor assigned on collab:join and a timestamp; client supplied values for those keys are overwritten. requesterId / requesterDisplayName duplicate userId / displayName.\n\nPayload of the 'collab:presenter-request' socket event.",
        "payload": {
          "description": "Client emits collab:presenter-request (any data). Client -> server -> the current presenter socket only. The server spreads the client payload and appends the authenticated user identity (userId, displayName, color, avatarUrl), the annotationColor assigned on collab:join and a timestamp; client supplied values for those keys are overwritten. requesterId / requesterDisplayName duplicate userId / displayName.",
          "type": "object",
          "properties": {
            "requesterId": {
              "type": "string"
            },
            "requesterDisplayName": {
              "type": "string",
              "nullable": true
            },
            "userId": {
              "type": "string",
              "description": "Authenticated user ID (server supplied, cannot be spoofed)."
            },
            "displayName": {
              "type": "string",
              "nullable": true,
              "description": "Display name (falls back to first + last name)."
            },
            "color": {
              "type": "string",
              "nullable": true,
              "description": "The user's profile colour."
            },
            "avatarUrl": {
              "type": "string",
              "nullable": true,
              "description": "keyPath of the user's avatar thumbnail file, if any."
            },
            "annotationColor": {
              "type": "string",
              "description": "Annotation colour assigned to this user for the collab session."
            },
            "timestamp": {
              "type": "integer",
              "description": "Server time in milliseconds since epoch when the event was relayed."
            }
          }
        }
      },
      "collab-presenter-takeover": {
        "name": "collab:presenter-takeover",
        "title": "collab:presenter-takeover",
        "summary": "Client -> server only: an admin or the current presenter hands presenter control to a target user. Results in a collab:presenter-assign (reason admin-takeover) to everyone; nothing is relayed under this name.",
        "description": "Client payload: { targetUserId: string, targetDisplayName: string }. Ignored when the sender is neither an admin (workspaceOwner/workspaceAdmin/projectOwner/projectAdmin) nor the current presenter, or when targetUserId is missing.\n\nClient -> server payload (no server emission under this event name).",
        "payload": {
          "description": "Client payload: { targetUserId: string, targetDisplayName: string }. Ignored when the sender is neither an admin (workspaceOwner/workspaceAdmin/projectOwner/projectAdmin) nor the current presenter, or when targetUserId is missing.",
          "type": "object",
          "properties": {
            "targetUserId": {
              "type": "string"
            },
            "targetDisplayName": {
              "type": "string"
            }
          }
        }
      },
      "collab-state-request": {
        "name": "collab:state-request",
        "title": "collab:state-request",
        "summary": "Server -> the earliest joined other member: asks it to send its current annotation state to a late joiner (collab:state-response).",
        "description": "Emitted automatically when a socket joins a namespace with existing members, and again when a client retries by emitting collab:state-request itself.\n\nPayload of the 'collab:state-request' socket event.",
        "payload": {
          "description": "Emitted automatically when a socket joins a namespace with existing members, and again when a client retries by emitting collab:state-request itself.",
          "type": "object",
          "properties": {
            "requesterId": {
              "type": "string",
              "description": "User ID of the late joiner."
            },
            "requesterSocketId": {
              "type": "string",
              "description": "Socket ID to address the collab:state-response to."
            },
            "timestamp": {
              "type": "integer"
            }
          }
        }
      },
      "collab-state-response": {
        "name": "collab:state-response",
        "title": "collab:state-response",
        "summary": "Server -> the requesting socket only: sanitised snapshot of paths, regions and zoom provided by an existing member.",
        "description": "Client emits collab:state-response with { requesterSocketId, paths, regions, zoom }; the server validates/truncates (max 200 paths and 200 regions, string length limits) and forwards it only to requesterSocketId.\n\nPayload of the 'collab:state-response' socket event.",
        "payload": {
          "description": "Client emits collab:state-response with { requesterSocketId, paths, regions, zoom }; the server validates/truncates (max 200 paths and 200 regions, string length limits) and forwards it only to requesterSocketId.",
          "type": "object",
          "properties": {
            "requesterSocketId": {
              "type": "string"
            },
            "paths": {
              "type": "array",
              "items": {
                "type": "object"
              },
              "description": "Path objects: { pathId, userId, color, strokeWidth, pathData, fadeDuration, createdAt }."
            },
            "regions": {
              "type": "array",
              "items": {
                "type": "object"
              },
              "description": "Region objects: { regionId, startTime, endTime, userId, displayName, color, avatarUrl }."
            },
            "zoom": {
              "type": "number",
              "description": "Zoom level, omitted when the responder did not supply a number."
            },
            "timestamp": {
              "type": "integer"
            }
          }
        }
      },
      "collab-members": {
        "name": "collab:members",
        "title": "collab:members",
        "summary": "Server -> joining socket: the members already present in the namespace.",
        "description": "Sent right after collab:join when at least one other authenticated member is connected.\n\nPayload of the 'collab:members' socket event.",
        "payload": {
          "description": "Sent right after collab:join when at least one other authenticated member is connected.",
          "type": "object",
          "properties": {
            "members": {
              "type": "array",
              "items": {
                "type": "object"
              },
              "description": "Member objects: { userId, displayName, color, avatarUrl, annotationColor }."
            },
            "timestamp": {
              "type": "integer"
            }
          }
        }
      },
      "collab-self-color": {
        "name": "collab:self-color",
        "title": "collab:self-color",
        "summary": "Server -> joining socket: the annotation colour assigned to it for this session.",
        "description": "The preferred colour is kept when it is not the default (#FF0000); otherwise the first unused palette colour is assigned.\n\nPayload of the 'collab:self-color' socket event.",
        "payload": {
          "description": "The preferred colour is kept when it is not the default (#FF0000); otherwise the first unused palette colour is assigned.",
          "type": "object",
          "properties": {
            "annotationColor": {
              "type": "string"
            }
          }
        }
      }
    },
    "schemas": {
      "BaseNotificationEvent": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "description": "The specific type of notification event (matches the top-level key, e.g., 'workspaceCreate'). Every notification type is documented as its own event in this reference."
          },
          "initiatorId": {
            "type": "string",
            "format": "uuid",
            "description": "ID of the user or system that initiated the event. Null if initiatorType is 'system'."
          },
          "initiatorType": {
            "type": "string",
            "enum": [
              "user",
              "system"
            ],
            "description": "Type of initiator (user or system)."
          },
          "initiator": {
            "type": "object",
            "description": "Populated initiator user object (if initiatorType is 'user').",
            "nullable": true
          },
          "resourceId": {
            "type": "string",
            "format": "uuid",
            "description": "ID of the primary resource this notification pertains to."
          },
          "resourceType": {
            "type": "string",
            "description": "Type of the primary resource this notification pertains to."
          },
          "channels": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "The specific channels this notification was published on. Present on notification objects returned by the REST API only; the socket 'notification' payload omits it (and id)."
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "description": "Timestamp when the notification was created."
          }
        },
        "required": [
          "type",
          "initiatorType",
          "resourceId",
          "resourceType",
          "createdAt"
        ]
      }
    },
    "securitySchemes": {
      "handshakeToken": {
        "type": "httpApiKey",
        "name": "token",
        "in": "query",
        "description": "Socket.IO handshake query parameter (`io(url, { query: { token } })`): a user JWT, a personal access token or a bot API key (bot keys must connect through a configured bot gateway hostname). Not needed on `/public/{token}` namespaces. Invalid credentials or a missing permission fail the connection with `connect_error` \"forbidden\"; a malformed namespace or permission lookup error with \"badRequest\"."
      }
    }
  }
}