{"version":3,"sources":["../../src/llm/remote_chat_context.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2025 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { ChatContext } from './chat_context.js';\nimport type { ChatItem } from './chat_context.js';\n\nexport interface RemoteChatItem {\n  item: ChatItem;\n  /** @internal */\n  _prev?: RemoteChatItem | null;\n  /** @internal */\n  _next?: RemoteChatItem | null;\n}\n\nexport class RemoteChatContext {\n  private head?: RemoteChatItem | null;\n  private tail?: RemoteChatItem | null;\n  private idToItem: Record<string, RemoteChatItem> = {};\n\n  toChatCtx(): ChatContext {\n    const items: ChatItem[] = [];\n    let currentNode = this.head;\n    while (currentNode) {\n      items.push(currentNode.item);\n      currentNode = currentNode._next;\n    }\n\n    return new ChatContext(items);\n  }\n\n  get(itemId: string): RemoteChatItem | null {\n    return this.idToItem[itemId] ?? null;\n  }\n\n  /**\n   * Insert `message` after the node with ID `previousItemId`.\n   * If `previousItemId` is undefined, insert at the head.\n   * @param previousItemId - The ID of the item after which to insert the new item.\n   * @param message - The item to insert.\n   */\n  insert(previousItemId: string | undefined, message: ChatItem): void {\n    const itemId = message.id;\n\n    if (itemId in this.idToItem) {\n      throw new Error(`Item with ID ${itemId} already exists.`);\n    }\n\n    const newNode: RemoteChatItem = { item: message };\n\n    if (!previousItemId) {\n      if (this.head) {\n        newNode._next = this.head;\n        this.head._prev = newNode;\n      } else {\n        this.tail = newNode;\n      }\n      this.head = newNode;\n      this.idToItem[itemId] = newNode;\n      return;\n    }\n\n    const prevNode = this.idToItem[previousItemId];\n    if (!prevNode) {\n      throw new Error(`previousItemId ${previousItemId} not found`);\n    }\n\n    newNode._prev = prevNode;\n    newNode._next = prevNode._next;\n\n    prevNode._next = newNode;\n\n    if (newNode._next) {\n      newNode._next._prev = newNode;\n    } else {\n      this.tail = newNode;\n    }\n\n    this.idToItem[itemId] = newNode;\n  }\n\n  delete(itemId: string): void {\n    const node = this.idToItem[itemId];\n    if (!node) {\n      throw new Error(`Item with ID ${itemId} not found`);\n    }\n\n    const prevNode = node._prev;\n    const nextNode = node._next;\n\n    if (this.head === node) {\n      this.head = nextNode;\n      if (this.head) {\n        this.head._prev = undefined;\n      }\n    } else {\n      if (prevNode) {\n        prevNode._next = nextNode;\n      }\n    }\n\n    if (this.tail === node) {\n      this.tail = prevNode;\n      if (this.tail) {\n        this.tail._next = undefined;\n      }\n    } else {\n      if (nextNode) {\n        nextNode._prev = prevNode;\n      }\n    }\n\n    delete this.idToItem[itemId];\n  }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,0BAA4B;AAWrB,MAAM,kBAAkB;AAAA,EACrB;AAAA,EACA;AAAA,EACA,WAA2C,CAAC;AAAA,EAEpD,YAAyB;AACvB,UAAM,QAAoB,CAAC;AAC3B,QAAI,cAAc,KAAK;AACvB,WAAO,aAAa;AAClB,YAAM,KAAK,YAAY,IAAI;AAC3B,oBAAc,YAAY;AAAA,IAC5B;AAEA,WAAO,IAAI,gCAAY,KAAK;AAAA,EAC9B;AAAA,EAEA,IAAI,QAAuC;AACzC,WAAO,KAAK,SAAS,MAAM,KAAK;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,gBAAoC,SAAyB;AAClE,UAAM,SAAS,QAAQ;AAEvB,QAAI,UAAU,KAAK,UAAU;AAC3B,YAAM,IAAI,MAAM,gBAAgB,MAAM,kBAAkB;AAAA,IAC1D;AAEA,UAAM,UAA0B,EAAE,MAAM,QAAQ;AAEhD,QAAI,CAAC,gBAAgB;AACnB,UAAI,KAAK,MAAM;AACb,gBAAQ,QAAQ,KAAK;AACrB,aAAK,KAAK,QAAQ;AAAA,MACpB,OAAO;AACL,aAAK,OAAO;AAAA,MACd;AACA,WAAK,OAAO;AACZ,WAAK,SAAS,MAAM,IAAI;AACxB;AAAA,IACF;AAEA,UAAM,WAAW,KAAK,SAAS,cAAc;AAC7C,QAAI,CAAC,UAAU;AACb,YAAM,IAAI,MAAM,kBAAkB,cAAc,YAAY;AAAA,IAC9D;AAEA,YAAQ,QAAQ;AAChB,YAAQ,QAAQ,SAAS;AAEzB,aAAS,QAAQ;AAEjB,QAAI,QAAQ,OAAO;AACjB,cAAQ,MAAM,QAAQ;AAAA,IACxB,OAAO;AACL,WAAK,OAAO;AAAA,IACd;AAEA,SAAK,SAAS,MAAM,IAAI;AAAA,EAC1B;AAAA,EAEA,OAAO,QAAsB;AAC3B,UAAM,OAAO,KAAK,SAAS,MAAM;AACjC,QAAI,CAAC,MAAM;AACT,YAAM,IAAI,MAAM,gBAAgB,MAAM,YAAY;AAAA,IACpD;AAEA,UAAM,WAAW,KAAK;AACtB,UAAM,WAAW,KAAK;AAEtB,QAAI,KAAK,SAAS,MAAM;AACtB,WAAK,OAAO;AACZ,UAAI,KAAK,MAAM;AACb,aAAK,KAAK,QAAQ;AAAA,MACpB;AAAA,IACF,OAAO;AACL,UAAI,UAAU;AACZ,iBAAS,QAAQ;AAAA,MACnB;AAAA,IACF;AAEA,QAAI,KAAK,SAAS,MAAM;AACtB,WAAK,OAAO;AACZ,UAAI,KAAK,MAAM;AACb,aAAK,KAAK,QAAQ;AAAA,MACpB;AAAA,IACF,OAAO;AACL,UAAI,UAAU;AACZ,iBAAS,QAAQ;AAAA,MACnB;AAAA,IACF;AAEA,WAAO,KAAK,SAAS,MAAM;AAAA,EAC7B;AACF;","names":[]}