vecbox 0.2.1 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -126,8 +126,8 @@ var EmbeddingProvider = class {
126
126
  return input.text;
127
127
  }
128
128
  if (input.filePath) {
129
- const fs = await import("fs/promises");
130
- return await fs.readFile(input.filePath, "utf-8");
129
+ const fs2 = await import("fs/promises");
130
+ return await fs2.readFile(input.filePath, "utf-8");
131
131
  }
132
132
  throw new Error("Either text or filePath must be provided");
133
133
  }
@@ -484,8 +484,6 @@ var MistralProvider = class extends EmbeddingProvider {
484
484
 
485
485
  // src/providers/llamacpp.ts
486
486
  var import_promises = require("fs/promises");
487
- var import_path = require("path");
488
- var http = __toESM(require("http"), 1);
489
487
  var nativeModule = null;
490
488
  try {
491
489
  nativeModule = require_native();
@@ -541,6 +539,28 @@ var LlamaCppProvider = class extends EmbeddingProvider {
541
539
  return false;
542
540
  }
543
541
  }
542
+ async loadGGUFModel(modelPath) {
543
+ try {
544
+ logger.debug(`Loading GGUF model from: ${modelPath}`);
545
+ const modelBuffer = await fs.readFile(modelPath);
546
+ if (!modelBuffer) {
547
+ throw new Error(`Failed to read model file: ${modelPath}`);
548
+ }
549
+ logger.debug(`Model file loaded, size: ${modelBuffer.length} bytes`);
550
+ return modelBuffer;
551
+ } catch (error) {
552
+ logger.error(`Failed to load GGUF model: ${error instanceof Error ? error.message : String(error)}`);
553
+ throw error;
554
+ }
555
+ }
556
+ generateEmbedding(modelBuffer, text) {
557
+ logger.debug(`Generating embedding with model buffer (${modelBuffer.length} bytes)`);
558
+ const embedding = [];
559
+ for (let i = 0; i < Math.min(text.length, 768); i++) {
560
+ embedding.push(Math.sin(i * 0.1) * (i % 10));
561
+ }
562
+ return embedding;
563
+ }
544
564
  async embed(input) {
545
565
  try {
546
566
  logger.debug(`Embedding text with llama.cpp: ${this.getModel()}`);
@@ -549,28 +569,15 @@ var LlamaCppProvider = class extends EmbeddingProvider {
549
569
  throw new Error("Text input cannot be empty");
550
570
  }
551
571
  if (this.useNative && this.nativeModel) {
552
- const embedding2 = this.nativeModel.embed(text);
572
+ const embedding = this.nativeModel.embed(text);
553
573
  return {
554
- embedding: embedding2,
555
- dimensions: embedding2.length,
574
+ embedding,
575
+ dimensions: embedding.length,
556
576
  model: this.getModel(),
557
577
  provider: "llamacpp"
558
578
  };
559
579
  }
560
- const requestBody = {
561
- input: text,
562
- model: await this.getModelPath(),
563
- pooling: "mean",
564
- normalize: 2
565
- };
566
- const result = await this.executeLlamaEmbedding([JSON.stringify(requestBody)]);
567
- const embedding = this.parseRawOutput(result.stdout);
568
- return {
569
- embedding,
570
- dimensions: embedding.length,
571
- model: this.getModel(),
572
- provider: "llamacpp"
573
- };
580
+ throw new Error("Direct Llama.cpp core integration not yet implemented. Please use HTTP fallback or wait for next version.");
574
581
  } catch (error) {
575
582
  logger.error(`Llama.cpp embedding failed: ${error instanceof Error ? error.message : String(error)}`);
576
583
  throw error;
@@ -609,15 +616,15 @@ var LlamaCppProvider = class extends EmbeddingProvider {
609
616
  throw new Error("No valid texts to embed");
610
617
  }
611
618
  const modelPath = await this.getModelPath();
612
- const requests = inputs.map((input) => ({
619
+ const requests = inputs.map((input, v) => ({
613
620
  input: input.text || "",
614
621
  model: modelPath,
615
622
  pooling: "mean",
616
623
  normalize: 2
617
624
  }));
618
625
  const embeddings = [];
619
- for (const request2 of requests) {
620
- const result = await this.executeLlamaEmbedding([JSON.stringify(request2)]);
626
+ for (const request of requests) {
627
+ const result = await this.executeLlamaEmbedding([JSON.stringify(request)]);
621
628
  const embedding = this.parseRawOutput(result.stdout);
622
629
  embeddings.push(embedding);
623
630
  }
@@ -648,116 +655,6 @@ var LlamaCppProvider = class extends EmbeddingProvider {
648
655
  getModel() {
649
656
  return this.modelPath;
650
657
  }
651
- // Private helper methods
652
- async getModelPath() {
653
- const possiblePaths = [
654
- this.modelPath,
655
- // As provided
656
- (0, import_path.join)("./llama.cpp/models", this.modelPath),
657
- // In llama.cpp/models
658
- (0, import_path.join)("./llama.cpp", this.modelPath),
659
- // In llama.cpp root
660
- this.modelPath
661
- // Fallback
662
- ];
663
- for (const path of possiblePaths) {
664
- try {
665
- await (0, import_promises.access)(path, import_promises.constants.F_OK);
666
- return (0, import_path.resolve)(path);
667
- } catch {
668
- continue;
669
- }
670
- }
671
- throw new Error(`Model file not found: ${this.modelPath}`);
672
- }
673
- async executeLlamaEmbedding(args) {
674
- return new Promise((resolve2, reject) => {
675
- const port = 8080;
676
- let requestBody;
677
- try {
678
- requestBody = JSON.parse(args[0] || "{}");
679
- } catch {
680
- reject(new Error("Invalid request body for HTTP API"));
681
- return;
682
- }
683
- const postData = JSON.stringify(requestBody);
684
- const options = {
685
- hostname: "localhost",
686
- port,
687
- path: "/embedding",
688
- method: "POST",
689
- headers: {
690
- "Content-Type": "application/json",
691
- "Content-Length": Buffer.byteLength(postData)
692
- }
693
- };
694
- const req = http.request(options, (res) => {
695
- let data = "";
696
- res.on("data", (chunk) => {
697
- data += chunk;
698
- });
699
- res.on("end", () => {
700
- if (res.statusCode === 200) {
701
- resolve2({ stdout: data, stderr: "" });
702
- } else {
703
- reject(new Error(`HTTP ${res.statusCode}: ${data}`));
704
- }
705
- });
706
- });
707
- req.on("error", (error) => {
708
- reject(new Error(`Failed to connect to llama.cpp server: ${error instanceof Error ? error.message : String(error)}`));
709
- });
710
- req.write(postData);
711
- req.end();
712
- });
713
- }
714
- parseRawOutput(output) {
715
- try {
716
- const response = JSON.parse(output);
717
- logger.debug(`PARSE DEBUG: Response type: ${typeof response}`);
718
- logger.debug(`PARSE DEBUG: Is Array: ${Array.isArray(response)}`);
719
- if (Array.isArray(response) && response.length > 0) {
720
- const first = response[0];
721
- if (first && first.embedding && Array.isArray(first.embedding)) {
722
- const emb = first.embedding;
723
- if (Array.isArray(emb[0])) {
724
- const flat = emb[0];
725
- logger.debug(`Parsed ${flat.length} dimensions (nested)`);
726
- return flat;
727
- }
728
- logger.debug(`Parsed ${emb.length} dimensions (direct)`);
729
- return emb;
730
- }
731
- }
732
- if (response.embedding && Array.isArray(response.embedding)) {
733
- const emb = response.embedding;
734
- if (Array.isArray(emb[0])) {
735
- return emb[0];
736
- }
737
- return emb;
738
- }
739
- if (Array.isArray(response) && typeof response[0] === "number") {
740
- logger.debug(`Parsed ${response.length} dimensions (flat array)`);
741
- return response;
742
- }
743
- throw new Error(`Unexpected format: ${JSON.stringify(Object.keys(response))}`);
744
- } catch (error) {
745
- const errorMessage = error instanceof Error ? error.message : String(error);
746
- throw new Error(`Parse failed: ${errorMessage}`);
747
- }
748
- }
749
- parseArrayOutput(output) {
750
- const arrayPattern = /\[([^\]]+)\]/g;
751
- const matches = [...output.matchAll(arrayPattern)];
752
- if (matches.length === 0) {
753
- throw new Error("No array embeddings found in output");
754
- }
755
- const embeddings = matches.map((match) => {
756
- const values = match[1]?.split(",").map((v) => v.trim()) || [];
757
- return values.map((v) => parseFloat(v)).filter((v) => !isNaN(v));
758
- }).filter((embedding) => embedding.length > 0);
759
- return embeddings;
760
- }
761
658
  };
762
659
 
763
660
  // src/factory/EmbeddingFactory.ts
@@ -1 +1 @@
1
- {"version":3,"sources":["node-file:/home/inky/Development/vecbox/native/build/Release/llama_embedding.node","../native/index.js","../index.ts","../main.ts","../src/providers/openai.ts","../src/providers/base/EmbeddingProvider.ts","../src/util/logger.ts","../src/providers/gemini.ts","../src/providers/mistral.ts","../src/providers/llamacpp.ts","../src/factory/EmbeddingFactory.ts"],"sourcesContent":["\n import path from \"/home/inky/Development/vecbox/native/build/Release/llama_embedding.node\"\n try { module.exports = require(path) }\n catch {}\n ","const binding = require('./build/Release/llama_embedding.node');\n\nclass LlamaEmbedding {\n constructor(modelPath) {\n this.modelPtr = binding.createModel(modelPath);\n if (!this.modelPtr) {\n throw new Error('Failed to load model');\n }\n }\n\n embed(text) {\n if (typeof text !== 'string') {\n throw new Error('Text must be a string');\n }\n \n const embedding = binding.getEmbedding(this.modelPtr, text);\n if (!embedding) {\n throw new Error('Failed to generate embedding');\n }\n \n return embedding;\n }\n\n close() {\n if (this.modelPtr) {\n binding.destroyModel(this.modelPtr);\n this.modelPtr = null;\n }\n }\n}\n\nfunction create(modelPath) {\n return new LlamaEmbedding(modelPath);\n}\n\nmodule.exports = {\n create,\n LlamaEmbedding\n};\n","/**\n * Embedbox v1.0.0 - Main Entry Point\n * \n * A minimal and powerful embedding library that supports multiple providers\n * with automatic detection and fallback capabilities.\n */\n\n// Export main functions\nexport { embed, autoEmbed, getSupportedProviders, createProvider } from './main.js';\n\n// Export types\nexport type { \n EmbedConfig, \n EmbedInput, \n EmbedResult, \n BatchEmbedResult, \n ProviderType \n} from './src/types/index.js';\n\n// Export provider factory for advanced usage\nexport { EmbeddingFactory } from './src/factory/EmbeddingFactory.js';\n\n// Export base provider for custom implementations\nexport { EmbeddingProvider } from './src/providers/base/EmbeddingProvider.js';\n\n// Version information\nexport const VERSION = '1.0.0';\n\n/**\n * Get library version\n */\nexport function getVersion(): string {\n return VERSION;\n}\n\n/**\n * Library information\n */\nexport const LIB_INFO = {\n name: 'embedbox',\n version: VERSION,\n description: 'A minimal and powerful embedding library',\n homepage: 'https://embedbox.dev',\n repository: 'https://github.com/embedbox/embedbox.git',\n supportedProviders: [\n 'openai',\n 'gemini', \n 'mistral',\n 'llamacpp'\n ] as const\n} as const;\n","import * as dotenv from 'dotenv';\nimport { EmbeddingFactory } from '@src/factory/EmbeddingFactory.js';\nimport type { EmbedConfig, EmbedInput, EmbedResult, BatchEmbedResult } from '@src/types/index.js';\nimport { Logger } from '@src/util/logger.js';\n\n// Load environment variables\ndotenv.config();\n\nconst logger = Logger.createModuleLogger('main');\n\n/**\n * Main embedding interface - Simple and minimal API\n * \n * @param config - Provider configuration\n * @param input - Text or file to embed\n * @returns Promise<EmbedResult | BatchEmbedResult>\n */\nexport async function embed(\n config: EmbedConfig,\n input: EmbedInput | EmbedInput[]\n): Promise<EmbedResult | BatchEmbedResult> {\n try {\n logger.info(`Starting embedding with provider: ${config.provider}`);\n \n // Create provider instance\n const provider = EmbeddingFactory.create(config);\n \n // Check if provider is ready\n const isReady = await provider.isReady();\n if (!isReady) {\n throw new Error(`Provider ${config.provider} is not ready`);\n }\n \n // Handle single input or batch\n if (Array.isArray(input)) {\n logger.debug(`Processing batch of ${input.length} items`);\n return await provider.embedBatch(input);\n } else {\n logger.debug(`Processing single item`);\n return await provider.embed(input);\n }\n \n } catch (error: unknown) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n logger.error(`Embedding failed: ${errorMessage}`);\n throw error;\n }\n}\n\n/**\n * Convenience function for quick embedding with auto-detection\n * \n * @param input - Text or file to embed\n * @returns Promise<EmbedResult | BatchEmbedResult>\n */\nexport async function autoEmbed(\n input: EmbedInput | EmbedInput[]\n): Promise<EmbedResult | BatchEmbedResult> {\n logger.info('Auto-detecting best provider...');\n \n // Try providers in order of preference\n const providers = [\n { provider: 'llamacpp' as const, model: 'nomic-embed-text-v1.5.Q4_K_M.gguf' }, // Local & free (llama.cpp)\n { provider: 'openai' as const, model: 'text-embedding-3-small', apiKey: process.env.OPENAI_API_KEY || undefined },\n { provider: 'gemini' as const, model: 'gemini-embedding-001', apiKey: process.env.GOOGLE_GENERATIVE_AI_API_KEY || undefined },\n { provider: 'mistral' as const, model: 'mistral-embed', apiKey: process.env.MISTRAL_API_KEY || undefined },\n ];\n \n for (const config of providers) {\n try {\n // Llama.cpp provider doesn't need API key and should be tried first\n if (config.provider === 'llamacpp' || config.apiKey) {\n logger.info(`Trying provider: ${config.provider}`);\n // Create a clean config object without undefined properties\n const cleanConfig: EmbedConfig = {\n provider: config.provider,\n model: config.model,\n };\n \n if (config.apiKey) {\n cleanConfig.apiKey = config.apiKey;\n }\n \n return await embed(cleanConfig, input);\n }\n } catch (error: unknown) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n logger.warn(`Provider ${config.provider} failed: ${errorMessage}`);\n continue;\n }\n }\n \n throw new Error('No available embedding provider found');\n}\n\n/**\n * Get supported providers\n */\nexport function getSupportedProviders() {\n return EmbeddingFactory.getSupportedProviders();\n}\n\n/**\n * Create a specific provider instance\n */\nexport function createProvider(config: EmbedConfig) {\n return EmbeddingFactory.create(config);\n}\n\n// Export types for external use\nexport type { EmbedConfig, EmbedInput, EmbedResult, BatchEmbedResult, ProviderType } from './src/types/index.js';","import OpenAI from 'openai';\nimport { EmbeddingProvider } from '@providers/base/EmbeddingProvider';\nimport type { EmbedConfig, EmbedInput, EmbedResult, BatchEmbedResult } from '@src/types/index';\nimport { Logger } from '@src/util/logger';\n\nconst logger = Logger.createModuleLogger('openai');\n\nexport class OpenAIProvider extends EmbeddingProvider {\n private client: OpenAI;\n\n constructor(config: EmbedConfig) {\n super(config);\n \n if (!config.apiKey) {\n throw new Error('OpenAI API key is required');\n }\n\n this.client = new OpenAI({\n apiKey: config.apiKey,\n baseURL: config.baseUrl,\n timeout: config.timeout || 30000,\n });\n\n logger.info('OpenAI provider initialized');\n }\n\n async embed(input: EmbedInput): Promise<EmbedResult> {\n try {\n const text = await this.readInput(input);\n logger.debug(`Embedding text with model: ${this.getModel()}`);\n\n const response = await this.client.embeddings.create({\n model: this.getModel(),\n input: text,\n });\n\n const embedding = response.data[0];\n if (!embedding) {\n throw new Error('No embedding returned from OpenAI API');\n }\n\n return {\n embedding: embedding.embedding || [],\n dimensions: embedding.embedding?.length || 0,\n model: response.model,\n provider: 'openai',\n usage: response.usage ? {\n promptTokens: response.usage.prompt_tokens,\n totalTokens: response.usage.total_tokens,\n } : undefined,\n };\n } catch (error: unknown) {\n logger.error(`OpenAI embedding failed: ${(error instanceof Error ? error.message : String(error))}`);\n throw error;\n }\n }\n\n async embedBatch(inputs: EmbedInput[]): Promise<BatchEmbedResult> {\n try {\n const texts = await Promise.all(inputs.map(input => this.readInput(input)));\n logger.debug(`Batch embedding ${texts.length} texts with model: ${this.getModel()}`);\n\n const response = await this.client.embeddings.create({\n model: this.getModel(),\n input: texts,\n });\n\n const embeddings = response.data.map(item => item.embedding);\n\n return {\n embeddings,\n dimensions: embeddings[0]?.length || 0,\n model: response.model,\n provider: 'openai',\n usage: response.usage ? {\n promptTokens: response.usage.prompt_tokens,\n totalTokens: response.usage.total_tokens,\n } : undefined,\n };\n } catch (error: unknown) {\n logger.error(`OpenAI batch embedding failed: ${(error instanceof Error ? error.message : String(error))}`);\n throw error;\n }\n }\n\n getDimensions(): number {\n // Common OpenAI embedding dimensions\n const model = this.getModel();\n if (model.includes('text-embedding-3-large')) return 3072;\n if (model.includes('text-embedding-3-small')) return 1536;\n if (model.includes('text-embedding-ada-002')) return 1536;\n return 1536; // default\n }\n\n getProviderName(): string {\n return 'OpenAI';\n }\n\n async isReady(): Promise<boolean> {\n try {\n await this.client.models.list();\n return true;\n } catch (error: unknown) {\n logger.error(`OpenAI readiness check failed: ${(error instanceof Error ? error.message : String(error))}`);\n return false;\n }\n }\n}\n","import type { EmbedConfig, EmbedInput, EmbedResult, BatchEmbedResult } from '@src/types/index';\n\nexport abstract class EmbeddingProvider {\n protected config: EmbedConfig;\n\n constructor(config: EmbedConfig) {\n this.config = config;\n }\n\n abstract embed(input: EmbedInput): Promise<EmbedResult>;\n abstract embedBatch(inputs: EmbedInput[]): Promise<BatchEmbedResult>;\n abstract getDimensions(): number;\n abstract getProviderName(): string;\n abstract isReady(): Promise<boolean>;\n\n protected getModel(): string {\n return this.config.model || 'default';\n }\n\n protected async readInput(input: EmbedInput): Promise<string> {\n if (input.text) {\n return input.text;\n }\n \n if (input.filePath) {\n const fs = await import('fs/promises');\n return await fs.readFile(input.filePath, 'utf-8');\n }\n \n throw new Error('Either text or filePath must be provided');\n }\n}\n","export enum LogLevel {\n DEBUG = 0,\n INFO = 1,\n WARN = 2,\n ERROR = 3,\n}\n\nexport interface LogEntry {\n level: LogLevel;\n message: string;\n module: string;\n timestamp: Date;\n}\n\nexport class Logger {\n private static instance: Logger;\n private currentLevel: LogLevel;\n private moduleName: string;\n\n // ANSI color codes - simplified for better readability\n private static readonly COLORS = {\n RESET: '\\x1b[0m',\n DEBUG: '\\x1b[36m', // Cyan\n INFO: '\\x1b[32m', // Green \n WARN: '\\x1b[33m', // Yellow\n ERROR: '\\x1b[31m', // Red\n };\n\n private static readonly LEVEL_NAMES = {\n [LogLevel.DEBUG]: 'DEBUG',\n [LogLevel.INFO]: 'INFO',\n [LogLevel.WARN]: 'WARN',\n [LogLevel.ERROR]: 'ERROR',\n };\n\n constructor(moduleName: string = 'embedbox', level: LogLevel = LogLevel.INFO) {\n this.moduleName = moduleName;\n this.currentLevel = level;\n }\n\n static getInstance(moduleName?: string, level?: LogLevel): Logger {\n if (!Logger.instance) {\n Logger.instance = new Logger(moduleName || 'embedbox', level);\n }\n return Logger.instance;\n }\n\n setLevel(level: LogLevel): void {\n this.currentLevel = level;\n }\n\n getLevel(): LogLevel {\n return this.currentLevel;\n }\n\n private formatMessage(level: LogLevel, message: string): string {\n const levelName = Logger.LEVEL_NAMES[level];\n const color = Logger.COLORS[levelName as keyof typeof Logger.COLORS];\n const reset = Logger.COLORS.RESET;\n\n return `${color}[${levelName}(${this.moduleName})]${reset} ${message}\\n\\n`;\n }\n\n private log(level: LogLevel, message: string): void {\n if (level < this.currentLevel) {\n return;\n }\n\n const formattedMessage = this.formatMessage(level, message);\n process.stdout.write(formattedMessage);\n }\n\n debug(message: string): void {\n this.log(LogLevel.DEBUG, message);\n }\n\n info(message: string): void {\n this.log(LogLevel.INFO, message);\n }\n\n warn(message: string): void {\n this.log(LogLevel.WARN, message);\n }\n\n error(message: string): void {\n this.log(LogLevel.ERROR, message);\n }\n\n // Static methods for quick access\n static debug(message: string, moduleName?: string): void {\n const logger = new Logger(moduleName || 'embedbox');\n logger.debug(message);\n }\n\n static info(message: string, moduleName?: string): void {\n const logger = new Logger(moduleName || 'embedbox');\n logger.info(message);\n }\n\n static warn(message: string, moduleName?: string): void {\n const logger = new Logger(moduleName || 'embedbox');\n logger.warn(message);\n }\n\n static error(message: string, moduleName?: string): void {\n const logger = new Logger(moduleName || 'embedbox');\n logger.error(message);\n }\n\n // Method to create a logger instance for a specific module\n static createModuleLogger(moduleName: string, level?: LogLevel): Logger {\n return new Logger(`embedbox:${moduleName}`, level);\n }\n}\n\n// Export a default logger instance\nexport const logger = Logger.getInstance();\n\n// Export convenience functions\nexport const log = {\n debug: (message: string, moduleName?: string) => Logger.debug(message, moduleName),\n info: (message: string, moduleName?: string) => Logger.info(message, moduleName),\n warn: (message: string, moduleName?: string) => Logger.warn(message, moduleName),\n error: (message: string, moduleName?: string) => Logger.error(message, moduleName),\n};\n","import { GoogleGenerativeAI } from '@google/generative-ai';\nimport { EmbeddingProvider } from '@providers/base/EmbeddingProvider';\nimport type { EmbedConfig, EmbedInput, EmbedResult, BatchEmbedResult } from '@src/types/index';\nimport { Logger } from '@src/util/logger';\n\nconst logger = Logger.createModuleLogger('gemini');\n\nexport class GeminiProvider extends EmbeddingProvider {\n private client: GoogleGenerativeAI;\n\n constructor(config: EmbedConfig) {\n super(config);\n \n if (!config.apiKey) {\n throw new Error('Google API key is required');\n }\n\n this.client = new GoogleGenerativeAI(config.apiKey);\n logger.info('Gemini provider initialized');\n }\n\n async embed(input: EmbedInput): Promise<EmbedResult> {\n try {\n const text = await this.readInput(input);\n logger.debug(`Embedding text with model: ${this.getModel()}`);\n\n // Get the embedding model\n const model = this.client.getGenerativeModel({ \n model: this.getModel() \n });\n\n // Use the embedding task\n const result = await model.embedContent(text);\n const embedding = result.embedding;\n\n return {\n embedding: embedding.values,\n dimensions: embedding.values.length,\n model: this.getModel(),\n provider: 'gemini',\n };\n } catch (error: unknown) {\n logger.error(`Gemini embedding failed: ${(error instanceof Error ? error.message : String(error))}`);\n throw error;\n }\n }\n\n async embedBatch(inputs: EmbedInput[]): Promise<BatchEmbedResult> {\n try {\n const texts = await Promise.all(inputs.map(input => this.readInput(input)));\n logger.debug(`Batch embedding ${texts.length} texts with model: ${this.getModel()}`);\n\n const model = this.client.getGenerativeModel({ \n model: this.getModel() \n });\n\n const results = await Promise.all(\n texts.map(text => model.embedContent(text))\n );\n\n const embeddings = results.map((result: { embedding: { values: number[] } }) => result.embedding.values);\n\n return {\n embeddings,\n dimensions: embeddings[0]?.length || 0,\n model: this.getModel(),\n provider: 'gemini',\n };\n } catch (error: unknown) {\n logger.error(`Gemini batch embedding failed: ${(error instanceof Error ? error.message : String(error))}`);\n throw error;\n }\n }\n\n getDimensions(): number {\n const model = this.getModel();\n if (model.includes('gemini-embedding-001')) return 3072;\n if (model.includes('text-embedding-004')) return 768;\n if (model.includes('embedding-001')) return 768;\n if (model.includes('multimodalembedding')) return 768;\n return 3072; // default for Gemini embeddings\n }\n\n getProviderName(): string {\n return 'Google Gemini';\n }\n\n protected getModel(): string {\n return this.config.model || 'gemini-embedding-001';\n }\n\n async isReady(): Promise<boolean> {\n try {\n const model = this.client.getGenerativeModel({ \n model: this.getModel() \n });\n // Test with a simple embedding\n await model.embedContent('test');\n return true;\n } catch (error: unknown) {\n logger.error(`Gemini readiness check failed: ${(error instanceof Error ? error.message : String(error))}`);\n return false;\n }\n }\n}\n","import { Mistral } from '@mistralai/mistralai';\nimport { EmbeddingProvider } from '@providers/base/EmbeddingProvider';\nimport type { EmbedConfig, EmbedInput, EmbedResult, BatchEmbedResult } from '@src/types/index';\nimport { Logger } from '@src/util/logger';\n\nconst logger = Logger.createModuleLogger('mistral');\n\nexport class MistralProvider extends EmbeddingProvider {\n private client: Mistral;\n\n constructor(config: EmbedConfig) {\n super(config);\n \n if (!config.apiKey) {\n throw new Error('Mistral API key is required');\n }\n\n this.client = new Mistral({\n apiKey: config.apiKey,\n serverURL: config.baseUrl,\n timeoutMs: config.timeout || 30000,\n });\n\n logger.info('Mistral provider initialized');\n }\n\n async embed(input: EmbedInput): Promise<EmbedResult> {\n try {\n const text = await this.readInput(input);\n logger.debug(`Embedding text with model: ${this.getModel()}`);\n\n const response = await this.client.embeddings.create({\n model: this.getModel(),\n inputs: [text],\n });\n\n const embedding = response.data[0];\n if (!embedding) {\n throw new Error('No embedding returned from Mistral API');\n }\n\n return {\n embedding: embedding.embedding || [],\n dimensions: embedding.embedding?.length || 0,\n model: response.model,\n provider: 'mistral',\n usage: response.usage?.promptTokens && response.usage?.totalTokens ? {\n promptTokens: response.usage.promptTokens,\n totalTokens: response.usage.totalTokens,\n } : undefined,\n };\n } catch (error: unknown) {\n logger.error(`Mistral embedding failed: ${(error instanceof Error ? error.message : String(error))}`);\n throw error;\n }\n }\n\n async embedBatch(inputs: EmbedInput[]): Promise<BatchEmbedResult> {\n try {\n const texts = await Promise.all(inputs.map(input => this.readInput(input)));\n logger.debug(`Batch embedding ${texts.length} texts with model: ${this.getModel()}`);\n\n const response = await this.client.embeddings.create({\n model: this.getModel(),\n inputs: texts,\n });\n\n const embeddings = response.data.map((item) => {\n if (!item.embedding) throw new Error('No embedding returned from Mistral API');\n return item.embedding as number[];\n });\n\n return {\n embeddings,\n dimensions: embeddings[0]?.length || 0,\n model: response.model,\n provider: 'mistral',\n usage: response.usage?.promptTokens && response.usage?.totalTokens ? {\n promptTokens: response.usage.promptTokens,\n totalTokens: response.usage.totalTokens,\n } : undefined,\n };\n } catch (error: unknown) {\n logger.error(`Mistral batch embedding failed: ${(error instanceof Error ? error.message : String(error))}`);\n throw error;\n }\n }\n\n getDimensions(): number {\n // Mistral embedding dimensions\n const model = this.getModel();\n if (model.includes('mistral-embed')) return 1024;\n return 1024; // default for Mistral\n }\n\n getProviderName(): string {\n return 'Mistral AI';\n }\n\n async isReady(): Promise<boolean> {\n try {\n // Test with a simple embedding request\n const response = await this.client.embeddings.create({\n model: this.getModel(),\n inputs: ['test'],\n });\n return response.data.length > 0;\n } catch (error: unknown) {\n logger.error(`Mistral readiness check failed: ${(error instanceof Error ? error.message : String(error))}`);\n return false;\n }\n }\n}\n","/**\n * Llama.cpp Provider - Local embeddings using llama.cpp directly\n * Uses native N-API module for better performance\n */\n\nimport { access, constants } from 'fs/promises';\nimport { join, resolve } from 'path';\nimport { EmbeddingProvider } from '@providers/base/EmbeddingProvider';\nimport type { EmbedConfig, EmbedInput, EmbedResult, BatchEmbedResult } from '@src/types/index';\nimport { logger } from '@src/util/logger';\nimport * as http from 'http';\n\n// Try to import native module\nlet nativeModule: any = null;\ntry {\n nativeModule = require('../../native');\n logger.info('Using native Llama.cpp module');\n} catch (error) {\n logger.warn('Native module not available, falling back to HTTP');\n}\n\n// Extend EmbedConfig to include llamaPath\ninterface LlamaCppConfig extends EmbedConfig {\n llamaPath?: string;\n}\n\nexport class LlamaCppProvider extends EmbeddingProvider {\n private llamaPath: string;\n private modelPath: string;\n private useNative: boolean;\n private nativeModel: any = null;\n\n constructor(config: LlamaCppConfig) {\n super({ ...config, provider: 'llamacpp' });\n this.modelPath = config.model || 'nomic-embed-text-v1.5.Q4_K_M.gguf';\n this.llamaPath = config.llamaPath || './llama.cpp/build/bin/llama-embedding';\n this.useNative = !!nativeModule;\n \n if (this.useNative) {\n try {\n this.nativeModel = nativeModule.create(this.modelPath);\n logger.info(`Llama.cpp provider initialized with native module: ${this.modelPath}`);\n } catch (error) {\n logger.error(`Failed to initialize native module: ${error}`);\n this.useNative = false;\n }\n } else {\n logger.info(`Llama.cpp provider initialized with HTTP fallback: ${this.modelPath}`);\n }\n }\n\n // Public API methods\n getProviderName(): string {\n return 'Llama.cpp';\n }\n\n getDimensions(): number {\n // Known dimensions for common models\n const model = this.getModel();\n if (model.includes('nomic-embed-text-v1.5')) return 768;\n if (model.includes('nomic-embed-text-v1')) return 768;\n if (model.includes('all-MiniLM-L6-v2')) return 384;\n if (model.includes('bge-base')) return 768;\n if (model.includes('bert-base')) return 768;\n return 768; // default\n }\n\n async isReady(): Promise<boolean> {\n try {\n if (this.useNative && this.nativeModel) {\n // Native module is ready if model was loaded successfully\n return true;\n }\n \n // Fallback to HTTP check\n await access(this.llamaPath, constants.F_OK);\n await access(this.llamaPath, constants.X_OK);\n \n // Check if model file exists\n const modelPath = await this.getModelPath();\n await access(modelPath, constants.F_OK);\n \n logger.debug('Llama.cpp provider is ready');\n return true;\n } catch (error: unknown) {\n logger.error(`Llama.cpp readiness check failed: ${(error instanceof Error ? error.message : String(error))}`);\n return false;\n }\n }\n\n async embed(input: EmbedInput): Promise<EmbedResult> {\n try {\n logger.debug(`Embedding text with llama.cpp: ${this.getModel()}`);\n \n const text = await this.readInput(input);\n if (!text.trim()) {\n throw new Error('Text input cannot be empty');\n }\n\n if (this.useNative && this.nativeModel) {\n // Use native module\n const embedding = this.nativeModel.embed(text);\n \n return {\n embedding,\n dimensions: embedding.length,\n model: this.getModel(),\n provider: 'llamacpp',\n };\n }\n\n // Fallback to HTTP\n const requestBody = {\n input: text,\n model: await this.getModelPath(),\n pooling: 'mean',\n normalize: 2\n };\n\n // Execute HTTP request to llama.cpp server\n const result = await this.executeLlamaEmbedding([JSON.stringify(requestBody)]);\n \n // Parse output to extract embedding\n const embedding = this.parseRawOutput(result.stdout);\n \n return {\n embedding,\n dimensions: embedding.length,\n model: this.getModel(),\n provider: 'llamacpp',\n };\n } catch (error: unknown) {\n logger.error(`Llama.cpp embedding failed: ${(error instanceof Error ? error.message : String(error))}`);\n throw error;\n }\n }\n\n async embedBatch(inputs: EmbedInput[]): Promise<BatchEmbedResult> {\n try {\n logger.debug(`Batch embedding ${inputs.length} texts with llama.cpp`);\n \n if (this.useNative && this.nativeModel) {\n // Use native module for batch\n const embeddings: number[][] = [];\n \n for (const input of inputs) {\n const text = await this.readInput(input);\n if (text.trim()) {\n const embedding = this.nativeModel.embed(text);\n embeddings.push(embedding);\n }\n }\n \n if (embeddings.length === 0) {\n throw new Error('No valid texts to embed');\n }\n \n return {\n embeddings,\n dimensions: embeddings[0]?.length || 0,\n model: this.getModel(),\n provider: 'llamacpp',\n };\n }\n\n // Fallback to HTTP batch processing\n const texts = [];\n for (const input of inputs) {\n const text = await this.readInput(input);\n if (text.trim()) {\n texts.push(text);\n }\n }\n \n if (texts.length === 0) {\n throw new Error('No valid texts to embed');\n }\n\n // For batch processing, use HTTP API\n const modelPath = await this.getModelPath();\n const requests = inputs.map(input => ({\n input: input.text || '',\n model: modelPath,\n pooling: 'mean',\n normalize: 2\n }));\n\n // Execute batch requests (for now, do individual requests)\n const embeddings: number[][] = [];\n for (const request of requests) {\n const result = await this.executeLlamaEmbedding([JSON.stringify(request)]);\n const embedding = this.parseRawOutput(result.stdout);\n embeddings.push(embedding);\n }\n \n return {\n embeddings,\n dimensions: embeddings[0]?.length || 0,\n model: this.getModel(),\n provider: 'llamacpp',\n };\n } catch (error: unknown) {\n logger.error(`Llama.cpp batch embedding failed: ${(error instanceof Error ? error.message : String(error))}`);\n throw error;\n }\n }\n\n // Cleanup method\n async cleanup(): Promise<void> {\n if (this.useNative && this.nativeModel) {\n try {\n this.nativeModel.close();\n this.nativeModel = null;\n logger.info('Native Llama.cpp model closed');\n } catch (error) {\n logger.error(`Error closing native model: ${error}`);\n }\n }\n }\n\n // Protected methods\n protected getModel(): string {\n return this.modelPath;\n }\n\n // Private helper methods\n private async getModelPath(): Promise<string> {\n // Try different model paths\n const possiblePaths = [\n this.modelPath, // As provided\n join('./llama.cpp/models', this.modelPath), // In llama.cpp/models\n join('./llama.cpp', this.modelPath), // In llama.cpp root\n this.modelPath // Fallback\n ];\n\n for (const path of possiblePaths) {\n try {\n await access(path, constants.F_OK);\n return resolve(path);\n } catch {\n continue;\n }\n }\n\n throw new Error(`Model file not found: ${this.modelPath}`);\n }\n\n private async executeLlamaEmbedding(args: string[]): Promise<{stdout: string; stderr: string}> {\n return new Promise((resolve, reject) => {\n // Use HTTP API instead of CLI for cleaner output\n const port = 8080; // Default llama.cpp server port\n \n // Parse the request body from args[0] (JSON string)\n let requestBody;\n try {\n requestBody = JSON.parse(args[0] || '{}');\n } catch {\n reject(new Error('Invalid request body for HTTP API'));\n return;\n }\n\n const postData = JSON.stringify(requestBody);\n\n const options = {\n hostname: 'localhost',\n port: port,\n path: '/embedding',\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Content-Length': Buffer.byteLength(postData)\n }\n };\n\n const req = http.request(options, (res: http.IncomingMessage) => {\n let data = '';\n \n res.on('data', (chunk: Buffer | string) => {\n data += chunk;\n });\n \n res.on('end', () => {\n if (res.statusCode === 200) {\n resolve({ stdout: data, stderr: '' });\n } else {\n reject(new Error(`HTTP ${res.statusCode}: ${data}`));\n }\n });\n });\n\n req.on('error', (error: Error) => {\n reject(new Error(`Failed to connect to llama.cpp server: ${(error instanceof Error ? error.message : String(error))}`));\n });\n\n req.write(postData);\n req.end();\n });\n }\n\n private parseRawOutput(output: string): number[] {\n try {\n const response = JSON.parse(output);\n \n logger.debug(`PARSE DEBUG: Response type: ${typeof response}`);\n logger.debug(`PARSE DEBUG: Is Array: ${Array.isArray(response)}`);\n \n // CASE 1: Array of objects with nested embedding\n // Format: [{index: 0, embedding: [[...]]}]\n if (Array.isArray(response) && response.length > 0) {\n const first = response[0];\n \n if (first && first.embedding && Array.isArray(first.embedding)) {\n const emb = first.embedding;\n \n // Check if nested: [[...]]\n if (Array.isArray(emb[0])) {\n const flat = emb[0]; // ← Take the inner array\n logger.debug(`Parsed ${flat.length} dimensions (nested)`);\n return flat;\n }\n \n // Not nested: [...]\n logger.debug(`Parsed ${emb.length} dimensions (direct)`);\n return emb;\n }\n }\n \n // CASE 2: Direct object {embedding: [...]}\n if (response.embedding && Array.isArray(response.embedding)) {\n const emb = response.embedding;\n \n // Check nested\n if (Array.isArray(emb[0])) {\n return emb[0];\n }\n \n return emb;\n }\n \n // CASE 3: Direct array of numbers\n if (Array.isArray(response) && typeof response[0] === 'number') {\n logger.debug(`Parsed ${response.length} dimensions (flat array)`);\n return response;\n }\n \n throw new Error(`Unexpected format: ${JSON.stringify(Object.keys(response))}`);\n \n } catch (error: unknown) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new Error(`Parse failed: ${errorMessage}`);\n }\n }\n\n private parseArrayOutput(output: string): number[][] {\n // Parse array format: [[val1,val2,...], [val1,val2,...], ...]\n const arrayPattern = /\\[([^\\]]+)\\]/g;\n const matches = [...output.matchAll(arrayPattern)];\n \n if (matches.length === 0) {\n throw new Error('No array embeddings found in output');\n }\n\n const embeddings = matches.map(match => {\n const values = match[1]?.split(',').map(v => v.trim()) || [];\n return values.map(v => parseFloat(v)).filter(v => !isNaN(v));\n }).filter(embedding => embedding.length > 0);\n\n return embeddings;\n }\n}\n","import type { EmbedConfig, ProviderType } from '@src/types/index';\nimport { EmbeddingProvider } from '@providers/base/EmbeddingProvider';\nimport { OpenAIProvider } from '@providers/openai';\nimport { GeminiProvider } from '@providers/gemini';\nimport { MistralProvider } from '@providers/mistral';\nimport { LlamaCppProvider } from '@providers/llamacpp';\nimport { Logger } from '@src/util/logger';\n\nconst logger = Logger.createModuleLogger('factory');\n\nexport class EmbeddingFactory {\n private static providers = new Map<ProviderType, new (config: EmbedConfig) => EmbeddingProvider>([\n ['openai', OpenAIProvider],\n ['gemini', GeminiProvider],\n ['mistral', MistralProvider],\n ['llamacpp', LlamaCppProvider], // Local embeddings with llama.cpp\n ]);\n\n static create(config: EmbedConfig) {\n logger.info(`Creating provider: ${config.provider}`);\n \n const ProviderClass = this.providers.get(config.provider);\n if (!ProviderClass) {\n throw new Error(`Unsupported provider: ${config.provider}`);\n }\n\n return new ProviderClass(config);\n }\n\n static getSupportedProviders(): ProviderType[] {\n return Array.from(this.providers.keys());\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA,sFAAAA,UAAAC,SAAA;AAAA;AACY;AACA,QAAI;AAAE,MAAAA,QAAO,UAAU,QAAQ,uBAAI;AAAA,IAAE,QAC/B;AAAA,IAAC;AAAA;AAAA;;;ACHnB;AAAA,oBAAAC,UAAAC,SAAA;AAAA;AAAA,QAAM,UAAU;AAEhB,QAAM,iBAAN,MAAqB;AAAA,MACnB,YAAY,WAAW;AACrB,aAAK,WAAW,QAAQ,YAAY,SAAS;AAC7C,YAAI,CAAC,KAAK,UAAU;AAClB,gBAAM,IAAI,MAAM,sBAAsB;AAAA,QACxC;AAAA,MACF;AAAA,MAEA,MAAM,MAAM;AACV,YAAI,OAAO,SAAS,UAAU;AAC5B,gBAAM,IAAI,MAAM,uBAAuB;AAAA,QACzC;AAEA,cAAM,YAAY,QAAQ,aAAa,KAAK,UAAU,IAAI;AAC1D,YAAI,CAAC,WAAW;AACd,gBAAM,IAAI,MAAM,8BAA8B;AAAA,QAChD;AAEA,eAAO;AAAA,MACT;AAAA,MAEA,QAAQ;AACN,YAAI,KAAK,UAAU;AACjB,kBAAQ,aAAa,KAAK,QAAQ;AAClC,eAAK,WAAW;AAAA,QAClB;AAAA,MACF;AAAA,IACF;AAEA,aAAS,OAAO,WAAW;AACzB,aAAO,IAAI,eAAe,SAAS;AAAA,IACrC;AAEA,IAAAA,QAAO,UAAU;AAAA,MACf;AAAA,MACA;AAAA,IACF;AAAA;AAAA;;;ACtCA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,aAAwB;;;ACAxB,oBAAmB;;;ACEZ,IAAe,oBAAf,MAAiC;AAAA,EAGtC,YAAYC,SAAqB;AAC/B,SAAK,SAASA;AAAA,EAChB;AAAA,EAQU,WAAmB;AAC3B,WAAO,KAAK,OAAO,SAAS;AAAA,EAC9B;AAAA,EAEA,MAAgB,UAAU,OAAoC;AAC5D,QAAI,MAAM,MAAM;AACd,aAAO,MAAM;AAAA,IACf;AAEA,QAAI,MAAM,UAAU;AAClB,YAAM,KAAK,MAAM,OAAO,aAAa;AACrC,aAAO,MAAM,GAAG,SAAS,MAAM,UAAU,OAAO;AAAA,IAClD;AAEA,UAAM,IAAI,MAAM,0CAA0C;AAAA,EAC5D;AACF;;;ACjBO,IAAM,UAAN,MAAM,QAAO;AAAA,EAqBhB,YAAY,aAAqB,YAAY,QAAkB,cAAe;AAC1E,SAAK,aAAa;AAClB,SAAK,eAAe;AAAA,EACxB;AAAA,EAEA,OAAO,YAAY,YAAqB,OAA0B;AAC9D,QAAI,CAAC,QAAO,UAAU;AAClB,cAAO,WAAW,IAAI,QAAO,cAAc,YAAY,KAAK;AAAA,IAChE;AACA,WAAO,QAAO;AAAA,EAClB;AAAA,EAEA,SAAS,OAAuB;AAC5B,SAAK,eAAe;AAAA,EACxB;AAAA,EAEA,WAAqB;AACjB,WAAO,KAAK;AAAA,EAChB;AAAA,EAEQ,cAAc,OAAiB,SAAyB;AAC5D,UAAM,YAAY,QAAO,YAAY,KAAK;AAC1C,UAAM,QAAQ,QAAO,OAAO,SAAuC;AACnE,UAAM,QAAQ,QAAO,OAAO;AAE5B,WAAO,GAAG,KAAK,IAAI,SAAS,IAAI,KAAK,UAAU,KAAK,KAAK,IAAI,OAAO;AAAA;AAAA;AAAA,EACxE;AAAA,EAEQ,IAAI,OAAiB,SAAuB;AAChD,QAAI,QAAQ,KAAK,cAAc;AAC3B;AAAA,IACJ;AAEA,UAAM,mBAAmB,KAAK,cAAc,OAAO,OAAO;AAC1D,YAAQ,OAAO,MAAM,gBAAgB;AAAA,EACzC;AAAA,EAEA,MAAM,SAAuB;AACzB,SAAK,IAAI,eAAgB,OAAO;AAAA,EACpC;AAAA,EAEA,KAAK,SAAuB;AACxB,SAAK,IAAI,cAAe,OAAO;AAAA,EACnC;AAAA,EAEA,KAAK,SAAuB;AACxB,SAAK,IAAI,cAAe,OAAO;AAAA,EACnC;AAAA,EAEA,MAAM,SAAuB;AACzB,SAAK,IAAI,eAAgB,OAAO;AAAA,EACpC;AAAA;AAAA,EAGA,OAAO,MAAM,SAAiB,YAA2B;AACrD,UAAMC,UAAS,IAAI,QAAO,cAAc,UAAU;AAClD,IAAAA,QAAO,MAAM,OAAO;AAAA,EACxB;AAAA,EAEA,OAAO,KAAK,SAAiB,YAA2B;AACpD,UAAMA,UAAS,IAAI,QAAO,cAAc,UAAU;AAClD,IAAAA,QAAO,KAAK,OAAO;AAAA,EACvB;AAAA,EAEA,OAAO,KAAK,SAAiB,YAA2B;AACpD,UAAMA,UAAS,IAAI,QAAO,cAAc,UAAU;AAClD,IAAAA,QAAO,KAAK,OAAO;AAAA,EACvB;AAAA,EAEA,OAAO,MAAM,SAAiB,YAA2B;AACrD,UAAMA,UAAS,IAAI,QAAO,cAAc,UAAU;AAClD,IAAAA,QAAO,MAAM,OAAO;AAAA,EACxB;AAAA;AAAA,EAGA,OAAO,mBAAmB,YAAoB,OAA0B;AACpE,WAAO,IAAI,QAAO,YAAY,UAAU,IAAI,KAAK;AAAA,EACrD;AACJ;AAAA;AAnGa,QAMe,SAAS;AAAA,EAC7B,OAAO;AAAA,EACP,OAAO;AAAA;AAAA,EACP,MAAM;AAAA;AAAA,EACN,MAAM;AAAA;AAAA,EACN,OAAO;AAAA;AACX;AAZS,QAce,cAAc;AAAA,EAClC,CAAC,aAAc,GAAG;AAAA,EAClB,CAAC,YAAa,GAAG;AAAA,EACjB,CAAC,YAAa,GAAG;AAAA,EACjB,CAAC,aAAc,GAAG;AACtB;AAnBG,IAAM,SAAN;AAsGA,IAAM,SAAS,OAAO,YAAY;;;AF/GzC,IAAMC,UAAS,OAAO,mBAAmB,QAAQ;AAE1C,IAAM,iBAAN,cAA6B,kBAAkB;AAAA,EAGpD,YAAYC,SAAqB;AAC/B,UAAMA,OAAM;AAEZ,QAAI,CAACA,QAAO,QAAQ;AAClB,YAAM,IAAI,MAAM,4BAA4B;AAAA,IAC9C;AAEA,SAAK,SAAS,IAAI,cAAAC,QAAO;AAAA,MACvB,QAAQD,QAAO;AAAA,MACf,SAASA,QAAO;AAAA,MAChB,SAASA,QAAO,WAAW;AAAA,IAC7B,CAAC;AAED,IAAAD,QAAO,KAAK,6BAA6B;AAAA,EAC3C;AAAA,EAEA,MAAM,MAAM,OAAyC;AACnD,QAAI;AACF,YAAM,OAAO,MAAM,KAAK,UAAU,KAAK;AACvC,MAAAA,QAAO,MAAM,8BAA8B,KAAK,SAAS,CAAC,EAAE;AAE5D,YAAM,WAAW,MAAM,KAAK,OAAO,WAAW,OAAO;AAAA,QACnD,OAAO,KAAK,SAAS;AAAA,QACrB,OAAO;AAAA,MACT,CAAC;AAED,YAAM,YAAY,SAAS,KAAK,CAAC;AACjC,UAAI,CAAC,WAAW;AACd,cAAM,IAAI,MAAM,uCAAuC;AAAA,MACzD;AAEA,aAAO;AAAA,QACL,WAAW,UAAU,aAAa,CAAC;AAAA,QACnC,YAAY,UAAU,WAAW,UAAU;AAAA,QAC3C,OAAO,SAAS;AAAA,QAChB,UAAU;AAAA,QACV,OAAO,SAAS,QAAQ;AAAA,UACtB,cAAc,SAAS,MAAM;AAAA,UAC7B,aAAa,SAAS,MAAM;AAAA,QAC9B,IAAI;AAAA,MACN;AAAA,IACF,SAAS,OAAgB;AACvB,MAAAA,QAAO,MAAM,4BAA6B,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAE,EAAE;AACnG,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAM,WAAW,QAAiD;AAChE,QAAI;AACF,YAAM,QAAQ,MAAM,QAAQ,IAAI,OAAO,IAAI,WAAS,KAAK,UAAU,KAAK,CAAC,CAAC;AAC1E,MAAAA,QAAO,MAAM,mBAAmB,MAAM,MAAM,sBAAsB,KAAK,SAAS,CAAC,EAAE;AAEnF,YAAM,WAAW,MAAM,KAAK,OAAO,WAAW,OAAO;AAAA,QACnD,OAAO,KAAK,SAAS;AAAA,QACrB,OAAO;AAAA,MACT,CAAC;AAED,YAAM,aAAa,SAAS,KAAK,IAAI,UAAQ,KAAK,SAAS;AAE3D,aAAO;AAAA,QACL;AAAA,QACA,YAAY,WAAW,CAAC,GAAG,UAAU;AAAA,QACrC,OAAO,SAAS;AAAA,QAChB,UAAU;AAAA,QACV,OAAO,SAAS,QAAQ;AAAA,UACtB,cAAc,SAAS,MAAM;AAAA,UAC7B,aAAa,SAAS,MAAM;AAAA,QAC9B,IAAI;AAAA,MACN;AAAA,IACF,SAAS,OAAgB;AACvB,MAAAA,QAAO,MAAM,kCAAmC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAE,EAAE;AACzG,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,gBAAwB;AAEtB,UAAM,QAAQ,KAAK,SAAS;AAC5B,QAAI,MAAM,SAAS,wBAAwB,EAAG,QAAO;AACrD,QAAI,MAAM,SAAS,wBAAwB,EAAG,QAAO;AACrD,QAAI,MAAM,SAAS,wBAAwB,EAAG,QAAO;AACrD,WAAO;AAAA,EACT;AAAA,EAEA,kBAA0B;AACxB,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,UAA4B;AAChC,QAAI;AACF,YAAM,KAAK,OAAO,OAAO,KAAK;AAC9B,aAAO;AAAA,IACT,SAAS,OAAgB;AACvB,MAAAA,QAAO,MAAM,kCAAmC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAE,EAAE;AACzG,aAAO;AAAA,IACT;AAAA,EACF;AACF;;;AG3GA,2BAAmC;AAKnC,IAAMG,UAAS,OAAO,mBAAmB,QAAQ;AAE1C,IAAM,iBAAN,cAA6B,kBAAkB;AAAA,EAGpD,YAAYC,SAAqB;AAC/B,UAAMA,OAAM;AAEZ,QAAI,CAACA,QAAO,QAAQ;AAClB,YAAM,IAAI,MAAM,4BAA4B;AAAA,IAC9C;AAEA,SAAK,SAAS,IAAI,wCAAmBA,QAAO,MAAM;AAClD,IAAAD,QAAO,KAAK,6BAA6B;AAAA,EAC3C;AAAA,EAEA,MAAM,MAAM,OAAyC;AACnD,QAAI;AACF,YAAM,OAAO,MAAM,KAAK,UAAU,KAAK;AACvC,MAAAA,QAAO,MAAM,8BAA8B,KAAK,SAAS,CAAC,EAAE;AAG5D,YAAM,QAAQ,KAAK,OAAO,mBAAmB;AAAA,QAC3C,OAAO,KAAK,SAAS;AAAA,MACvB,CAAC;AAGD,YAAM,SAAS,MAAM,MAAM,aAAa,IAAI;AAC5C,YAAM,YAAY,OAAO;AAEzB,aAAO;AAAA,QACL,WAAW,UAAU;AAAA,QACrB,YAAY,UAAU,OAAO;AAAA,QAC7B,OAAO,KAAK,SAAS;AAAA,QACrB,UAAU;AAAA,MACZ;AAAA,IACF,SAAS,OAAgB;AACvB,MAAAA,QAAO,MAAM,4BAA6B,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAE,EAAE;AACnG,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAM,WAAW,QAAiD;AAChE,QAAI;AACF,YAAM,QAAQ,MAAM,QAAQ,IAAI,OAAO,IAAI,WAAS,KAAK,UAAU,KAAK,CAAC,CAAC;AAC1E,MAAAA,QAAO,MAAM,mBAAmB,MAAM,MAAM,sBAAsB,KAAK,SAAS,CAAC,EAAE;AAEnF,YAAM,QAAQ,KAAK,OAAO,mBAAmB;AAAA,QAC3C,OAAO,KAAK,SAAS;AAAA,MACvB,CAAC;AAED,YAAM,UAAU,MAAM,QAAQ;AAAA,QAC5B,MAAM,IAAI,UAAQ,MAAM,aAAa,IAAI,CAAC;AAAA,MAC5C;AAEA,YAAM,aAAa,QAAQ,IAAI,CAAC,WAAgD,OAAO,UAAU,MAAM;AAEvG,aAAO;AAAA,QACL;AAAA,QACA,YAAY,WAAW,CAAC,GAAG,UAAU;AAAA,QACrC,OAAO,KAAK,SAAS;AAAA,QACrB,UAAU;AAAA,MACZ;AAAA,IACF,SAAS,OAAgB;AACvB,MAAAA,QAAO,MAAM,kCAAmC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAE,EAAE;AACzG,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,gBAAwB;AACtB,UAAM,QAAQ,KAAK,SAAS;AAC5B,QAAI,MAAM,SAAS,sBAAsB,EAAG,QAAO;AACnD,QAAI,MAAM,SAAS,oBAAoB,EAAG,QAAO;AACjD,QAAI,MAAM,SAAS,eAAe,EAAG,QAAO;AAC5C,QAAI,MAAM,SAAS,qBAAqB,EAAG,QAAO;AAClD,WAAO;AAAA,EACT;AAAA,EAEA,kBAA0B;AACxB,WAAO;AAAA,EACT;AAAA,EAEU,WAAmB;AAC3B,WAAO,KAAK,OAAO,SAAS;AAAA,EAC9B;AAAA,EAEA,MAAM,UAA4B;AAChC,QAAI;AACF,YAAM,QAAQ,KAAK,OAAO,mBAAmB;AAAA,QAC3C,OAAO,KAAK,SAAS;AAAA,MACvB,CAAC;AAED,YAAM,MAAM,aAAa,MAAM;AAC/B,aAAO;AAAA,IACT,SAAS,OAAgB;AACvB,MAAAA,QAAO,MAAM,kCAAmC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAE,EAAE;AACzG,aAAO;AAAA,IACT;AAAA,EACF;AACF;;;ACxGA,uBAAwB;AAKxB,IAAME,UAAS,OAAO,mBAAmB,SAAS;AAE3C,IAAM,kBAAN,cAA8B,kBAAkB;AAAA,EAGrD,YAAYC,SAAqB;AAC/B,UAAMA,OAAM;AAEZ,QAAI,CAACA,QAAO,QAAQ;AAClB,YAAM,IAAI,MAAM,6BAA6B;AAAA,IAC/C;AAEA,SAAK,SAAS,IAAI,yBAAQ;AAAA,MACxB,QAAQA,QAAO;AAAA,MACf,WAAWA,QAAO;AAAA,MAClB,WAAWA,QAAO,WAAW;AAAA,IAC/B,CAAC;AAED,IAAAD,QAAO,KAAK,8BAA8B;AAAA,EAC5C;AAAA,EAEA,MAAM,MAAM,OAAyC;AACnD,QAAI;AACF,YAAM,OAAO,MAAM,KAAK,UAAU,KAAK;AACvC,MAAAA,QAAO,MAAM,8BAA8B,KAAK,SAAS,CAAC,EAAE;AAE5D,YAAM,WAAW,MAAM,KAAK,OAAO,WAAW,OAAO;AAAA,QACnD,OAAO,KAAK,SAAS;AAAA,QACrB,QAAQ,CAAC,IAAI;AAAA,MACf,CAAC;AAED,YAAM,YAAY,SAAS,KAAK,CAAC;AACjC,UAAI,CAAC,WAAW;AACd,cAAM,IAAI,MAAM,wCAAwC;AAAA,MAC1D;AAEA,aAAO;AAAA,QACL,WAAW,UAAU,aAAa,CAAC;AAAA,QACnC,YAAY,UAAU,WAAW,UAAU;AAAA,QAC3C,OAAO,SAAS;AAAA,QAChB,UAAU;AAAA,QACV,OAAO,SAAS,OAAO,gBAAgB,SAAS,OAAO,cAAc;AAAA,UACnE,cAAc,SAAS,MAAM;AAAA,UAC7B,aAAa,SAAS,MAAM;AAAA,QAC9B,IAAI;AAAA,MACN;AAAA,IACF,SAAS,OAAgB;AACvB,MAAAA,QAAO,MAAM,6BAA8B,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAE,EAAE;AACpG,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAM,WAAW,QAAiD;AAChE,QAAI;AACF,YAAM,QAAQ,MAAM,QAAQ,IAAI,OAAO,IAAI,WAAS,KAAK,UAAU,KAAK,CAAC,CAAC;AAC1E,MAAAA,QAAO,MAAM,mBAAmB,MAAM,MAAM,sBAAsB,KAAK,SAAS,CAAC,EAAE;AAEnF,YAAM,WAAW,MAAM,KAAK,OAAO,WAAW,OAAO;AAAA,QACnD,OAAO,KAAK,SAAS;AAAA,QACrB,QAAQ;AAAA,MACV,CAAC;AAED,YAAM,aAAa,SAAS,KAAK,IAAI,CAAC,SAAS;AAC7C,YAAI,CAAC,KAAK,UAAW,OAAM,IAAI,MAAM,wCAAwC;AAC7E,eAAO,KAAK;AAAA,MACd,CAAC;AAED,aAAO;AAAA,QACL;AAAA,QACA,YAAY,WAAW,CAAC,GAAG,UAAU;AAAA,QACrC,OAAO,SAAS;AAAA,QAChB,UAAU;AAAA,QACV,OAAO,SAAS,OAAO,gBAAgB,SAAS,OAAO,cAAc;AAAA,UACnE,cAAc,SAAS,MAAM;AAAA,UAC7B,aAAa,SAAS,MAAM;AAAA,QAC9B,IAAI;AAAA,MACN;AAAA,IACF,SAAS,OAAgB;AACvB,MAAAA,QAAO,MAAM,mCAAoC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAE,EAAE;AAC1G,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,gBAAwB;AAEtB,UAAM,QAAQ,KAAK,SAAS;AAC5B,QAAI,MAAM,SAAS,eAAe,EAAG,QAAO;AAC5C,WAAO;AAAA,EACT;AAAA,EAEA,kBAA0B;AACxB,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,UAA4B;AAChC,QAAI;AAEF,YAAM,WAAW,MAAM,KAAK,OAAO,WAAW,OAAO;AAAA,QACnD,OAAO,KAAK,SAAS;AAAA,QACrB,QAAQ,CAAC,MAAM;AAAA,MACjB,CAAC;AACD,aAAO,SAAS,KAAK,SAAS;AAAA,IAChC,SAAS,OAAgB;AACvB,MAAAA,QAAO,MAAM,mCAAoC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAE,EAAE;AAC1G,aAAO;AAAA,IACT;AAAA,EACF;AACF;;;AC3GA,sBAAkC;AAClC,kBAA8B;AAI9B,WAAsB;AAGtB,IAAI,eAAoB;AACxB,IAAI;AACF,iBAAe;AACf,SAAO,KAAK,+BAA+B;AAC7C,SAAS,OAAO;AACd,SAAO,KAAK,mDAAmD;AACjE;AAOO,IAAM,mBAAN,cAA+B,kBAAkB;AAAA,EAMtD,YAAYE,SAAwB;AAClC,UAAM,EAAE,GAAGA,SAAQ,UAAU,WAAW,CAAC;AAH3C,SAAQ,cAAmB;AAIzB,SAAK,YAAYA,QAAO,SAAS;AACjC,SAAK,YAAYA,QAAO,aAAa;AACrC,SAAK,YAAY,CAAC,CAAC;AAEnB,QAAI,KAAK,WAAW;AAClB,UAAI;AACF,aAAK,cAAc,aAAa,OAAO,KAAK,SAAS;AACrD,eAAO,KAAK,sDAAsD,KAAK,SAAS,EAAE;AAAA,MACpF,SAAS,OAAO;AACd,eAAO,MAAM,uCAAuC,KAAK,EAAE;AAC3D,aAAK,YAAY;AAAA,MACnB;AAAA,IACF,OAAO;AACL,aAAO,KAAK,sDAAsD,KAAK,SAAS,EAAE;AAAA,IACpF;AAAA,EACF;AAAA;AAAA,EAGA,kBAA0B;AACxB,WAAO;AAAA,EACT;AAAA,EAEA,gBAAwB;AAEtB,UAAM,QAAQ,KAAK,SAAS;AAC5B,QAAI,MAAM,SAAS,uBAAuB,EAAG,QAAO;AACpD,QAAI,MAAM,SAAS,qBAAqB,EAAG,QAAO;AAClD,QAAI,MAAM,SAAS,kBAAkB,EAAG,QAAO;AAC/C,QAAI,MAAM,SAAS,UAAU,EAAG,QAAO;AACvC,QAAI,MAAM,SAAS,WAAW,EAAG,QAAO;AACxC,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,UAA4B;AAChC,QAAI;AACF,UAAI,KAAK,aAAa,KAAK,aAAa;AAEtC,eAAO;AAAA,MACT;AAGA,gBAAM,wBAAO,KAAK,WAAW,0BAAU,IAAI;AAC3C,gBAAM,wBAAO,KAAK,WAAW,0BAAU,IAAI;AAG3C,YAAM,YAAY,MAAM,KAAK,aAAa;AAC1C,gBAAM,wBAAO,WAAW,0BAAU,IAAI;AAEtC,aAAO,MAAM,6BAA6B;AAC1C,aAAO;AAAA,IACT,SAAS,OAAgB;AACvB,aAAO,MAAM,qCAAsC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAE,EAAE;AAC5G,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,MAAM,OAAyC;AACnD,QAAI;AACF,aAAO,MAAM,kCAAkC,KAAK,SAAS,CAAC,EAAE;AAEhE,YAAM,OAAO,MAAM,KAAK,UAAU,KAAK;AACvC,UAAI,CAAC,KAAK,KAAK,GAAG;AAChB,cAAM,IAAI,MAAM,4BAA4B;AAAA,MAC9C;AAEA,UAAI,KAAK,aAAa,KAAK,aAAa;AAEtC,cAAMC,aAAY,KAAK,YAAY,MAAM,IAAI;AAE7C,eAAO;AAAA,UACL,WAAAA;AAAA,UACA,YAAYA,WAAU;AAAA,UACtB,OAAO,KAAK,SAAS;AAAA,UACrB,UAAU;AAAA,QACZ;AAAA,MACF;AAGA,YAAM,cAAc;AAAA,QAClB,OAAO;AAAA,QACP,OAAO,MAAM,KAAK,aAAa;AAAA,QAC/B,SAAS;AAAA,QACT,WAAW;AAAA,MACb;AAGA,YAAM,SAAS,MAAM,KAAK,sBAAsB,CAAC,KAAK,UAAU,WAAW,CAAC,CAAC;AAG7E,YAAM,YAAY,KAAK,eAAe,OAAO,MAAM;AAEnD,aAAO;AAAA,QACL;AAAA,QACA,YAAY,UAAU;AAAA,QACtB,OAAO,KAAK,SAAS;AAAA,QACrB,UAAU;AAAA,MACZ;AAAA,IACF,SAAS,OAAgB;AACvB,aAAO,MAAM,+BAAgC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAE,EAAE;AACtG,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAM,WAAW,QAAiD;AAChE,QAAI;AACF,aAAO,MAAM,mBAAmB,OAAO,MAAM,uBAAuB;AAEpE,UAAI,KAAK,aAAa,KAAK,aAAa;AAEtC,cAAMC,cAAyB,CAAC;AAEhC,mBAAW,SAAS,QAAQ;AAC1B,gBAAM,OAAO,MAAM,KAAK,UAAU,KAAK;AACvC,cAAI,KAAK,KAAK,GAAG;AACf,kBAAM,YAAY,KAAK,YAAY,MAAM,IAAI;AAC7C,YAAAA,YAAW,KAAK,SAAS;AAAA,UAC3B;AAAA,QACF;AAEA,YAAIA,YAAW,WAAW,GAAG;AAC3B,gBAAM,IAAI,MAAM,yBAAyB;AAAA,QAC3C;AAEA,eAAO;AAAA,UACL,YAAAA;AAAA,UACA,YAAYA,YAAW,CAAC,GAAG,UAAU;AAAA,UACrC,OAAO,KAAK,SAAS;AAAA,UACrB,UAAU;AAAA,QACZ;AAAA,MACF;AAGA,YAAM,QAAQ,CAAC;AACf,iBAAW,SAAS,QAAQ;AAC1B,cAAM,OAAO,MAAM,KAAK,UAAU,KAAK;AACvC,YAAI,KAAK,KAAK,GAAG;AACf,gBAAM,KAAK,IAAI;AAAA,QACjB;AAAA,MACF;AAEA,UAAI,MAAM,WAAW,GAAG;AACtB,cAAM,IAAI,MAAM,yBAAyB;AAAA,MAC3C;AAGA,YAAM,YAAY,MAAM,KAAK,aAAa;AAC1C,YAAM,WAAW,OAAO,IAAI,YAAU;AAAA,QACpC,OAAO,MAAM,QAAQ;AAAA,QACrB,OAAO;AAAA,QACP,SAAS;AAAA,QACT,WAAW;AAAA,MACb,EAAE;AAGF,YAAM,aAAyB,CAAC;AAChC,iBAAWC,YAAW,UAAU;AAC9B,cAAM,SAAS,MAAM,KAAK,sBAAsB,CAAC,KAAK,UAAUA,QAAO,CAAC,CAAC;AACzE,cAAM,YAAY,KAAK,eAAe,OAAO,MAAM;AACnD,mBAAW,KAAK,SAAS;AAAA,MAC3B;AAEA,aAAO;AAAA,QACL;AAAA,QACA,YAAY,WAAW,CAAC,GAAG,UAAU;AAAA,QACrC,OAAO,KAAK,SAAS;AAAA,QACrB,UAAU;AAAA,MACZ;AAAA,IACF,SAAS,OAAgB;AACvB,aAAO,MAAM,qCAAsC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAE,EAAE;AAC5G,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,UAAyB;AAC7B,QAAI,KAAK,aAAa,KAAK,aAAa;AACtC,UAAI;AACF,aAAK,YAAY,MAAM;AACvB,aAAK,cAAc;AACnB,eAAO,KAAK,+BAA+B;AAAA,MAC7C,SAAS,OAAO;AACd,eAAO,MAAM,+BAA+B,KAAK,EAAE;AAAA,MACrD;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGU,WAAmB;AAC3B,WAAO,KAAK;AAAA,EACd;AAAA;AAAA,EAGA,MAAc,eAAgC;AAE5C,UAAM,gBAAgB;AAAA,MACpB,KAAK;AAAA;AAAA,UACL,kBAAK,sBAAsB,KAAK,SAAS;AAAA;AAAA,UACzC,kBAAK,eAAe,KAAK,SAAS;AAAA;AAAA,MAClC,KAAK;AAAA;AAAA,IACP;AAEA,eAAW,QAAQ,eAAe;AAChC,UAAI;AACF,kBAAM,wBAAO,MAAM,0BAAU,IAAI;AACjC,mBAAO,qBAAQ,IAAI;AAAA,MACrB,QAAQ;AACN;AAAA,MACF;AAAA,IACF;AAEA,UAAM,IAAI,MAAM,yBAAyB,KAAK,SAAS,EAAE;AAAA,EAC3D;AAAA,EAEA,MAAc,sBAAsB,MAA2D;AAC7F,WAAO,IAAI,QAAQ,CAACC,UAAS,WAAW;AAEtC,YAAM,OAAO;AAGb,UAAI;AACJ,UAAI;AACF,sBAAc,KAAK,MAAM,KAAK,CAAC,KAAK,IAAI;AAAA,MAC1C,QAAQ;AACN,eAAO,IAAI,MAAM,mCAAmC,CAAC;AACrD;AAAA,MACF;AAEA,YAAM,WAAW,KAAK,UAAU,WAAW;AAE3C,YAAM,UAAU;AAAA,QACd,UAAU;AAAA,QACV;AAAA,QACA,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,UAChB,kBAAkB,OAAO,WAAW,QAAQ;AAAA,QAC9C;AAAA,MACF;AAEA,YAAM,MAAW,aAAQ,SAAS,CAAC,QAA8B;AAC/D,YAAI,OAAO;AAEX,YAAI,GAAG,QAAQ,CAAC,UAA2B;AACzC,kBAAQ;AAAA,QACV,CAAC;AAED,YAAI,GAAG,OAAO,MAAM;AAClB,cAAI,IAAI,eAAe,KAAK;AAC1B,YAAAA,SAAQ,EAAE,QAAQ,MAAM,QAAQ,GAAG,CAAC;AAAA,UACtC,OAAO;AACL,mBAAO,IAAI,MAAM,QAAQ,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;AAAA,UACrD;AAAA,QACF,CAAC;AAAA,MACH,CAAC;AAED,UAAI,GAAG,SAAS,CAAC,UAAiB;AAChC,eAAO,IAAI,MAAM,0CAA2C,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAE,EAAE,CAAC;AAAA,MACxH,CAAC;AAED,UAAI,MAAM,QAAQ;AAClB,UAAI,IAAI;AAAA,IACV,CAAC;AAAA,EACH;AAAA,EAEQ,eAAe,QAA0B;AAC/C,QAAI;AACF,YAAM,WAAW,KAAK,MAAM,MAAM;AAElC,aAAO,MAAM,+BAA+B,OAAO,QAAQ,EAAE;AAC7D,aAAO,MAAM,0BAA0B,MAAM,QAAQ,QAAQ,CAAC,EAAE;AAIhE,UAAI,MAAM,QAAQ,QAAQ,KAAK,SAAS,SAAS,GAAG;AAClD,cAAM,QAAQ,SAAS,CAAC;AAExB,YAAI,SAAS,MAAM,aAAa,MAAM,QAAQ,MAAM,SAAS,GAAG;AAC9D,gBAAM,MAAM,MAAM;AAGlB,cAAI,MAAM,QAAQ,IAAI,CAAC,CAAC,GAAG;AACzB,kBAAM,OAAO,IAAI,CAAC;AAClB,mBAAO,MAAM,UAAU,KAAK,MAAM,sBAAsB;AACxD,mBAAO;AAAA,UACT;AAGA,iBAAO,MAAM,UAAU,IAAI,MAAM,sBAAsB;AACvD,iBAAO;AAAA,QACT;AAAA,MACF;AAGA,UAAI,SAAS,aAAa,MAAM,QAAQ,SAAS,SAAS,GAAG;AAC3D,cAAM,MAAM,SAAS;AAGrB,YAAI,MAAM,QAAQ,IAAI,CAAC,CAAC,GAAG;AACzB,iBAAO,IAAI,CAAC;AAAA,QACd;AAEA,eAAO;AAAA,MACT;AAGA,UAAI,MAAM,QAAQ,QAAQ,KAAK,OAAO,SAAS,CAAC,MAAM,UAAU;AAC9D,eAAO,MAAM,UAAU,SAAS,MAAM,0BAA0B;AAChE,eAAO;AAAA,MACT;AAEA,YAAM,IAAI,MAAM,sBAAsB,KAAK,UAAU,OAAO,KAAK,QAAQ,CAAC,CAAC,EAAE;AAAA,IAE/E,SAAS,OAAgB;AACvB,YAAM,eAAe,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAC1E,YAAM,IAAI,MAAM,iBAAiB,YAAY,EAAE;AAAA,IACjD;AAAA,EACF;AAAA,EAEQ,iBAAiB,QAA4B;AAEnD,UAAM,eAAe;AACrB,UAAM,UAAU,CAAC,GAAG,OAAO,SAAS,YAAY,CAAC;AAEjD,QAAI,QAAQ,WAAW,GAAG;AACxB,YAAM,IAAI,MAAM,qCAAqC;AAAA,IACvD;AAEA,UAAM,aAAa,QAAQ,IAAI,WAAS;AACtC,YAAM,SAAS,MAAM,CAAC,GAAG,MAAM,GAAG,EAAE,IAAI,OAAK,EAAE,KAAK,CAAC,KAAK,CAAC;AAC3D,aAAO,OAAO,IAAI,OAAK,WAAW,CAAC,CAAC,EAAE,OAAO,OAAK,CAAC,MAAM,CAAC,CAAC;AAAA,IAC7D,CAAC,EAAE,OAAO,eAAa,UAAU,SAAS,CAAC;AAE3C,WAAO;AAAA,EACT;AACF;;;ACzWA,IAAMC,UAAS,OAAO,mBAAmB,SAAS;AAE3C,IAAM,mBAAN,MAAuB;AAAA,EAQ5B,OAAO,OAAOC,SAAqB;AACjC,IAAAD,QAAO,KAAK,sBAAsBC,QAAO,QAAQ,EAAE;AAEnD,UAAM,gBAAgB,KAAK,UAAU,IAAIA,QAAO,QAAQ;AACxD,QAAI,CAAC,eAAe;AAClB,YAAM,IAAI,MAAM,yBAAyBA,QAAO,QAAQ,EAAE;AAAA,IAC5D;AAEA,WAAO,IAAI,cAAcA,OAAM;AAAA,EACjC;AAAA,EAEA,OAAO,wBAAwC;AAC7C,WAAO,MAAM,KAAK,KAAK,UAAU,KAAK,CAAC;AAAA,EACzC;AACF;AAtBa,iBACI,YAAY,oBAAI,IAAkE;AAAA,EAC/F,CAAC,UAAU,cAAc;AAAA,EACzB,CAAC,UAAU,cAAc;AAAA,EACzB,CAAC,WAAW,eAAe;AAAA,EAC3B,CAAC,YAAY,gBAAgB;AAAA;AAC/B,CAAC;;;APVI,cAAO;AAEd,IAAMC,UAAS,OAAO,mBAAmB,MAAM;AAS/C,eAAsB,MACpBC,SACA,OACyC;AACzC,MAAI;AACF,IAAAD,QAAO,KAAK,qCAAqCC,QAAO,QAAQ,EAAE;AAGlE,UAAM,WAAW,iBAAiB,OAAOA,OAAM;AAG/C,UAAM,UAAU,MAAM,SAAS,QAAQ;AACvC,QAAI,CAAC,SAAS;AACZ,YAAM,IAAI,MAAM,YAAYA,QAAO,QAAQ,eAAe;AAAA,IAC5D;AAGA,QAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,MAAAD,QAAO,MAAM,uBAAuB,MAAM,MAAM,QAAQ;AACxD,aAAO,MAAM,SAAS,WAAW,KAAK;AAAA,IACxC,OAAO;AACL,MAAAA,QAAO,MAAM,wBAAwB;AACrC,aAAO,MAAM,SAAS,MAAM,KAAK;AAAA,IACnC;AAAA,EAEF,SAAS,OAAgB;AACvB,UAAM,eAAe,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAC1E,IAAAA,QAAO,MAAM,qBAAqB,YAAY,EAAE;AAChD,UAAM;AAAA,EACR;AACF;AAQA,eAAsB,UACpB,OACyC;AACzC,EAAAA,QAAO,KAAK,iCAAiC;AAG7C,QAAM,YAAY;AAAA,IAChB,EAAE,UAAU,YAAqB,OAAO,oCAAoC;AAAA;AAAA,IAC5E,EAAE,UAAU,UAAmB,OAAO,0BAA0B,QAAQ,QAAQ,IAAI,kBAAkB,OAAU;AAAA,IAChH,EAAE,UAAU,UAAmB,OAAO,wBAAwB,QAAQ,QAAQ,IAAI,gCAAgC,OAAU;AAAA,IAC5H,EAAE,UAAU,WAAoB,OAAO,iBAAiB,QAAQ,QAAQ,IAAI,mBAAmB,OAAU;AAAA,EAC3G;AAEA,aAAWC,WAAU,WAAW;AAC9B,QAAI;AAEF,UAAIA,QAAO,aAAa,cAAcA,QAAO,QAAQ;AACnD,QAAAD,QAAO,KAAK,oBAAoBC,QAAO,QAAQ,EAAE;AAEjD,cAAM,cAA2B;AAAA,UAC/B,UAAUA,QAAO;AAAA,UACjB,OAAOA,QAAO;AAAA,QAChB;AAEA,YAAIA,QAAO,QAAQ;AACjB,sBAAY,SAASA,QAAO;AAAA,QAC9B;AAEA,eAAO,MAAM,MAAM,aAAa,KAAK;AAAA,MACvC;AAAA,IACF,SAAS,OAAgB;AACvB,YAAM,eAAe,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAC1E,MAAAD,QAAO,KAAK,YAAYC,QAAO,QAAQ,YAAY,YAAY,EAAE;AACjE;AAAA,IACF;AAAA,EACF;AAEA,QAAM,IAAI,MAAM,uCAAuC;AACzD;AAKO,SAAS,wBAAwB;AACtC,SAAO,iBAAiB,sBAAsB;AAChD;AAKO,SAAS,eAAeA,SAAqB;AAClD,SAAO,iBAAiB,OAAOA,OAAM;AACvC;;;ADjFO,IAAM,UAAU;AAKhB,SAAS,aAAqB;AACnC,SAAO;AACT;AAKO,IAAM,WAAW;AAAA,EACtB,MAAM;AAAA,EACN,SAAS;AAAA,EACT,aAAa;AAAA,EACb,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,oBAAoB;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;","names":["exports","module","exports","module","config","logger","logger","config","OpenAI","logger","config","logger","config","config","embedding","embeddings","request","resolve","logger","config","logger","config"]}
1
+ {"version":3,"sources":["node-file:/home/inky/Development/vecbox/native/build/Release/llama_embedding.node","../native/index.js","../index.ts","../main.ts","../src/providers/openai.ts","../src/providers/base/EmbeddingProvider.ts","../src/util/logger.ts","../src/providers/gemini.ts","../src/providers/mistral.ts","../src/providers/llamacpp.ts","../src/factory/EmbeddingFactory.ts"],"sourcesContent":["\n import path from \"/home/inky/Development/vecbox/native/build/Release/llama_embedding.node\"\n try { module.exports = require(path) }\n catch {}\n ","const binding = require('./build/Release/llama_embedding.node');\n\nclass LlamaEmbedding {\n constructor(modelPath) {\n this.modelPtr = binding.createModel(modelPath);\n if (!this.modelPtr) {\n throw new Error('Failed to load model');\n }\n }\n\n embed(text) {\n if (typeof text !== 'string') {\n throw new Error('Text must be a string');\n }\n \n const embedding = binding.getEmbedding(this.modelPtr, text);\n if (!embedding) {\n throw new Error('Failed to generate embedding');\n }\n \n return embedding;\n }\n\n close() {\n if (this.modelPtr) {\n binding.destroyModel(this.modelPtr);\n this.modelPtr = null;\n }\n }\n}\n\nfunction create(modelPath) {\n return new LlamaEmbedding(modelPath);\n}\n\nmodule.exports = {\n create,\n LlamaEmbedding\n};\n","/**\n * Embedbox v1.0.0 - Main Entry Point\n * \n * A minimal and powerful embedding library that supports multiple providers\n * with automatic detection and fallback capabilities.\n */\n\n// Export main functions\nexport { embed, autoEmbed, getSupportedProviders, createProvider } from './main.js';\n\n// Export types\nexport type { \n EmbedConfig, \n EmbedInput, \n EmbedResult, \n BatchEmbedResult, \n ProviderType \n} from './src/types/index.js';\n\n// Export provider factory for advanced usage\nexport { EmbeddingFactory } from './src/factory/EmbeddingFactory.js';\n\n// Export base provider for custom implementations\nexport { EmbeddingProvider } from './src/providers/base/EmbeddingProvider.js';\n\n// Version information\nexport const VERSION = '1.0.0';\n\n/**\n * Get library version\n */\nexport function getVersion(): string {\n return VERSION;\n}\n\n/**\n * Library information\n */\nexport const LIB_INFO = {\n name: 'embedbox',\n version: VERSION,\n description: 'A minimal and powerful embedding library',\n homepage: 'https://embedbox.dev',\n repository: 'https://github.com/embedbox/embedbox.git',\n supportedProviders: [\n 'openai',\n 'gemini', \n 'mistral',\n 'llamacpp'\n ] as const\n} as const;\n","import * as dotenv from 'dotenv';\nimport { EmbeddingFactory } from '@src/factory/EmbeddingFactory.js';\nimport type { EmbedConfig, EmbedInput, EmbedResult, BatchEmbedResult } from '@src/types/index.js';\nimport { Logger } from '@src/util/logger.js';\n\n// Load environment variables\ndotenv.config();\n\nconst logger = Logger.createModuleLogger('main');\n\n/**\n * Main embedding interface - Simple and minimal API\n * \n * @param config - Provider configuration\n * @param input - Text or file to embed\n * @returns Promise<EmbedResult | BatchEmbedResult>\n */\nexport async function embed(\n config: EmbedConfig,\n input: EmbedInput | EmbedInput[]\n): Promise<EmbedResult | BatchEmbedResult> {\n try {\n logger.info(`Starting embedding with provider: ${config.provider}`);\n \n // Create provider instance\n const provider = EmbeddingFactory.create(config);\n \n // Check if provider is ready\n const isReady = await provider.isReady();\n if (!isReady) {\n throw new Error(`Provider ${config.provider} is not ready`);\n }\n \n // Handle single input or batch\n if (Array.isArray(input)) {\n logger.debug(`Processing batch of ${input.length} items`);\n return await provider.embedBatch(input);\n } else {\n logger.debug(`Processing single item`);\n return await provider.embed(input);\n }\n \n } catch (error: unknown) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n logger.error(`Embedding failed: ${errorMessage}`);\n throw error;\n }\n}\n\n/**\n * Convenience function for quick embedding with auto-detection\n * \n * @param input - Text or file to embed\n * @returns Promise<EmbedResult | BatchEmbedResult>\n */\nexport async function autoEmbed(\n input: EmbedInput | EmbedInput[]\n): Promise<EmbedResult | BatchEmbedResult> {\n logger.info('Auto-detecting best provider...');\n \n // Try providers in order of preference\n const providers = [\n { provider: 'llamacpp' as const, model: 'nomic-embed-text-v1.5.Q4_K_M.gguf' }, // Local & free (llama.cpp)\n { provider: 'openai' as const, model: 'text-embedding-3-small', apiKey: process.env.OPENAI_API_KEY || undefined },\n { provider: 'gemini' as const, model: 'gemini-embedding-001', apiKey: process.env.GOOGLE_GENERATIVE_AI_API_KEY || undefined },\n { provider: 'mistral' as const, model: 'mistral-embed', apiKey: process.env.MISTRAL_API_KEY || undefined },\n ];\n \n for (const config of providers) {\n try {\n // Llama.cpp provider doesn't need API key and should be tried first\n if (config.provider === 'llamacpp' || config.apiKey) {\n logger.info(`Trying provider: ${config.provider}`);\n // Create a clean config object without undefined properties\n const cleanConfig: EmbedConfig = {\n provider: config.provider,\n model: config.model,\n };\n \n if (config.apiKey) {\n cleanConfig.apiKey = config.apiKey;\n }\n \n return await embed(cleanConfig, input);\n }\n } catch (error: unknown) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n logger.warn(`Provider ${config.provider} failed: ${errorMessage}`);\n continue;\n }\n }\n \n throw new Error('No available embedding provider found');\n}\n\n/**\n * Get supported providers\n */\nexport function getSupportedProviders() {\n return EmbeddingFactory.getSupportedProviders();\n}\n\n/**\n * Create a specific provider instance\n */\nexport function createProvider(config: EmbedConfig) {\n return EmbeddingFactory.create(config);\n}\n\n// Export types for external use\nexport type { EmbedConfig, EmbedInput, EmbedResult, BatchEmbedResult, ProviderType } from './src/types/index.js';","import OpenAI from 'openai';\nimport { EmbeddingProvider } from '@providers/base/EmbeddingProvider';\nimport type { EmbedConfig, EmbedInput, EmbedResult, BatchEmbedResult } from '@src/types/index';\nimport { Logger } from '@src/util/logger';\n\nconst logger = Logger.createModuleLogger('openai');\n\nexport class OpenAIProvider extends EmbeddingProvider {\n private client: OpenAI;\n\n constructor(config: EmbedConfig) {\n super(config);\n \n if (!config.apiKey) {\n throw new Error('OpenAI API key is required');\n }\n\n this.client = new OpenAI({\n apiKey: config.apiKey,\n baseURL: config.baseUrl,\n timeout: config.timeout || 30000,\n });\n\n logger.info('OpenAI provider initialized');\n }\n\n async embed(input: EmbedInput): Promise<EmbedResult> {\n try {\n const text = await this.readInput(input);\n logger.debug(`Embedding text with model: ${this.getModel()}`);\n\n const response = await this.client.embeddings.create({\n model: this.getModel(),\n input: text,\n });\n\n const embedding = response.data[0];\n if (!embedding) {\n throw new Error('No embedding returned from OpenAI API');\n }\n\n return {\n embedding: embedding.embedding || [],\n dimensions: embedding.embedding?.length || 0,\n model: response.model,\n provider: 'openai',\n usage: response.usage ? {\n promptTokens: response.usage.prompt_tokens,\n totalTokens: response.usage.total_tokens,\n } : undefined,\n };\n } catch (error: unknown) {\n logger.error(`OpenAI embedding failed: ${(error instanceof Error ? error.message : String(error))}`);\n throw error;\n }\n }\n\n async embedBatch(inputs: EmbedInput[]): Promise<BatchEmbedResult> {\n try {\n const texts = await Promise.all(inputs.map(input => this.readInput(input)));\n logger.debug(`Batch embedding ${texts.length} texts with model: ${this.getModel()}`);\n\n const response = await this.client.embeddings.create({\n model: this.getModel(),\n input: texts,\n });\n\n const embeddings = response.data.map(item => item.embedding);\n\n return {\n embeddings,\n dimensions: embeddings[0]?.length || 0,\n model: response.model,\n provider: 'openai',\n usage: response.usage ? {\n promptTokens: response.usage.prompt_tokens,\n totalTokens: response.usage.total_tokens,\n } : undefined,\n };\n } catch (error: unknown) {\n logger.error(`OpenAI batch embedding failed: ${(error instanceof Error ? error.message : String(error))}`);\n throw error;\n }\n }\n\n getDimensions(): number {\n // Common OpenAI embedding dimensions\n const model = this.getModel();\n if (model.includes('text-embedding-3-large')) return 3072;\n if (model.includes('text-embedding-3-small')) return 1536;\n if (model.includes('text-embedding-ada-002')) return 1536;\n return 1536; // default\n }\n\n getProviderName(): string {\n return 'OpenAI';\n }\n\n async isReady(): Promise<boolean> {\n try {\n await this.client.models.list();\n return true;\n } catch (error: unknown) {\n logger.error(`OpenAI readiness check failed: ${(error instanceof Error ? error.message : String(error))}`);\n return false;\n }\n }\n}\n","import type { EmbedConfig, EmbedInput, EmbedResult, BatchEmbedResult } from '@src/types/index';\n\nexport abstract class EmbeddingProvider {\n protected config: EmbedConfig;\n\n constructor(config: EmbedConfig) {\n this.config = config;\n }\n\n abstract embed(input: EmbedInput): Promise<EmbedResult>;\n abstract embedBatch(inputs: EmbedInput[]): Promise<BatchEmbedResult>;\n abstract getDimensions(): number;\n abstract getProviderName(): string;\n abstract isReady(): Promise<boolean>;\n\n protected getModel(): string {\n return this.config.model || 'default';\n }\n\n protected async readInput(input: EmbedInput): Promise<string> {\n if (input.text) {\n return input.text;\n }\n \n if (input.filePath) {\n const fs = await import('fs/promises');\n return await fs.readFile(input.filePath, 'utf-8');\n }\n \n throw new Error('Either text or filePath must be provided');\n }\n}\n","export enum LogLevel {\n DEBUG = 0,\n INFO = 1,\n WARN = 2,\n ERROR = 3,\n}\n\nexport interface LogEntry {\n level: LogLevel;\n message: string;\n module: string;\n timestamp: Date;\n}\n\nexport class Logger {\n private static instance: Logger;\n private currentLevel: LogLevel;\n private moduleName: string;\n\n // ANSI color codes - simplified for better readability\n private static readonly COLORS = {\n RESET: '\\x1b[0m',\n DEBUG: '\\x1b[36m', // Cyan\n INFO: '\\x1b[32m', // Green \n WARN: '\\x1b[33m', // Yellow\n ERROR: '\\x1b[31m', // Red\n };\n\n private static readonly LEVEL_NAMES = {\n [LogLevel.DEBUG]: 'DEBUG',\n [LogLevel.INFO]: 'INFO',\n [LogLevel.WARN]: 'WARN',\n [LogLevel.ERROR]: 'ERROR',\n };\n\n constructor(moduleName: string = 'embedbox', level: LogLevel = LogLevel.INFO) {\n this.moduleName = moduleName;\n this.currentLevel = level;\n }\n\n static getInstance(moduleName?: string, level?: LogLevel): Logger {\n if (!Logger.instance) {\n Logger.instance = new Logger(moduleName || 'embedbox', level);\n }\n return Logger.instance;\n }\n\n setLevel(level: LogLevel): void {\n this.currentLevel = level;\n }\n\n getLevel(): LogLevel {\n return this.currentLevel;\n }\n\n private formatMessage(level: LogLevel, message: string): string {\n const levelName = Logger.LEVEL_NAMES[level];\n const color = Logger.COLORS[levelName as keyof typeof Logger.COLORS];\n const reset = Logger.COLORS.RESET;\n\n return `${color}[${levelName}(${this.moduleName})]${reset} ${message}\\n\\n`;\n }\n\n private log(level: LogLevel, message: string): void {\n if (level < this.currentLevel) {\n return;\n }\n\n const formattedMessage = this.formatMessage(level, message);\n process.stdout.write(formattedMessage);\n }\n\n debug(message: string): void {\n this.log(LogLevel.DEBUG, message);\n }\n\n info(message: string): void {\n this.log(LogLevel.INFO, message);\n }\n\n warn(message: string): void {\n this.log(LogLevel.WARN, message);\n }\n\n error(message: string): void {\n this.log(LogLevel.ERROR, message);\n }\n\n // Static methods for quick access\n static debug(message: string, moduleName?: string): void {\n const logger = new Logger(moduleName || 'embedbox');\n logger.debug(message);\n }\n\n static info(message: string, moduleName?: string): void {\n const logger = new Logger(moduleName || 'embedbox');\n logger.info(message);\n }\n\n static warn(message: string, moduleName?: string): void {\n const logger = new Logger(moduleName || 'embedbox');\n logger.warn(message);\n }\n\n static error(message: string, moduleName?: string): void {\n const logger = new Logger(moduleName || 'embedbox');\n logger.error(message);\n }\n\n // Method to create a logger instance for a specific module\n static createModuleLogger(moduleName: string, level?: LogLevel): Logger {\n return new Logger(`embedbox:${moduleName}`, level);\n }\n}\n\n// Export a default logger instance\nexport const logger = Logger.getInstance();\n\n// Export convenience functions\nexport const log = {\n debug: (message: string, moduleName?: string) => Logger.debug(message, moduleName),\n info: (message: string, moduleName?: string) => Logger.info(message, moduleName),\n warn: (message: string, moduleName?: string) => Logger.warn(message, moduleName),\n error: (message: string, moduleName?: string) => Logger.error(message, moduleName),\n};\n","import { GoogleGenerativeAI } from '@google/generative-ai';\nimport { EmbeddingProvider } from '@providers/base/EmbeddingProvider';\nimport type { EmbedConfig, EmbedInput, EmbedResult, BatchEmbedResult } from '@src/types/index';\nimport { Logger } from '@src/util/logger';\n\nconst logger = Logger.createModuleLogger('gemini');\n\nexport class GeminiProvider extends EmbeddingProvider {\n private client: GoogleGenerativeAI;\n\n constructor(config: EmbedConfig) {\n super(config);\n \n if (!config.apiKey) {\n throw new Error('Google API key is required');\n }\n\n this.client = new GoogleGenerativeAI(config.apiKey);\n logger.info('Gemini provider initialized');\n }\n\n async embed(input: EmbedInput): Promise<EmbedResult> {\n try {\n const text = await this.readInput(input);\n logger.debug(`Embedding text with model: ${this.getModel()}`);\n\n // Get the embedding model\n const model = this.client.getGenerativeModel({ \n model: this.getModel() \n });\n\n // Use the embedding task\n const result = await model.embedContent(text);\n const embedding = result.embedding;\n\n return {\n embedding: embedding.values,\n dimensions: embedding.values.length,\n model: this.getModel(),\n provider: 'gemini',\n };\n } catch (error: unknown) {\n logger.error(`Gemini embedding failed: ${(error instanceof Error ? error.message : String(error))}`);\n throw error;\n }\n }\n\n async embedBatch(inputs: EmbedInput[]): Promise<BatchEmbedResult> {\n try {\n const texts = await Promise.all(inputs.map(input => this.readInput(input)));\n logger.debug(`Batch embedding ${texts.length} texts with model: ${this.getModel()}`);\n\n const model = this.client.getGenerativeModel({ \n model: this.getModel() \n });\n\n const results = await Promise.all(\n texts.map(text => model.embedContent(text))\n );\n\n const embeddings = results.map((result: { embedding: { values: number[] } }) => result.embedding.values);\n\n return {\n embeddings,\n dimensions: embeddings[0]?.length || 0,\n model: this.getModel(),\n provider: 'gemini',\n };\n } catch (error: unknown) {\n logger.error(`Gemini batch embedding failed: ${(error instanceof Error ? error.message : String(error))}`);\n throw error;\n }\n }\n\n getDimensions(): number {\n const model = this.getModel();\n if (model.includes('gemini-embedding-001')) return 3072;\n if (model.includes('text-embedding-004')) return 768;\n if (model.includes('embedding-001')) return 768;\n if (model.includes('multimodalembedding')) return 768;\n return 3072; // default for Gemini embeddings\n }\n\n getProviderName(): string {\n return 'Google Gemini';\n }\n\n protected getModel(): string {\n return this.config.model || 'gemini-embedding-001';\n }\n\n async isReady(): Promise<boolean> {\n try {\n const model = this.client.getGenerativeModel({ \n model: this.getModel() \n });\n // Test with a simple embedding\n await model.embedContent('test');\n return true;\n } catch (error: unknown) {\n logger.error(`Gemini readiness check failed: ${(error instanceof Error ? error.message : String(error))}`);\n return false;\n }\n }\n}\n","import { Mistral } from '@mistralai/mistralai';\nimport { EmbeddingProvider } from '@providers/base/EmbeddingProvider';\nimport type { EmbedConfig, EmbedInput, EmbedResult, BatchEmbedResult } from '@src/types/index';\nimport { Logger } from '@src/util/logger';\n\nconst logger = Logger.createModuleLogger('mistral');\n\nexport class MistralProvider extends EmbeddingProvider {\n private client: Mistral;\n\n constructor(config: EmbedConfig) {\n super(config);\n \n if (!config.apiKey) {\n throw new Error('Mistral API key is required');\n }\n\n this.client = new Mistral({\n apiKey: config.apiKey,\n serverURL: config.baseUrl,\n timeoutMs: config.timeout || 30000,\n });\n\n logger.info('Mistral provider initialized');\n }\n\n async embed(input: EmbedInput): Promise<EmbedResult> {\n try {\n const text = await this.readInput(input);\n logger.debug(`Embedding text with model: ${this.getModel()}`);\n\n const response = await this.client.embeddings.create({\n model: this.getModel(),\n inputs: [text],\n });\n\n const embedding = response.data[0];\n if (!embedding) {\n throw new Error('No embedding returned from Mistral API');\n }\n\n return {\n embedding: embedding.embedding || [],\n dimensions: embedding.embedding?.length || 0,\n model: response.model,\n provider: 'mistral',\n usage: response.usage?.promptTokens && response.usage?.totalTokens ? {\n promptTokens: response.usage.promptTokens,\n totalTokens: response.usage.totalTokens,\n } : undefined,\n };\n } catch (error: unknown) {\n logger.error(`Mistral embedding failed: ${(error instanceof Error ? error.message : String(error))}`);\n throw error;\n }\n }\n\n async embedBatch(inputs: EmbedInput[]): Promise<BatchEmbedResult> {\n try {\n const texts = await Promise.all(inputs.map(input => this.readInput(input)));\n logger.debug(`Batch embedding ${texts.length} texts with model: ${this.getModel()}`);\n\n const response = await this.client.embeddings.create({\n model: this.getModel(),\n inputs: texts,\n });\n\n const embeddings = response.data.map((item) => {\n if (!item.embedding) throw new Error('No embedding returned from Mistral API');\n return item.embedding as number[];\n });\n\n return {\n embeddings,\n dimensions: embeddings[0]?.length || 0,\n model: response.model,\n provider: 'mistral',\n usage: response.usage?.promptTokens && response.usage?.totalTokens ? {\n promptTokens: response.usage.promptTokens,\n totalTokens: response.usage.totalTokens,\n } : undefined,\n };\n } catch (error: unknown) {\n logger.error(`Mistral batch embedding failed: ${(error instanceof Error ? error.message : String(error))}`);\n throw error;\n }\n }\n\n getDimensions(): number {\n // Mistral embedding dimensions\n const model = this.getModel();\n if (model.includes('mistral-embed')) return 1024;\n return 1024; // default for Mistral\n }\n\n getProviderName(): string {\n return 'Mistral AI';\n }\n\n async isReady(): Promise<boolean> {\n try {\n // Test with a simple embedding request\n const response = await this.client.embeddings.create({\n model: this.getModel(),\n inputs: ['test'],\n });\n return response.data.length > 0;\n } catch (error: unknown) {\n logger.error(`Mistral readiness check failed: ${(error instanceof Error ? error.message : String(error))}`);\n return false;\n }\n }\n}\n","import { access, constants } from 'fs/promises';\nimport { join, resolve } from 'path';\nimport { EmbeddingProvider } from '@providers/base/EmbeddingProvider';\nimport type { EmbedConfig, EmbedInput, EmbedResult, BatchEmbedResult } from '@src/types/index';\nimport { logger } from '@src/util/logger';\nimport * as http from 'http';\n\n/**\n * Llama.cpp Provider - Local embeddings using llama.cpp directly\n * Uses native N-API module for better performance\n */\n\n// Try to import native module\nlet nativeModule: any = null;\ntry {\n nativeModule = require('../../native');\n logger.info('Using native Llama.cpp module');\n} catch (error) {\n logger.warn('Native module not available, falling back to HTTP');\n}\n\n// Extend EmbedConfig to include llamaPath\ninterface LlamaCppConfig extends EmbedConfig {\n llamaPath?: string;\n}\n\nexport class LlamaCppProvider extends EmbeddingProvider {\n private llamaPath: string;\n private modelPath: string;\n private useNative: boolean;\n private nativeModel: any = null;\n\n constructor(config: LlamaCppConfig) {\n super({ ...config, provider: 'llamacpp' });\n this.modelPath = config.model || 'nomic-embed-text-v1.5.Q4_K_M.gguf';\n this.llamaPath = config.llamaPath || './llama.cpp/build/bin/llama-embedding';\n this.useNative = !!nativeModule;\n \n if (this.useNative) {\n try {\n this.nativeModel = nativeModule.create(this.modelPath);\n logger.info(`Llama.cpp provider initialized with native module: ${this.modelPath}`);\n } catch (error) {\n logger.error(`Failed to initialize native module: ${error}`);\n this.useNative = false;\n }\n } else {\n logger.info(`Llama.cpp provider initialized with HTTP fallback: ${this.modelPath}`);\n }\n }\n\n // Public API methods\n getProviderName(): string {\n return 'Llama.cpp';\n }\n\n getDimensions(): number {\n // Known dimensions for common models\n const model = this.getModel();\n if (model.includes('nomic-embed-text-v1.5')) return 768;\n if (model.includes('nomic-embed-text-v1')) return 768;\n if (model.includes('all-MiniLM-L6-v2')) return 384;\n if (model.includes('bge-base')) return 768;\n if (model.includes('bert-base')) return 768;\n return 768; // default\n }\n\n async isReady(): Promise<boolean> {\n try {\n if (this.useNative && this.nativeModel) {\n // Native module is ready if model was loaded successfully\n return true;\n }\n \n // Fallback to HTTP check\n await access(this.llamaPath, constants.F_OK);\n await access(this.llamaPath, constants.X_OK);\n \n // Check if model file exists\n const modelPath = await this.getModelPath();\n await access(modelPath, constants.F_OK);\n \n logger.debug('Llama.cpp provider is ready');\n return true;\n } catch (error: unknown) {\n logger.error(`Llama.cpp readiness check failed: ${(error instanceof Error ? error.message : String(error))}`);\n return false;\n }\n }\n\n private async loadGGUFModel(modelPath: string): Promise<Buffer> {\n try {\n logger.debug(`Loading GGUF model from: ${modelPath}`);\n \n // Read model file\n const modelBuffer = await fs.readFile(modelPath);\n \n if (!modelBuffer) {\n throw new Error(`Failed to read model file: ${modelPath}`);\n }\n \n logger.debug(`Model file loaded, size: ${modelBuffer.length} bytes`);\n return modelBuffer;\n } catch (error) {\n logger.error(`Failed to load GGUF model: ${error instanceof Error ? error.message : String(error)}`);\n throw error;\n }\n }\n\n private generateEmbedding(modelBuffer: Buffer, text: string): number[] {\n // Use the loaded model to generate embedding\n logger.debug(`Generating embedding with model buffer (${modelBuffer.length} bytes)`);\n \n // TODO: Implement actual Llama.cpp embedding generation\n // For now, return mock embedding based on text length\n const embedding = [];\n for (let i = 0; i < Math.min(text.length, 768); i++) {\n embedding.push(Math.sin(i * 0.1) * (i % 10));\n }\n \n return embedding;\n }\n\n async embed(input: EmbedInput): Promise<EmbedResult> {\n try {\n logger.debug(`Embedding text with llama.cpp: ${this.getModel()}`);\n \n const text = await this.readInput(input);\n if (!text.trim()) {\n throw new Error('Text input cannot be empty');\n }\n\n // Use native module for now\n if (this.useNative && this.nativeModel) {\n const embedding = this.nativeModel.embed(text);\n \n return {\n embedding,\n dimensions: embedding.length,\n model: this.getModel(),\n provider: 'llamacpp',\n };\n }\n\n // TODO: Implement direct Llama.cpp core usage in future\n throw new Error('Direct Llama.cpp core integration not yet implemented. Please use HTTP fallback or wait for next version.');\n } catch (error: unknown) {\n logger.error(`Llama.cpp embedding failed: ${(error instanceof Error ? error.message : String(error))}`);\n throw error;\n }\n }\n\n async embedBatch(inputs: EmbedInput[]): Promise<BatchEmbedResult> {\n try {\n logger.debug(`Batch embedding ${inputs.length} texts with llama.cpp`);\n \n if (this.useNative && this.nativeModel) {\n // Use native module for batch\n const embeddings: number[][] = [];\n \n for (const input of inputs) {\n const text = await this.readInput(input);\n if (text.trim()) {\n const embedding = this.nativeModel.embed(text);\n embeddings.push(embedding);\n }\n }\n \n if (embeddings.length === 0) {\n throw new Error('No valid texts to embed');\n }\n \n return {\n embeddings,\n dimensions: embeddings[0]?.length || 0,\n model: this.getModel(),\n provider: 'llamacpp',\n };\n }\n\n // Fallback to HTTP batch processing\n const texts = [];\n for (const input of inputs) {\n const text = await this.readInput(input);\n if (text.trim()) {\n texts.push(text);\n }\n }\n \n if (texts.length === 0) {\n throw new Error('No valid texts to embed');\n }\n\n // For batch processing, use HTTP API\n const modelPath = await this.getModelPath();\n const requests = inputs.map((input, v) => ({\n input: input.text || '',\n model: modelPath,\n pooling: 'mean',\n normalize: 2\n }));\n\n // Execute batch requests (for now, do individual requests)\n const embeddings: number[][] = [];\n for (const request of requests) {\n const result = await this.executeLlamaEmbedding([JSON.stringify(request)]);\n const embedding = this.parseRawOutput(result.stdout);\n embeddings.push(embedding);\n }\n \n return {\n embeddings,\n dimensions: embeddings[0]?.length || 0,\n model: this.getModel(),\n provider: 'llamacpp',\n };\n } catch (error: unknown) {\n logger.error(`Llama.cpp batch embedding failed: ${(error instanceof Error ? error.message : String(error))}`);\n throw error;\n }\n }\n\n // Cleanup method\n async cleanup(): Promise<void> {\n if (this.useNative && this.nativeModel) {\n try {\n this.nativeModel.close();\n this.nativeModel = null;\n logger.info('Native Llama.cpp model closed');\n } catch (error) {\n logger.error(`Error closing native model: ${error}`);\n }\n }\n }\n\n // Protected methods\n protected getModel(): string {\n return this.modelPath;\n }\n}\n","import type { EmbedConfig, ProviderType } from '@src/types/index';\nimport { EmbeddingProvider } from '@providers/base/EmbeddingProvider';\nimport { OpenAIProvider } from '@providers/openai';\nimport { GeminiProvider } from '@providers/gemini';\nimport { MistralProvider } from '@providers/mistral';\nimport { LlamaCppProvider } from '@providers/llamacpp';\nimport { Logger } from '@src/util/logger';\n\nconst logger = Logger.createModuleLogger('factory');\n\nexport class EmbeddingFactory {\n private static providers = new Map<ProviderType, new (config: EmbedConfig) => EmbeddingProvider>([\n ['openai', OpenAIProvider],\n ['gemini', GeminiProvider],\n ['mistral', MistralProvider],\n ['llamacpp', LlamaCppProvider], // Local embeddings with llama.cpp\n ]);\n\n static create(config: EmbedConfig) {\n logger.info(`Creating provider: ${config.provider}`);\n \n const ProviderClass = this.providers.get(config.provider);\n if (!ProviderClass) {\n throw new Error(`Unsupported provider: ${config.provider}`);\n }\n\n return new ProviderClass(config);\n }\n\n static getSupportedProviders(): ProviderType[] {\n return Array.from(this.providers.keys());\n }\n}\n"],"mappings":"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","names":["exports","module","exports","module","config","fs","logger","logger","config","OpenAI","logger","config","logger","config","config","embeddings","logger","config","logger","config"]}