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). 


    **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). 


    **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). 


    **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. 


    Each 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.

        Test event payload. Changes key structure will depend on test scenario.

        Delivered 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.


        Payload for the notificationUpdate event.


        Delivered 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.


        Payload for the workspace create event. Includes new workspace object in changes.create array.


        Delivered as the `notification` socket event with `type` set to `workspaceCreate`.


        Token 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.


        Payload for the workspace name change event.


        Delivered as the `notification` socket event with `type` set to `workspaceUpdate`.


        Token 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.


        Payload for the workspace delete event.


        Delivered as the `notification` socket event with `type` set to `workspaceDelete`.


        Token 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.


        Payload for the workspace logo update event.


        Delivered as the `notification` socket event with `type` set to `workspaceLogoUpdate`.


        Token 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.


        Payload for the project create event.


        Delivered as the `notification` socket event with `type` set to `projectCreate`.


        Token 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.


        Payload for the project name change event.


        Delivered as the `notification` socket event with `type` set to `projectUpdate`.


        Token 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.


        Payload for the project delete event.


        Delivered as the `notification` socket event with `type` set to `projectDelete`.


        Token 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.


        Payload for the projectLogoUpdate event.


        Delivered as the `notification` socket event with `type` set to `projectLogoUpdate`.


        Token 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.


        Payload for the project assets publish event.


        Delivered as the `notification` socket event with `type` set to `projectAssetsPublish`.


        Token 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.


        Payload for the project assets unpublish event.


        Delivered as the `notification` socket event with `type` set to `projectAssetsUnpublish`.


        Token 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.


        Payload for the asset name change event.


        Delivered as the `notification` socket event with `type` set to `assetNameChange`.


        Token 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.


        Payload for the assetPublish event.


        Delivered 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.

        Payload for the assetUnpublish event.

        Delivered 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.

        Payload for the assetTag event.

        Delivered 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.

        Payload for the assetUntag event.

        Delivered 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.


        Payload for the asset delete event.


        Delivered as the `notification` socket event with `type` set to `assetDelete`.


        Token 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).


        Payload for the asset status update event.


        Delivered as the `notification` socket event with `type` set to `assetStatusUpdate`.


        Token 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).

        Payload for the asset post-process update event.

        Delivered 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).


        Payload for the asset file update event.


        Delivered as the `notification` socket event with `type` set to `assetFileUpdate`.


        Token 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.


        Payload for the assetGroupUploadComplete event.


        Delivered as the `notification` socket event with `type` set to `assetGroupUploadComplete`.


        Token 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).


        Payload for the topic chat create event.


        Delivered as the `notification` socket event with `type` set to `chatTopicChatCreate`.


        Token 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.


        Payload for the member chat create event.


        Delivered as the `notification` socket event with `type` set to `chatMemberChatCreate`.


        Token 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.


        Payload for the topic chat subject update event.


        Delivered as the `notification` socket event with `type` set to `chatUpdateSubject`.


        Token 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.


        Payload for the chatMemberUpdate event.


        Delivered 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.


        Payload for the topic chat delete event.


        Delivered as the `notification` socket event with `type` set to `chatDelete`.


        Token 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.


        Payload for the member chat delete event.


        Delivered as the `notification` socket event with `type` set to `chatMemberDelete`.


        Token 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.


        Payload for the chatCreateMessage event.


        Delivered as the `notification` socket event with `type` set to `chatCreateMessage`.


        Token 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).


        Payload for the chatReviseMessage event.


        Delivered as the `notification` socket event with `type` set to `chatReviseMessage`.


        Token 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.


        Payload for the chatRefreshMessage event.


        Delivered as the `notification` socket event with `type` set to `chatRefreshMessage`.


        Token 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.


        Payload for the chatMention event.


        Delivered as the `notification` socket event with `type` set to `chatMention`.


        Token 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.


        Payload for the chatDeleteMessage event.


        Delivered as the `notification` socket event with `type` set to `chatDeleteMessage`.


        Token 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.


        Payload for the chat remove attachment event.


        Delivered as the `notification` socket event with `type` set to `chatRemoveAttachment`.


        Token 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.


        Payload for the folder create event.


        Delivered as the `notification` socket event with `type` set to `folderCreate`.


        Token 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.).


        Payload for the folder update event.


        Delivered as the `notification` socket event with `type` set to `folderUpdate`.


        Token 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.


        Payload for the folder delete event.


        Delivered as the `notification` socket event with `type` set to `folderDelete`.


        Token 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.


        Payload for the invite create event.


        Delivered as the `notification` socket event with `type` set to `inviteCreate`.


        Token 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.


        Payload for the invite cancel event.


        Delivered as the `notification` socket event with `type` set to `inviteCancel`.


        Token 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.


        Payload for the inviteAccept event.


        Delivered as the `notification` socket event with `type` set to `inviteAccept`.


        Token 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).


        Payload for the membership delete event.


        Delivered as the `notification` socket event with `type` set to `membershipDelete`.


        Token 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.


        Payload for the membership add role event.


        Delivered as the `notification` socket event with `type` set to `membershipAddRole`.


        Token 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.


        Payload for the membership remove role event.


        Delivered as the `notification` socket event with `type` set to `membershipRemoveRole`.


        Token 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.


        Payload for the membershipLeaveResource event.


        Delivered as the `notification` socket event with `type` set to `membershipLeaveResource`.


        Token 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.

        Payload for the workspace storage limit warning event.

        Delivered 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.


        Payload for the user self update event.


        Delivered as the `notification` socket event with `type` set to `userSelfUpdate`.


        Token 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.


        Payload for the user public update event.


        Delivered as the `notification` socket event with `type` set to `userPublicUpdate`.


        Token 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.


        Payload for the user deleted event.


        Delivered as the `notification` socket event with `type` set to `userDeleted`.


        Token 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.


        Payload for the user avatar update event.


        Delivered as the `notification` socket event with `type` set to `userAvatarUpdate`.


        Token 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.


        Payload for the logoUpdate event.


        Delivered as the `notification` socket event with `type` set to `logoUpdate`.


        Token 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.


        Payload for the iconUpdate event.


        Delivered as the `notification` socket event with `type` set to `iconUpdate`.


        Token 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.


        Payload for the task acknowledged event.


        Delivered as the `notification` socket event with `type` set to `taskAcknowledged`.


        Token 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.


        Payload for the task status update event.


        Delivered as the `notification` socket event with `type` set to `taskStatusUpdate`.


        Token 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.


        Payload for the task create event.


        Delivered as the `notification` socket event with `type` set to `taskCreate`.


        Token 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.


        Payload for the notification update last seen event.


        Delivered as the `notification` socket event with `type` set to `notificationUpdateLastSeen`.


        Token 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.


        Payload for the submissionCreate event.


        Delivered as the `notification` socket event with `type` set to `submissionCreate`.


        Token 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.

        Payload for the project items publish event.

        Delivered 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.

        Payload for the project items unpublish event.

        Delivered 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.


        Payload for the folder publish event.


        Delivered as the `notification` socket event with `type` set to `folderPublish`.


        Token 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.

        Payload for the folderTag event.

        Delivered 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.

        Payload for the folderUntag event.

        Delivered 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.


        Payload for the tag create event.


        Delivered as the `notification` socket event with `type` set to `tagCreate`.


        Token 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).


        Payload for the tag update event.


        Delivered as the `notification` socket event with `type` set to `tagUpdate`.


        Token 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.


        Payload for the tagDelete event.


        Delivered as the `notification` socket event with `type` set to `tagDelete`.


        Token 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.


        Payload for the fileSystemCreate event.


        Delivered 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.

        Payload for the fileSystemMove event.

        Delivered 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.

        Payload for the fileSystemCopy event.

        Delivered 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.

        Payload for the fileSystemDelete event.

        Delivered 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.


        Payload for the items published event.


        Delivered as the `notification` socket event with `type` set to `fileSystemPublish`.


        Token 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.


        Payload for the items unpublished event.


        Delivered as the `notification` socket event with `type` set to `fileSystemUnpublish`.


        Token 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}.


        Payload for the subscriptionCreate event.


        Delivered 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}.


        Payload for the subscriptionUpdate event.


        Delivered 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.


        Payload for the projectGroupItemPublish event.


        Delivered as the `notification` socket event with `type` set to `projectGroupItemPublish`.


        Token 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}.


        Payload for the publicAssetLinkCreate event.


        Delivered as the `notification` socket event with `type` set to `publicAssetLinkCreate`.


        Token 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.


        Payload for the uploadPushSummary event.


        Delivered 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.

        Payload for the publishPushSummary event.

        Delivered 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.

        Payload for the submissionPushSummary event.

        Delivered 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.

        Payload for the memberJoinPush event.

        Delivered 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.


        Payload for the chatMemberArchive event.


        Delivered as the `notification` socket event with `type` set to `chatMemberArchive`.


        Token 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.


        Payload for the chatMemberUnarchive event.


        Delivered as the `notification` socket event with `type` set to `chatMemberUnarchive`.


        Token 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.


        Payload for the chatHighlightMessage event.


        Delivered as the `notification` socket event with `type` set to `chatHighlightMessage`.


        Token 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.

        Payload for the chatFollow event.

        Delivered 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.

        Payload for the chatUnfollow event.

        Delivered 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}.

        Payload for the userEmailVerify event.

        Delivered 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}.


        Payload for the botCreate event.


        Delivered as the `notification` socket event with `type` set to `botCreate`.


        Token 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.


        Payload for the webhookTest event.


        Delivered 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.


        Payload for the taskFollow event.


        Delivered as the `notification` socket event with `type` set to `taskFollow`.


        Token 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.


        Payload for the taskUnfollow event.


        Delivered as the `notification` socket event with `type` set to `taskUnfollow`.


        Token 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.


        Payload for the submissionUpdate event.


        Delivered as the `notification` socket event with `type` set to `submissionUpdate`.


        Token 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.

        Payload for the submissionTag event.

        Delivered 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.

        Payload for the submissionUntag event.

        Delivered 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.


        Payload for the aiChatTopicCreate event.


        Delivered as the `notification` socket event with `type` set to `aiChatTopicCreate`.


        Token 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.


        Payload for the aiChatTopicUpdate event.


        Delivered as the `notification` socket event with `type` set to `aiChatTopicUpdate`.


        Token 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.


        Payload for the aiChatMessageCreate event.


        Delivered as the `notification` socket event with `type` set to `aiChatMessageCreate`.


        Token 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.

        Payload for the publicFileSystemCreate event.

        Delivered 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.


        Payload for the publicFileSystemUpdate event.


        Delivered 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.

        Payload for the publicFileSystemDelete event.

        Delivered 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.

        Payload for the settingsUpdate event.

        Delivered 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.


        Payload for the convoStart event.


        Delivered as the `notification` socket event with `type` set to `convoStart`.


        Token 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.


        Payload for the convoJoin event.


        Delivered as the `notification` socket event with `type` set to `convoJoin`.


        Token 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.


        Payload for the convoLeave event.


        Delivered as the `notification` socket event with `type` set to `convoLeave`.


        Token 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).


        Payload for the convoComplete event.


        Delivered as the `notification` socket event with `type` set to `convoComplete`.


        Token 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).


        Payload for the convoUpdate event.


        Delivered as the `notification` socket event with `type` set to `convoUpdate`.


        Token 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.


        Payload for the convoDelete event.


        Delivered as the `notification` socket event with `type` set to `convoDelete`.


        Token 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.


        Payload for the convoParticipantJoined event.


        Delivered as the `notification` socket event with `type` set to `convoParticipantJoined`.


        Token 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.


        Payload for the convoParticipantLeft event.


        Delivered as the `notification` socket event with `type` set to `convoParticipantLeft`.


        Token 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.


        Payload for the convoHandover event.


        Delivered as the `notification` socket event with `type` set to `convoHandover`.


        Token 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.


        Payload for the boardCreate event.


        Delivered as the `notification` socket event with `type` set to `boardCreate`.


        Token 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).


        Payload for the boardUpdate event.


        Delivered as the `notification` socket event with `type` set to `boardUpdate`.


        Token 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.


        Payload for the boardDelete event.


        Delivered as the `notification` socket event with `type` set to `boardDelete`.


        Token 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.


        Payload for the boardTaskCreate event.


        Delivered as the `notification` socket event with `type` set to `boardTaskCreate`.


        Token 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.


        Payload for the boardTaskMove event.


        Delivered as the `notification` socket event with `type` set to `boardTaskMove`.


        Token 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}.


        Payload for the boardTaskAssign event.


        Delivered as the `notification` socket event with `type` set to `boardTaskAssign`.


        Token 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.


        Payload for the boardColumnAdd event.


        Delivered as the `notification` socket event with `type` set to `boardColumnAdd`.


        Token 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.


        Payload for the boardColumnUpdate event.


        Delivered as the `notification` socket event with `type` set to `boardColumnUpdate`.


        Token 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.


        Payload for the boardColumnDelete event.


        Delivered as the `notification` socket event with `type` set to `boardColumnDelete`.


        Token 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.


        Payload for the boardColumnReorder event.


        Delivered as the `notification` socket event with `type` set to `boardColumnReorder`.


        Token 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.


        Payload for the boardTaskAdd event.


        Delivered as the `notification` socket event with `type` set to `boardTaskAdd`.


        Token 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).


        Payload for the boardTaskRemove event.


        Delivered as the `notification` socket event with `type` set to `boardTaskRemove`.


        Token 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.).


        Payload for the boardTaskUpdate event.


        Delivered as the `notification` socket event with `type` set to `boardTaskUpdate`.


        Token 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.


        Payload for the boardTaskLink event.


        Delivered as the `notification` socket event with `type` set to `boardTaskLink`.


        Token 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.


        Payload for the boardTaskUnlink event.


        Delivered as the `notification` socket event with `type` set to `boardTaskUnlink`.


        Token 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.


        Payload for the boardTaskRelationAdd event.


        Delivered as the `notification` socket event with `type` set to `boardTaskRelationAdd`.


        Token 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).


        Payload for the boardTaskRelationRemove event.


        Delivered as the `notification` socket event with `type` set to `boardTaskRelationRemove`.


        Token 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.


        Payload for the boardFollow event.


        Delivered as the `notification` socket event with `type` set to `boardFollow`.


        Token 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.


        Payload for the boardUnfollow event.


        Delivered as the `notification` socket event with `type` set to `boardUnfollow`.


        Token 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.


        Payload 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.


        Payload 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.


        Acknowledgement 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.


        Payload 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.

        Payload 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.


        Payload 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.


        Payload 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.


        Payload 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.


        Payload 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.


        Payload 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.


        Payload 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.


        Payload 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.


        Payload 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.


        Payload 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.


        Payload 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.


        Payload 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.


        Payload 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.


        Payload 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.


        Payload 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.

        Payload 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).


        Payload 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.

        Payload 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.


        Payload 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.


        Client -> 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.


        Payload 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.


        Payload 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.

        Payload 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.


        Payload 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".
