{"version":3,"file":"convex.cjs","names":["BaseStore"],"sources":["../../src/storage/convex.ts"],"sourcesContent":["import {\n  FieldPaths,\n  FunctionReference,\n  GenericActionCtx,\n  GenericDataModel,\n  NamedTableInfo,\n  TableNamesInDataModel,\n  VectorIndexNames,\n  makeFunctionReference,\n} from \"convex/server\";\nimport { Value } from \"convex/values\";\nimport { BaseStore } from \"@langchain/core/stores\";\n\n/**\n * Type that defines the config required to initialize the\n * ConvexKVStore class. It includes the table name,\n * index name, field name.\n */\nexport type ConvexKVStoreConfig<\n  DataModel extends GenericDataModel,\n  TableName extends TableNamesInDataModel<DataModel>,\n  IndexName extends VectorIndexNames<NamedTableInfo<DataModel, TableName>>,\n  KeyFieldName extends FieldPaths<NamedTableInfo<DataModel, TableName>>,\n  ValueFieldName extends FieldPaths<NamedTableInfo<DataModel, TableName>>,\n  UpsertMutation extends FunctionReference<\n    \"mutation\",\n    \"internal\",\n    { table: string; document: object }\n  >,\n  LookupQuery extends FunctionReference<\n    \"query\",\n    \"internal\",\n    { table: string; index: string; keyField: string; key: string },\n    object[]\n  >,\n  DeleteManyMutation extends FunctionReference<\n    \"mutation\",\n    \"internal\",\n    { table: string; index: string; keyField: string; key: string }\n  >,\n> = {\n  readonly ctx: GenericActionCtx<DataModel>;\n  /**\n   * Defaults to \"cache\"\n   */\n  readonly table?: TableName;\n  /**\n   * Defaults to \"byKey\"\n   */\n  readonly index?: IndexName;\n  /**\n   * Defaults to \"key\"\n   */\n  readonly keyField?: KeyFieldName;\n  /**\n   * Defaults to \"value\"\n   */\n  readonly valueField?: ValueFieldName;\n  /**\n   * Defaults to `internal.langchain.db.upsert`\n   */\n  readonly upsert?: UpsertMutation;\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\n/**\n * Class that extends the BaseStore class to interact with a Convex\n * database. It provides methods for getting, setting, and deleting key value pairs,\n * as well as yielding keys from the database.\n */\nexport class ConvexKVStore<\n  T extends Value,\n  DataModel extends GenericDataModel,\n  TableName extends TableNamesInDataModel<DataModel>,\n  IndexName extends VectorIndexNames<NamedTableInfo<DataModel, TableName>>,\n  KeyFieldName extends FieldPaths<NamedTableInfo<DataModel, TableName>>,\n  ValueFieldName extends FieldPaths<NamedTableInfo<DataModel, TableName>>,\n  UpsertMutation extends FunctionReference<\n    \"mutation\",\n    \"internal\",\n    { table: string; document: object }\n  >,\n  LookupQuery extends FunctionReference<\n    \"query\",\n    \"internal\",\n    { table: string; index: string; keyField: string; key: string },\n    object[]\n  >,\n  DeleteManyMutation extends FunctionReference<\n    \"mutation\",\n    \"internal\",\n    { table: string; index: string; keyField: string; key: string }\n  >,\n> extends BaseStore<string, T> {\n  lc_namespace = [\"langchain\", \"storage\", \"convex\"];\n\n  private readonly ctx: GenericActionCtx<DataModel>;\n\n  private readonly table: TableName;\n\n  private readonly index: IndexName;\n\n  private readonly keyField: KeyFieldName;\n\n  private readonly valueField: ValueFieldName;\n\n  private readonly upsert: UpsertMutation;\n\n  private readonly lookup: LookupQuery;\n\n  private readonly deleteMany: DeleteManyMutation;\n\n  constructor(\n    config: ConvexKVStoreConfig<\n      DataModel,\n      TableName,\n      IndexName,\n      KeyFieldName,\n      ValueFieldName,\n      UpsertMutation,\n      LookupQuery,\n      DeleteManyMutation\n    >\n  ) {\n    super(config);\n    this.ctx = config.ctx;\n    this.table = config.table ?? (\"cache\" as TableName);\n    this.index = config.index ?? (\"byKey\" as IndexName);\n    this.keyField = config.keyField ?? (\"key\" as KeyFieldName);\n    this.valueField = config.valueField ?? (\"value\" as ValueFieldName);\n    this.upsert =\n      // oxlint-disable-next-line typescript/no-explicit-any\n      config.upsert ?? (makeFunctionReference(\"langchain/db:upsert\") as any);\n    this.lookup =\n      // oxlint-disable-next-line typescript/no-explicit-any\n      config.lookup ?? (makeFunctionReference(\"langchain/db:lookup\") as any);\n    this.deleteMany =\n      config.deleteMany ??\n      // oxlint-disable-next-line typescript/no-explicit-any\n      (makeFunctionReference(\"langchain/db:deleteMany\") as any);\n  }\n\n  /**\n   * Gets multiple keys from the Convex database.\n   * @param keys Array of keys to be retrieved.\n   * @returns An array of retrieved values.\n   */\n  async mget(keys: string[]) {\n    return (await Promise.all(\n      keys.map(async (key) => {\n        const found = (await this.ctx.runQuery(this.lookup, {\n          table: this.table,\n          index: this.index,\n          keyField: this.keyField,\n          key,\n          // oxlint-disable-next-line typescript/no-explicit-any\n        } as any)) as any;\n        return found.length > 0 ? found[0][this.valueField] : undefined;\n      })\n    )) as (T | undefined)[];\n  }\n\n  /**\n   * Sets multiple keys in the Convex database.\n   * @param keyValuePairs Array of key-value pairs to be set.\n   * @returns Promise that resolves when all keys have been set.\n   */\n  async mset(keyValuePairs: [string, T][]): Promise<void> {\n    // TODO: Remove chunking when Convex handles the concurrent requests correctly\n    const PAGE_SIZE = 16;\n    for (let i = 0; i < keyValuePairs.length; i += PAGE_SIZE) {\n      await Promise.all(\n        keyValuePairs.slice(i, i + PAGE_SIZE).map(([key, value]) =>\n          this.ctx.runMutation(this.upsert, {\n            table: this.table,\n            index: this.index,\n            keyField: this.keyField,\n            key,\n            document: { [this.keyField]: key, [this.valueField]: value },\n            // oxlint-disable-next-line typescript/no-explicit-any\n          } as any)\n        )\n      );\n    }\n  }\n\n  /**\n   * Deletes multiple keys from the Convex database.\n   * @param keys Array of keys to be deleted.\n   * @returns Promise that resolves when all keys have been deleted.\n   */\n  async mdelete(keys: string[]): Promise<void> {\n    await Promise.all(\n      keys.map((key) =>\n        this.ctx.runMutation(this.deleteMany, {\n          table: this.table,\n          index: this.index,\n          keyField: this.keyField,\n          key,\n          // oxlint-disable-next-line typescript/no-explicit-any\n        } as any)\n      )\n    );\n  }\n\n  /**\n   * Yields keys from the Convex database.\n   * @param prefix Optional prefix to filter the keys.\n   * @returns An AsyncGenerator that yields keys from the Convex database.\n   */\n  // eslint-disable-next-line require-yield\n  async *yieldKeys(_prefix?: string): AsyncGenerator<string> {\n    throw new Error(\"yieldKeys not implemented yet for ConvexKVStore\");\n  }\n}\n"],"mappings":";;;;;;;;;;;AA6EA,IAAa,gBAAb,cAuBUA,uBAAAA,UAAqB;CAC7B,eAAe;EAAC;EAAa;EAAW;EAAS;CAEjD;CAEA;CAEA;CAEA;CAEA;CAEA;CAEA;CAEA;CAEA,YACE,QAUA;AACA,QAAM,OAAO;AACb,OAAK,MAAM,OAAO;AAClB,OAAK,QAAQ,OAAO,SAAU;AAC9B,OAAK,QAAQ,OAAO,SAAU;AAC9B,OAAK,WAAW,OAAO,YAAa;AACpC,OAAK,aAAa,OAAO,cAAe;AACxC,OAAK,SAEH,OAAO,WAAA,GAAA,cAAA,uBAAiC,sBAAsB;AAChE,OAAK,SAEH,OAAO,WAAA,GAAA,cAAA,uBAAiC,sBAAsB;AAChE,OAAK,aACH,OAAO,eAAA,GAAA,cAAA,uBAEgB,0BAA0B;;;;;;;CAQrD,MAAM,KAAK,MAAgB;AACzB,SAAQ,MAAM,QAAQ,IACpB,KAAK,IAAI,OAAO,QAAQ;GACtB,MAAM,QAAS,MAAM,KAAK,IAAI,SAAS,KAAK,QAAQ;IAClD,OAAO,KAAK;IACZ,OAAO,KAAK;IACZ,UAAU,KAAK;IACf;IAED,CAAQ;AACT,UAAO,MAAM,SAAS,IAAI,MAAM,GAAG,KAAK,cAAc,KAAA;IACtD,CACH;;;;;;;CAQH,MAAM,KAAK,eAA6C;EAEtD,MAAM,YAAY;AAClB,OAAK,IAAI,IAAI,GAAG,IAAI,cAAc,QAAQ,KAAK,UAC7C,OAAM,QAAQ,IACZ,cAAc,MAAM,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,KAAK,WAC/C,KAAK,IAAI,YAAY,KAAK,QAAQ;GAChC,OAAO,KAAK;GACZ,OAAO,KAAK;GACZ,UAAU,KAAK;GACf;GACA,UAAU;KAAG,KAAK,WAAW;KAAM,KAAK,aAAa;IAAO;GAE7D,CAAQ,CACV,CACF;;;;;;;CASL,MAAM,QAAQ,MAA+B;AAC3C,QAAM,QAAQ,IACZ,KAAK,KAAK,QACR,KAAK,IAAI,YAAY,KAAK,YAAY;GACpC,OAAO,KAAK;GACZ,OAAO,KAAK;GACZ,UAAU,KAAK;GACf;GAED,CAAQ,CACV,CACF;;;;;;;CASH,OAAO,UAAU,SAA0C;AACzD,QAAM,IAAI,MAAM,kDAAkD"}