{"version":3,"file":"convex.cjs","names":["BaseListChatMessageHistory","config: ConvexChatMessageHistoryInput<\n      DataModel,\n      TableName,\n      IndexName,\n      SessionIdFieldName,\n      MessageTextFieldName,\n      InsertMutation,\n      LookupQuery,\n      DeleteManyMutation\n    >","convexDocuments: any[]","message: BaseMessage","message"],"sources":["../../../src/stores/message/convex.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport {\n  DocumentByInfo,\n  DocumentByName,\n  FieldPaths,\n  FunctionReference,\n  GenericActionCtx,\n  GenericDataModel,\n  NamedTableInfo,\n  TableNamesInDataModel,\n  IndexNames,\n  makeFunctionReference,\n} from \"convex/server\";\nimport { BaseListChatMessageHistory } from \"@langchain/core/chat_history\";\nimport {\n  BaseMessage,\n  mapChatMessagesToStoredMessages,\n  mapStoredMessagesToChatMessages,\n} from \"@langchain/core/messages\";\n\n/**\n * Type that defines the config required to initialize the\n * ConvexChatMessageHistory class. At minimum it needs a sessionId\n * and an ActionCtx.\n */\nexport type ConvexChatMessageHistoryInput<\n  DataModel extends GenericDataModel,\n  TableName extends TableNamesInDataModel<DataModel> = \"messages\",\n  IndexName extends IndexNames<\n    NamedTableInfo<DataModel, TableName>\n  > = \"bySessionId\",\n  SessionIdFieldName extends FieldPaths<\n    NamedTableInfo<DataModel, TableName>\n  > = \"sessionId\",\n  MessageTextFieldName extends FieldPaths<\n    NamedTableInfo<DataModel, TableName>\n  > = \"message\",\n  InsertMutation extends FunctionReference<\n    \"mutation\",\n    \"internal\",\n    { table: string; document: object }\n  > = any,\n  LookupQuery extends FunctionReference<\n    \"query\",\n    \"internal\",\n    { table: string; index: string; keyField: string; key: string },\n    object[]\n  > = any,\n  DeleteManyMutation extends FunctionReference<\n    \"mutation\",\n    \"internal\",\n    { table: string; index: string; keyField: string; key: string }\n  > = any,\n> = {\n  readonly ctx: GenericActionCtx<DataModel>;\n  readonly sessionId: DocumentByName<DataModel, TableName>[SessionIdFieldName];\n  /**\n   * Defaults to \"messages\"\n   */\n  readonly table?: TableName;\n  /**\n   * Defaults to \"bySessionId\"\n   */\n  readonly index?: IndexName;\n  /**\n   * Defaults to \"sessionId\"\n   */\n  readonly sessionIdField?: SessionIdFieldName;\n  /**\n   * Defaults to \"message\"\n   */\n  readonly messageTextFieldName?: MessageTextFieldName;\n  /**\n   * Defaults to `internal.langchain.db.insert`\n   */\n  readonly insert?: InsertMutation;\n  /**\n   * Defaults to `internal.langchain.db.lookup`\n   */\n  readonly lookup?: LookupQuery;\n  /**\n   * Defaults to `internal.langchain.db.deleteMany`\n   */\n  readonly deleteMany?: DeleteManyMutation;\n};\n\nexport class ConvexChatMessageHistory<\n  DataModel extends GenericDataModel,\n  SessionIdFieldName extends FieldPaths<\n    NamedTableInfo<DataModel, TableName>\n  > = \"sessionId\",\n  TableName extends TableNamesInDataModel<DataModel> = \"messages\",\n  IndexName extends IndexNames<\n    NamedTableInfo<DataModel, TableName>\n  > = \"bySessionId\",\n  MessageTextFieldName extends FieldPaths<\n    NamedTableInfo<DataModel, TableName>\n  > = \"message\",\n  InsertMutation extends FunctionReference<\n    \"mutation\",\n    \"internal\",\n    { table: string; document: object }\n  > = any,\n  LookupQuery extends FunctionReference<\n    \"query\",\n    \"internal\",\n    { table: string; index: string; keyField: string; key: string },\n    object[]\n  > = any,\n  DeleteManyMutation extends FunctionReference<\n    \"mutation\",\n    \"internal\",\n    { table: string; index: string; keyField: string; key: string }\n  > = any,\n> extends BaseListChatMessageHistory {\n  lc_namespace = [\"langchain\", \"stores\", \"message\", \"convex\"];\n\n  private readonly ctx: GenericActionCtx<DataModel>;\n\n  private readonly sessionId: DocumentByInfo<\n    NamedTableInfo<DataModel, TableName>\n  >[SessionIdFieldName];\n\n  private readonly table: TableName;\n\n  private readonly index: IndexName;\n\n  private readonly sessionIdField: SessionIdFieldName;\n\n  private readonly messageTextFieldName: MessageTextFieldName;\n\n  private readonly insert: InsertMutation;\n\n  private readonly lookup: LookupQuery;\n\n  private readonly deleteMany: DeleteManyMutation;\n\n  constructor(\n    config: ConvexChatMessageHistoryInput<\n      DataModel,\n      TableName,\n      IndexName,\n      SessionIdFieldName,\n      MessageTextFieldName,\n      InsertMutation,\n      LookupQuery,\n      DeleteManyMutation\n    >\n  ) {\n    super();\n    this.ctx = config.ctx;\n    this.sessionId = config.sessionId;\n    this.table = config.table ?? (\"messages\" as TableName);\n    this.index = config.index ?? (\"bySessionId\" as IndexName);\n    this.sessionIdField =\n      config.sessionIdField ?? (\"sessionId\" as SessionIdFieldName);\n    this.messageTextFieldName =\n      config.messageTextFieldName ?? (\"message\" as MessageTextFieldName);\n    this.insert =\n      config.insert ?? (makeFunctionReference(\"langchain/db:insert\") as any);\n    this.lookup =\n      config.lookup ?? (makeFunctionReference(\"langchain/db:lookup\") as any);\n    this.deleteMany =\n      config.deleteMany ??\n      (makeFunctionReference(\"langchain/db:deleteMany\") as any);\n  }\n\n  async getMessages(): Promise<BaseMessage[]> {\n    const convexDocuments: any[] = await this.ctx.runQuery(this.lookup, {\n      table: this.table,\n      index: this.index,\n      keyField: this.sessionIdField,\n      key: this.sessionId,\n    } as any);\n\n    return mapStoredMessagesToChatMessages(\n      convexDocuments.map((doc) => doc[this.messageTextFieldName])\n    );\n  }\n\n  async addMessage(message: BaseMessage): Promise<void> {\n    const messages = mapChatMessagesToStoredMessages([message]);\n    // TODO: Remove chunking when Convex handles the concurrent requests correctly\n    const PAGE_SIZE = 16;\n    for (let i = 0; i < messages.length; i += PAGE_SIZE) {\n      await Promise.all(\n        messages.slice(i, i + PAGE_SIZE).map((message) =>\n          this.ctx.runMutation(this.insert, {\n            table: this.table,\n            document: {\n              [this.sessionIdField]: this.sessionId,\n              [this.messageTextFieldName]: message,\n            },\n          } as any)\n        )\n      );\n    }\n  }\n\n  async clear(): Promise<void> {\n    await this.ctx.runMutation(this.deleteMany, {\n      table: this.table,\n      index: this.index,\n      keyField: this.sessionIdField,\n      key: this.sessionId,\n    } as any);\n  }\n}\n"],"mappings":";;;;;;;;AAuFA,IAAa,2BAAb,cA4BUA,yDAA2B;CACnC,eAAe;EAAC;EAAa;EAAU;EAAW;CAAS;CAE3D,AAAiB;CAEjB,AAAiB;CAIjB,AAAiB;CAEjB,AAAiB;CAEjB,AAAiB;CAEjB,AAAiB;CAEjB,AAAiB;CAEjB,AAAiB;CAEjB,AAAiB;CAEjB,YACEC,QAUA;EACA,OAAO;EACP,KAAK,MAAM,OAAO;EAClB,KAAK,YAAY,OAAO;EACxB,KAAK,QAAQ,OAAO,SAAU;EAC9B,KAAK,QAAQ,OAAO,SAAU;EAC9B,KAAK,iBACH,OAAO,kBAAmB;EAC5B,KAAK,uBACH,OAAO,wBAAyB;EAClC,KAAK,SACH,OAAO,mDAAiC,sBAAsB;EAChE,KAAK,SACH,OAAO,mDAAiC,sBAAsB;EAChE,KAAK,aACH,OAAO,uDACgB,0BAA0B;CACpD;CAED,MAAM,cAAsC;EAC1C,MAAMC,kBAAyB,MAAM,KAAK,IAAI,SAAS,KAAK,QAAQ;GAClE,OAAO,KAAK;GACZ,OAAO,KAAK;GACZ,UAAU,KAAK;GACf,KAAK,KAAK;EACX,EAAQ;AAET,wEACE,gBAAgB,IAAI,CAAC,QAAQ,IAAI,KAAK,sBAAsB,CAC7D;CACF;CAED,MAAM,WAAWC,SAAqC;EACpD,MAAM,0EAA2C,CAAC,OAAQ,EAAC;EAE3D,MAAM,YAAY;AAClB,OAAK,IAAI,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK,WACxC,MAAM,QAAQ,IACZ,SAAS,MAAM,GAAG,IAAI,UAAU,CAAC,IAAI,CAACC,cACpC,KAAK,IAAI,YAAY,KAAK,QAAQ;GAChC,OAAO,KAAK;GACZ,UAAU;KACP,KAAK,iBAAiB,KAAK;KAC3B,KAAK,uBAAuBA;GAC9B;EACF,EAAQ,CACV,CACF;CAEJ;CAED,MAAM,QAAuB;EAC3B,MAAM,KAAK,IAAI,YAAY,KAAK,YAAY;GAC1C,OAAO,KAAK;GACZ,OAAO,KAAK;GACZ,UAAU,KAAK;GACf,KAAK,KAAK;EACX,EAAQ;CACV;AACF"}