import type { Expand, GenericActionCtx, NamedTableInfo, VectorIndexNames, VectorSearchQuery, } from "convex/server"; import type { GenericId } from "convex/values"; import * as Context from "effect/Context"; import * as Effect from "effect/Effect"; import * as Layer from "effect/Layer"; import type * as DataModel from "./DataModel"; type ConvexVectorSearch = GenericActionCtx>["vectorSearch"]; /** * The service shape backing the `VectorSearch` tag. Named so declaration emit * references it instead of expanding the call signature at every usage. */ export interface VectorSearchService< DataModel_ extends DataModel.AnyWithProps, > { < TableName extends DataModel.TableNames, IndexName extends VectorIndexNames< NamedTableInfo, TableName> >, >( tableName: TableName, indexName: IndexName, query: Expand< VectorSearchQuery< NamedTableInfo, TableName>, IndexName > >, ): Effect.Effect; _score: number }>>; } export type VectorSearchTag = Context.Service< VectorSearchService, VectorSearchService >; export const make = ( vectorSearch: ConvexVectorSearch, ): VectorSearchService => (tableName, indexName, query) => Effect.promise(() => vectorSearch(tableName, indexName, query)); export const VectorSearch = < DataModel_ extends DataModel.AnyWithProps, >(): VectorSearchTag => Context.Service>( "@confect/server/VectorSearch", ); export type VectorSearch = VectorSearchService; export const layer = ( vectorSearch: ConvexVectorSearch, ) => Layer.succeed(VectorSearch(), make(vectorSearch));