Aggregation with Concatenation

I have an index (see below) which stores RTT (Realtime Text) - every time someone types a letter within a conversation, it is stored as a document as a "typed" event. If someone deletes the letter, it will be stored as a document with "deleted" event. When the user sends the message to another user - it will be stored as "pressed" event.
My use case is to present the conversation to the end-user in a readable format. for example querying the documents, provided below should return "Hello" for User1 and "Hi" for User2 with the respective time, when each started their conversation. I believe I can do it quite quickly in SQL DBs, but I do not have sufficient experience to do it using Elasticsearch - any help will be truly appreciated.

POST /recorded-rtt-index/_doc
{
  "docs": [
    {
      "textSessionId": "9c3321f0-34f9-ed11-907c-000d3a3a4d73",
      "timeStamp": "2025-01-22T14:00:00Z",
      "user": "User1",
      "event": "typed",
      "character": "H"
    },
    {
      "textSessionId": "9c3321f0-34f9-ed11-907c-000d3a3a4d73",
      "timeStamp": "2025-01-22T14:00:01Z",
      "user": "User1",
      "event": "typed",
      "character": "e"
    },
    {
      "textSessionId": "9c3321f0-34f9-ed11-907c-000d3a3a4d73",
      "timeStamp": "2025-01-22T14:00:02Z",
      "user": "User1",
      "event": "typed",
      "character": "l"
    },
    {
      "textSessionId": "9c3321f0-34f9-ed11-907c-000d3a3a4d73",
      "timeStamp": "2025-01-22T14:00:02Z",
      "user": "User1",
      "event": "typed",
      "character": "l"
    },
    {
      "textSessionId": "9c3321f0-34f9-ed11-907c-000d3a3a4d73",
      "timeStamp": "2025-01-22T14:00:03Z",
      "user": "User1",
      "event": "typed",
      "character": "o"
    },
    {
      "textSessionId": "9c3321f0-34f9-ed11-907c-000d3a3a4d73",
      "timeStamp": "2025-01-22T14:00:03Z",
      "user": "User1",
      "event": "pressed",
      "key": "Enter"
    },
    {
      "textSessionId": "9c3321f0-34f9-ed11-907c-000d3a3a4d73",
      "timeStamp": "2025-01-22T14:00:04Z",
      "user": "User2",
      "event": "typed",
      "character": "H"
    },
    {
      "textSessionId": "9c3321f0-34f9-ed11-907c-000d3a3a4d73",
      "timeStamp": "2025-01-22T14:00:05Z",
      "user": "User2",
      "event": "typed",
      "character": "e"
    },
    {
      "textSessionId": "9c3321f0-34f9-ed11-907c-000d3a3a4d73",
      "timeStamp": "2025-01-22T14:00:06Z",
      "user": "User2",
      "event": "typed",
      "character": "l"
    },
    {
      "textSessionId": "9c3321f0-34f9-ed11-907c-000d3a3a4d73",
      "timeStamp": "2025-01-22T14:00:07Z",
      "user": "User2",
      "event": "deleted",
      "character": "l"
    },
    {
      "textSessionId": "9c3321f0-34f9-ed11-907c-000d3a3a4d73",
      "timeStamp": "2025-01-22T14:00:08Z",
      "user": "User2",
      "event": "deleted",
      "character": "e"
    },
    {
      "textSessionId": "9c3321f0-34f9-ed11-907c-000d3a3a4d73",
      "timeStamp": "2025-01-22T14:00:08Z",
      "user": "User2",
      "event": "typed",
      "character": "i"
    },
    {
      "textSessionId": "9c3321f0-34f9-ed11-907c-000d3a3a4d73",
      "timeStamp": "2025-01-22T14:00:09Z",
      "user": "User2",
      "event": "pressed",
      "key": "Enter"
    }
  ]
}