{"version":3,"file":"remote.cjs","sources":["@gensx/storage/../../../../src/search/remote.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/only-throw-error */\n\nimport type {\n  NamespaceMetadata,\n  QueryResults,\n  Schema,\n} from \"@turbopuffer/turbopuffer\";\n\nimport { readConfig } from \"@gensx/core\";\n\nimport { USER_AGENT } from \"../utils/user-agent.js\";\nimport {\n  DeleteNamespaceResult,\n  EnsureNamespaceResult,\n  Namespace,\n  QueryOptions,\n  SearchStorage as ISearchStorage,\n  WriteParams,\n} from \"./types.js\";\n\n/**\n * Base URL for the GenSX Console API\n */\nconst API_BASE_URL = \"https://api.gensx.com\";\n\n/**\n * Error types for search operations\n */\nexport type SearchErrorCode =\n  | \"NOT_FOUND\"\n  | \"PERMISSION_DENIED\"\n  | \"INVALID_ARGUMENT\"\n  | \"SEARCH_ERROR\"\n  | \"NOT_IMPLEMENTED\"\n  | \"NETWORK_ERROR\";\n\n/**\n * Abstract base error class for search operations\n */\nexport abstract class SearchError extends Error {\n  constructor(\n    public readonly code: SearchErrorCode,\n    message: string,\n    public readonly cause?: Error,\n  ) {\n    super(message);\n    this.name = \"SearchError\";\n  }\n}\n\n/**\n * Error class for when a vector is not found\n */\nexport class SearchNotFoundError extends SearchError {\n  constructor(message: string, cause?: Error) {\n    super(\"NOT_FOUND\", message, cause);\n    this.name = \"SearchNotFoundError\";\n  }\n}\n\n/**\n * Error class for permission denied errors\n */\nexport class SearchPermissionDeniedError extends SearchError {\n  constructor(message: string, cause?: Error) {\n    super(\"PERMISSION_DENIED\", message, cause);\n    this.name = \"SearchPermissionDeniedError\";\n  }\n}\n\n/**\n * Error class for invalid argument errors\n */\nexport class SearchInvalidArgumentError extends SearchError {\n  constructor(message: string, cause?: Error) {\n    super(\"INVALID_ARGUMENT\", message, cause);\n    this.name = \"SearchInvalidArgumentError\";\n  }\n}\n\n/**\n * Error class for API errors (bad requests, server errors, etc.)\n */\nexport class SearchApiError extends SearchError {\n  constructor(message: string, cause?: Error) {\n    super(\"SEARCH_ERROR\", message, cause);\n    this.name = \"SearchApiError\";\n  }\n}\n\n/**\n * Error class for malformed or missing API responses\n */\nexport class SearchResponseError extends SearchError {\n  constructor(message: string, cause?: Error) {\n    super(\"SEARCH_ERROR\", message, cause);\n    this.name = \"SearchResponseError\";\n  }\n}\n\n/**\n * Error class for not implemented errors\n */\nexport class SearchNotImplementedError extends SearchError {\n  constructor(message: string, cause?: Error) {\n    super(\"NOT_IMPLEMENTED\", message, cause);\n    this.name = \"SearchNotImplementedError\";\n  }\n}\n\n/**\n * Error class for network errors\n */\nexport class SearchNetworkError extends SearchError {\n  constructor(message: string, cause?: Error) {\n    super(\"NETWORK_ERROR\", message, cause);\n    this.name = \"SearchNetworkError\";\n  }\n}\n\n/**\n * Helper to convert API errors to more specific errors\n */\nfunction handleApiError(err: unknown, operation: string): never {\n  if (err instanceof SearchError) {\n    throw err;\n  }\n  if (err instanceof Error) {\n    throw new SearchNetworkError(\n      `Error during ${operation}: ${err.message}`,\n      err,\n    );\n  }\n  throw new SearchNetworkError(`Error during ${operation}: ${String(err)}`);\n}\n\n/**\n * Remote implementation of vector namespace\n */\nexport class SearchNamespace implements Namespace {\n  constructor(\n    public readonly namespaceId: string,\n    private apiBaseUrl: string,\n    private apiKey: string,\n    private org: string,\n    private project: string,\n    private environment: string,\n  ) {}\n\n  async write({\n    upsertColumns,\n    upsertRows,\n    patchColumns,\n    patchRows,\n    deletes,\n    deleteByFilter,\n    distanceMetric,\n    schema,\n  }: WriteParams): Promise<number> {\n    try {\n      const response = await fetch(\n        `${this.apiBaseUrl}/org/${this.org}/projects/${this.project}/environments/${this.environment}/search/${encodeURIComponent(this.namespaceId)}/vectors`,\n        {\n          method: \"POST\",\n          headers: {\n            Authorization: `Bearer ${this.apiKey}`,\n            \"Content-Type\": \"application/json\",\n            \"User-Agent\": USER_AGENT,\n          },\n          body: JSON.stringify({\n            upsertColumns,\n            upsertRows,\n            patchColumns,\n            patchRows,\n            deletes,\n            deleteByFilter,\n            distanceMetric,\n            schema,\n          }),\n        },\n      );\n\n      if (!response.ok) {\n        throw new SearchApiError(response.statusText);\n      }\n\n      const data = (await response.json()) as { rowsAffected: number };\n      return data.rowsAffected;\n    } catch (err) {\n      if (!(err instanceof SearchError)) {\n        throw handleApiError(err, \"upsert\");\n      }\n      throw err;\n    }\n  }\n\n  async query({\n    vector,\n    distanceMetric,\n    topK,\n    includeVectors,\n    includeAttributes,\n    filters,\n    rankBy,\n    consistency,\n  }: QueryOptions): Promise<QueryResults> {\n    try {\n      const response = await fetch(\n        `${this.apiBaseUrl}/org/${this.org}/projects/${this.project}/environments/${this.environment}/search/${encodeURIComponent(this.namespaceId)}/query`,\n        {\n          method: \"POST\",\n          headers: {\n            Authorization: `Bearer ${this.apiKey}`,\n            \"Content-Type\": \"application/json\",\n            \"User-Agent\": USER_AGENT,\n          },\n          body: JSON.stringify({\n            vector,\n            distanceMetric,\n            topK: topK ?? 10,\n            includeVectors: includeVectors ?? false,\n            includeAttributes,\n            filters,\n            rankBy,\n            consistency,\n          }),\n        },\n      );\n\n      if (!response.ok) {\n        throw new SearchApiError(response.statusText);\n      }\n\n      const data = (await response.json()) as QueryResults;\n      return data;\n    } catch (err) {\n      if (!(err instanceof SearchError)) {\n        throw handleApiError(err, \"query\");\n      }\n      throw err;\n    }\n  }\n\n  async getSchema(): Promise<Schema> {\n    try {\n      const response = await fetch(\n        `${this.apiBaseUrl}/org/${this.org}/projects/${this.project}/environments/${this.environment}/search/${encodeURIComponent(this.namespaceId)}/schema`,\n        {\n          method: \"GET\",\n          headers: {\n            Authorization: `Bearer ${this.apiKey}`,\n            \"User-Agent\": USER_AGENT,\n          },\n        },\n      );\n\n      if (!response.ok) {\n        throw new SearchApiError(response.statusText);\n      }\n\n      const data = (await response.json()) as Schema;\n      return data;\n    } catch (err) {\n      if (!(err instanceof SearchError)) {\n        throw handleApiError(err, \"schema\");\n      }\n      throw err;\n    }\n  }\n\n  async updateSchema({ schema }: { schema: Schema }): Promise<Schema> {\n    try {\n      const response = await fetch(\n        `${this.apiBaseUrl}/org/${this.org}/projects/${this.project}/environments/${this.environment}/search/${encodeURIComponent(this.namespaceId)}/schema`,\n        {\n          method: \"POST\",\n          headers: {\n            Authorization: `Bearer ${this.apiKey}`,\n            \"Content-Type\": \"application/json\",\n            \"User-Agent\": USER_AGENT,\n          },\n          body: JSON.stringify(schema),\n        },\n      );\n\n      if (!response.ok) {\n        throw new SearchApiError(response.statusText);\n      }\n\n      const data = (await response.json()) as Schema;\n      return data;\n    } catch (err) {\n      if (!(err instanceof SearchError)) {\n        throw handleApiError(err, \"updateSchema\");\n      }\n      throw err;\n    }\n  }\n\n  async getMetadata(): Promise<NamespaceMetadata> {\n    try {\n      const response = await fetch(\n        `${this.apiBaseUrl}/org/${this.org}/projects/${this.project}/environments/${this.environment}/search/${encodeURIComponent(this.namespaceId)}`,\n        {\n          method: \"GET\",\n          headers: {\n            Authorization: `Bearer ${this.apiKey}`,\n            \"User-Agent\": USER_AGENT,\n          },\n        },\n      );\n\n      if (!response.ok) {\n        throw new SearchApiError(response.statusText);\n      }\n\n      const data = (await response.json()) as { metadata: NamespaceMetadata };\n      return data.metadata;\n    } catch (err) {\n      if (!(err instanceof SearchError)) {\n        throw handleApiError(err, \"metadata\");\n      }\n      throw err;\n    }\n  }\n}\n\n/**\n * Remote implementation of search\n */\nexport class SearchStorage implements ISearchStorage {\n  private apiKey: string;\n  private apiBaseUrl: string;\n  private org: string;\n  private project: string;\n  private environment: string;\n  private namespaces: Map<string, SearchNamespace> = new Map<\n    string,\n    SearchNamespace\n  >();\n\n  constructor(project: string, environment: string) {\n    this.project = project;\n    this.environment = environment;\n\n    const config = readConfig();\n\n    this.apiKey = process.env.GENSX_API_KEY ?? config.api?.token ?? \"\";\n    if (!this.apiKey) {\n      throw new Error(\n        \"GENSX_API_KEY environment variable must be set for search\",\n      );\n    }\n\n    this.org = process.env.GENSX_ORG ?? config.api?.org ?? \"\";\n    if (!this.org) {\n      throw new Error(\n        \"Organization ID must be provided via constructor or GENSX_ORG environment variable\",\n      );\n    }\n\n    this.apiBaseUrl =\n      process.env.GENSX_API_BASE_URL ?? config.api?.baseUrl ?? API_BASE_URL;\n  }\n\n  getNamespace(name: string): Namespace {\n    if (!this.namespaces.has(name)) {\n      this.namespaces.set(\n        name,\n        new SearchNamespace(\n          name,\n          this.apiBaseUrl,\n          this.apiKey,\n          this.org,\n          this.project,\n          this.environment,\n        ),\n      );\n    }\n\n    return this.namespaces.get(name)!;\n  }\n\n  async ensureNamespace(name: string): Promise<EnsureNamespaceResult> {\n    try {\n      const response = await fetch(\n        `${this.apiBaseUrl}/org/${this.org}/projects/${this.project}/environments/${this.environment}/search/${encodeURIComponent(name)}/ensure`,\n        {\n          method: \"POST\",\n          headers: {\n            Authorization: `Bearer ${this.apiKey}`,\n            \"User-Agent\": USER_AGENT,\n          },\n        },\n      );\n\n      if (!response.ok) {\n        throw new SearchApiError(response.statusText);\n      }\n\n      const data = (await response.json()) as EnsureNamespaceResult;\n\n      // Make sure the namespace is in our cache\n      if (!this.namespaces.has(name)) {\n        this.getNamespace(name);\n      }\n\n      return data;\n    } catch (err) {\n      if (!(err instanceof SearchError)) {\n        throw handleApiError(err, \"ensureNamespace\");\n      }\n      throw err;\n    }\n  }\n\n  async deleteNamespace(name: string): Promise<DeleteNamespaceResult> {\n    try {\n      const response = await fetch(\n        `${this.apiBaseUrl}/org/${this.org}/projects/${this.project}/environments/${this.environment}/search/${encodeURIComponent(name)}`,\n        {\n          method: \"DELETE\",\n          headers: {\n            Authorization: `Bearer ${this.apiKey}`,\n            \"User-Agent\": USER_AGENT,\n          },\n        },\n      );\n\n      if (!response.ok) {\n        throw new SearchApiError(response.statusText);\n      }\n\n      const data = (await response.json()) as DeleteNamespaceResult;\n\n      // Remove namespace from caches if it was successfully deleted\n      if (data.deleted) {\n        if (this.namespaces.has(name)) {\n          const ns = this.namespaces.get(name);\n          if (ns) {\n            this.namespaces.delete(name);\n          }\n        }\n      }\n\n      return data;\n    } catch (err) {\n      if (!(err instanceof SearchError)) {\n        throw handleApiError(err, \"deleteNamespace\");\n      }\n      throw err;\n    }\n  }\n\n  async listNamespaces(options?: {\n    prefix?: string;\n    limit?: number;\n    cursor?: string;\n  }): Promise<{\n    namespaces: { name: string; createdAt: Date }[];\n    nextCursor?: string;\n  }> {\n    try {\n      // Normalize prefix by removing trailing slash\n      const normalizedPrefix = options?.prefix?.replace(/\\/$/, \"\");\n\n      const url = new URL(\n        `${this.apiBaseUrl}/org/${this.org}/projects/${this.project}/environments/${this.environment}/search`,\n      );\n\n      if (normalizedPrefix) {\n        url.searchParams.append(\"prefix\", normalizedPrefix);\n      }\n\n      if (options?.limit) {\n        url.searchParams.append(\"limit\", options.limit.toString());\n      }\n\n      if (options?.cursor) {\n        url.searchParams.append(\"cursor\", options.cursor);\n      }\n\n      const response = await fetch(url.toString(), {\n        method: \"GET\",\n        headers: {\n          Authorization: `Bearer ${this.apiKey}`,\n          \"User-Agent\": USER_AGENT,\n        },\n      });\n\n      if (!response.ok) {\n        throw new SearchApiError(response.statusText);\n      }\n\n      const data = (await response.json()) as {\n        namespaces: { name: string; createdAt: string }[];\n        nextCursor?: string;\n      };\n\n      return {\n        namespaces: data.namespaces.map((ns) => ({\n          name: ns.name,\n          createdAt: new Date(ns.createdAt),\n        })),\n        nextCursor: data.nextCursor,\n      };\n    } catch (err) {\n      if (!(err instanceof SearchError)) {\n        throw handleApiError(err, \"listNamespaces\");\n      }\n      throw err;\n    }\n  }\n\n  hasEnsuredNamespace(name: string): boolean {\n    return this.namespaces.has(name);\n  }\n\n  /**\n   * Check if a namespace exists\n   * @param name The namespace name to check\n   * @returns Promise that resolves to true if the namespace exists\n   */\n  async namespaceExists(name: string): Promise<boolean> {\n    try {\n      const response = await fetch(\n        `${this.apiBaseUrl}/org/${this.org}/projects/${this.project}/environments/${this.environment}/search/${encodeURIComponent(name)}`,\n        {\n          method: \"HEAD\",\n          headers: {\n            Authorization: `Bearer ${this.apiKey}`,\n            \"User-Agent\": USER_AGENT,\n          },\n        },\n      );\n\n      return response.ok;\n    } catch (err) {\n      if (!(err instanceof SearchError)) {\n        throw handleApiError(err, \"namespaceExists\");\n      }\n      throw err;\n    }\n  }\n}\n"],"names":["USER_AGENT","readConfig"],"mappings":"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"}