agentic-flow 2.1.0 → 2.1.1

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.
Files changed (39) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/core/embedding-service.js +1 -1
  3. package/dist/core/embedding-service.js.map +1 -1
  4. package/dist/embeddings/optimized-embedder.js +1 -1
  5. package/dist/embeddings/optimized-embedder.js.map +1 -1
  6. package/dist/harness/flywheel-governance.d.ts +85 -0
  7. package/dist/harness/flywheel-governance.d.ts.map +1 -0
  8. package/dist/harness/flywheel-governance.js +123 -0
  9. package/dist/harness/flywheel-governance.js.map +1 -0
  10. package/dist/harness/metaharness.d.ts +6 -0
  11. package/dist/harness/metaharness.d.ts.map +1 -0
  12. package/dist/harness/metaharness.js +6 -0
  13. package/dist/harness/metaharness.js.map +1 -0
  14. package/dist/mcp/mcp-policy.d.ts +15 -0
  15. package/dist/mcp/mcp-policy.d.ts.map +1 -0
  16. package/dist/mcp/mcp-policy.js +36 -0
  17. package/dist/mcp/mcp-policy.js.map +1 -0
  18. package/dist/mcp/standalone-stdio.js +7 -0
  19. package/dist/mcp/standalone-stdio.js.map +1 -1
  20. package/dist/mcp/tools/harness-tools.d.ts +1 -0
  21. package/dist/mcp/tools/harness-tools.d.ts.map +1 -1
  22. package/dist/mcp/tools/harness-tools.js +13 -1
  23. package/dist/mcp/tools/harness-tools.js.map +1 -1
  24. package/dist/reasoningbank/utils/embeddings.js +2 -2
  25. package/dist/reasoningbank/utils/embeddings.js.map +1 -1
  26. package/dist/repair/darwin-repair.d.ts +13 -1
  27. package/dist/repair/darwin-repair.d.ts.map +1 -1
  28. package/dist/repair/darwin-repair.js +2 -2
  29. package/dist/repair/darwin-repair.js.map +1 -1
  30. package/dist/router/providers/onnx.js +2 -2
  31. package/dist/router/providers/onnx.js.map +1 -1
  32. package/dist/services/embedding-service.js +1 -1
  33. package/dist/services/embedding-service.js.map +1 -1
  34. package/dist/utils/model-cache.js +1 -1
  35. package/dist/utils/model-cache.js.map +1 -1
  36. package/package.json +12 -10
  37. package/wasm/reasoningbank/reasoningbank_wasm_bg.js +31 -31
  38. package/wasm/reasoningbank/reasoningbank_wasm_bg.wasm +0 -0
  39. package/wasm/reasoningbank/reasoningbank_wasm_bg.wasm.d.ts +2 -2
@@ -161,7 +161,7 @@ export class TransformersEmbeddingService extends EmbeddingService {
161
161
  return;
162
162
  try {
163
163
  // Dynamically import transformers.js
164
- const { pipeline } = await import('@xenova/transformers');
164
+ const { pipeline } = await import('@huggingface/transformers');
165
165
  this.pipeline = await pipeline('feature-extraction', this.modelName);
166
166
  this.emit('initialized', { model: this.modelName });
167
167
  }
@@ -1 +1 @@
1
- {"version":3,"file":"embedding-service.js","sourceRoot":"","sources":["../../src/core/embedding-service.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Production Embedding Service\n *\n * Replaces mock embeddings with real implementations:\n * 1. OpenAI Embeddings API (text-embedding-3-small/large)\n * 2. Local Transformers.js (runs in Node.js/browser)\n * 3. Custom ONNX models\n * 4. Fallback hash-based embeddings (for development)\n */\n\nimport { EventEmitter } from 'events';\n\nexport interface EmbeddingConfig {\n provider: 'openai' | 'transformers' | 'onnx' | 'mock';\n model?: string;\n dimensions?: number;\n apiKey?: string;\n cacheSize?: number;\n}\n\nexport interface EmbeddingResult {\n embedding: number[];\n usage?: {\n promptTokens: number;\n totalTokens: number;\n };\n latency: number;\n}\n\n/**\n * Base embedding service interface\n */\nexport abstract class EmbeddingService extends EventEmitter {\n protected config: EmbeddingConfig;\n protected cache: Map<string, number[]> = new Map();\n\n constructor(config: EmbeddingConfig) {\n super();\n this.config = {\n cacheSize: 1000,\n ...config\n };\n }\n\n abstract embed(text: string): Promise<EmbeddingResult>;\n abstract embedBatch(texts: string[]): Promise<EmbeddingResult[]>;\n\n /**\n * Get cached embedding if available\n */\n protected getCached(text: string): number[] | null {\n return this.cache.get(text) || null;\n }\n\n /**\n * Cache embedding with LRU eviction\n */\n protected setCached(text: string, embedding: number[]): void {\n const cacheSize = this.config.cacheSize ?? 1000;\n if (this.cache.size >= cacheSize) {\n // Remove oldest entry (first in map)\n const firstKey = this.cache.keys().next().value as string | undefined;\n if (firstKey) {\n this.cache.delete(firstKey);\n }\n }\n this.cache.set(text, embedding);\n }\n\n /**\n * Clear cache\n */\n clearCache(): void {\n this.cache.clear();\n }\n}\n\n/**\n * OpenAI Embeddings Service\n *\n * Uses OpenAI's text-embedding-3-small (1536D) or text-embedding-3-large (3072D)\n * https://platform.openai.com/docs/guides/embeddings\n */\nexport class OpenAIEmbeddingService extends EmbeddingService {\n private apiKey: string;\n private model: string;\n private baseURL = 'https://api.openai.com/v1/embeddings';\n\n constructor(config: Omit<EmbeddingConfig, 'provider'> & { apiKey: string }) {\n super({ ...config, provider: 'openai' });\n this.apiKey = config.apiKey;\n this.model = config.model || 'text-embedding-3-small';\n }\n\n async embed(text: string): Promise<EmbeddingResult> {\n // Check cache\n const cached = this.getCached(text);\n if (cached) {\n return {\n embedding: cached,\n latency: 0\n };\n }\n\n const start = Date.now();\n\n try {\n const response = await fetch(this.baseURL, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.apiKey}`\n },\n body: JSON.stringify({\n model: this.model,\n input: text,\n dimensions: this.config.dimensions || undefined\n })\n });\n\n if (!response.ok) {\n throw new Error(`OpenAI API error: ${response.statusText}`);\n }\n\n const data: any = await response.json();\n const embedding: number[] = data.data[0].embedding;\n\n // Cache it\n this.setCached(text, embedding);\n\n const latency = Date.now() - start;\n\n this.emit('embed', { text, latency });\n\n return {\n embedding,\n usage: data.usage,\n latency\n };\n } catch (error: any) {\n throw new Error(`OpenAI embedding failed: ${error.message}`);\n }\n }\n\n async embedBatch(texts: string[]): Promise<EmbeddingResult[]> {\n const start = Date.now();\n\n try {\n const response = await fetch(this.baseURL, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.apiKey}`\n },\n body: JSON.stringify({\n model: this.model,\n input: texts,\n dimensions: this.config.dimensions || undefined\n })\n });\n\n if (!response.ok) {\n throw new Error(`OpenAI API error: ${response.statusText}`);\n }\n\n const data: any = await response.json();\n const latency = Date.now() - start;\n\n return data.data.map((item: any, index: number) => {\n const embedding: number[] = item.embedding;\n this.setCached(texts[index], embedding);\n\n return {\n embedding,\n usage: {\n promptTokens: Math.floor(data.usage.prompt_tokens / texts.length),\n totalTokens: Math.floor(data.usage.total_tokens / texts.length)\n },\n latency: Math.floor(latency / texts.length)\n };\n });\n } catch (error: any) {\n throw new Error(`OpenAI batch embedding failed: ${error.message}`);\n }\n }\n}\n\n/**\n * Transformers.js Local Embedding Service\n *\n * Runs locally without API calls using ONNX runtime\n * https://huggingface.co/docs/transformers.js\n */\nexport class TransformersEmbeddingService extends EmbeddingService {\n private pipeline: any = null;\n private modelName: string;\n\n constructor(config: Omit<EmbeddingConfig, 'provider'>) {\n super({ ...config, provider: 'transformers' });\n this.modelName = config.model || 'Xenova/all-MiniLM-L6-v2';\n }\n\n async initialize(): Promise<void> {\n if (this.pipeline) return;\n\n try {\n // Dynamically import transformers.js\n const { pipeline } = await import('@xenova/transformers');\n\n this.pipeline = await pipeline('feature-extraction', this.modelName);\n this.emit('initialized', { model: this.modelName });\n } catch (error: any) {\n throw new Error(`Failed to initialize transformers.js: ${error.message}`);\n }\n }\n\n async embed(text: string): Promise<EmbeddingResult> {\n await this.initialize();\n\n // Check cache\n const cached = this.getCached(text);\n if (cached) {\n return {\n embedding: cached,\n latency: 0\n };\n }\n\n const start = Date.now();\n\n try {\n const output = await this.pipeline(text, { pooling: 'mean', normalize: true });\n\n // Convert to regular array\n const embedding = Array.from(output.data) as number[];\n\n // Cache it\n this.setCached(text, embedding);\n\n const latency = Date.now() - start;\n\n this.emit('embed', { text, latency });\n\n return {\n embedding,\n latency\n };\n } catch (error: any) {\n throw new Error(`Transformers.js embedding failed: ${error.message}`);\n }\n }\n\n async embedBatch(texts: string[]): Promise<EmbeddingResult[]> {\n await this.initialize();\n\n const start = Date.now();\n\n try {\n const results: EmbeddingResult[] = [];\n\n for (const text of texts) {\n const cached = this.getCached(text);\n\n if (cached) {\n results.push({\n embedding: cached,\n latency: 0\n });\n } else {\n const output = await this.pipeline(text, {\n pooling: 'mean',\n normalize: true\n });\n const embedding = Array.from(output.data) as number[];\n\n this.setCached(text, embedding);\n\n results.push({\n embedding,\n latency: Math.floor((Date.now() - start) / texts.length)\n });\n }\n }\n\n return results;\n } catch (error: any) {\n throw new Error(`Transformers.js batch embedding failed: ${error.message}`);\n }\n }\n}\n\n/**\n * Mock Embedding Service (for development/testing)\n *\n * Generates deterministic hash-based embeddings\n * Fast but not semantically meaningful\n */\nexport class MockEmbeddingService extends EmbeddingService {\n constructor(config?: Partial<EmbeddingConfig>) {\n super({\n provider: 'mock',\n dimensions: 384,\n ...config\n });\n }\n\n async embed(text: string): Promise<EmbeddingResult> {\n // Check cache\n const cached = this.getCached(text);\n if (cached) {\n return {\n embedding: cached,\n latency: 0\n };\n }\n\n const start = Date.now();\n\n // Generate hash-based embedding\n const embedding = this.hashEmbedding(text);\n\n // Cache it\n this.setCached(text, embedding);\n\n const latency = Date.now() - start;\n\n return {\n embedding,\n latency\n };\n }\n\n async embedBatch(texts: string[]): Promise<EmbeddingResult[]> {\n return Promise.all(texts.map(text => this.embed(text)));\n }\n\n private hashEmbedding(text: string): number[] {\n const dimensions = this.config.dimensions || 384;\n const embedding = new Array(dimensions);\n\n // Seed with text hash\n let hash = 0;\n for (let i = 0; i < text.length; i++) {\n hash = (hash << 5) - hash + text.charCodeAt(i);\n hash = hash & hash;\n }\n\n // Generate pseudo-random embedding\n for (let i = 0; i < dimensions; i++) {\n const seed = hash + i * 2654435761;\n const x = Math.sin(seed) * 10000;\n embedding[i] = x - Math.floor(x);\n }\n\n // Normalize to unit vector\n const norm = Math.sqrt(embedding.reduce((sum, v) => sum + v * v, 0));\n return embedding.map(v => v / norm);\n }\n}\n\n/**\n * Factory function to create appropriate embedding service\n */\nexport function createEmbeddingService(config: EmbeddingConfig): EmbeddingService {\n switch (config.provider) {\n case 'openai':\n if (!config.apiKey) {\n throw new Error('OpenAI API key required');\n }\n return new OpenAIEmbeddingService(config as any);\n\n case 'transformers':\n return new TransformersEmbeddingService(config);\n\n case 'mock':\n return new MockEmbeddingService(config);\n\n default:\n console.warn(`Unknown provider: ${config.provider}, using mock`);\n return new MockEmbeddingService(config);\n }\n}\n\n/**\n * Convenience function for quick embeddings\n */\nexport async function getEmbedding(\n text: string,\n config?: Partial<EmbeddingConfig>\n): Promise<number[]> {\n const service = createEmbeddingService({\n provider: 'mock',\n ...config\n } as EmbeddingConfig);\n\n const result = await service.embed(text);\n return result.embedding;\n}\n\n/**\n * Benchmark different embedding providers\n */\nexport async function benchmarkEmbeddings(testText: string = 'Hello world'): Promise<{\n mock: { latency: number; dimensions: number };\n transformers?: { latency: number; dimensions: number; error?: string };\n openai?: { latency: number; dimensions: number; error?: string };\n}> {\n const results: any = {};\n\n // Test mock\n const mockService = new MockEmbeddingService({ dimensions: 384 });\n const mockResult = await mockService.embed(testText);\n results.mock = {\n latency: mockResult.latency,\n dimensions: mockResult.embedding.length\n };\n\n // Test transformers (if available)\n try {\n const transformersService = new TransformersEmbeddingService({\n model: 'Xenova/all-MiniLM-L6-v2'\n });\n const transformersResult = await transformersService.embed(testText);\n results.transformers = {\n latency: transformersResult.latency,\n dimensions: transformersResult.embedding.length\n };\n } catch (error: any) {\n results.transformers = {\n error: error.message\n };\n }\n\n // Test OpenAI (if API key available)\n const apiKey = process.env.OPENAI_API_KEY;\n if (apiKey) {\n try {\n const openaiService = new OpenAIEmbeddingService({\n apiKey,\n model: 'text-embedding-3-small'\n });\n const openaiResult = await openaiService.embed(testText);\n results.openai = {\n latency: openaiResult.latency,\n dimensions: openaiResult.embedding.length\n };\n } catch (error: any) {\n results.openai = {\n error: error.message\n };\n }\n }\n\n return results;\n}\n"]}
1
+ {"version":3,"file":"embedding-service.js","sourceRoot":"","sources":["../../src/core/embedding-service.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Production Embedding Service\n *\n * Replaces mock embeddings with real implementations:\n * 1. OpenAI Embeddings API (text-embedding-3-small/large)\n * 2. Local Transformers.js (runs in Node.js/browser)\n * 3. Custom ONNX models\n * 4. Fallback hash-based embeddings (for development)\n */\n\nimport { EventEmitter } from 'events';\n\nexport interface EmbeddingConfig {\n provider: 'openai' | 'transformers' | 'onnx' | 'mock';\n model?: string;\n dimensions?: number;\n apiKey?: string;\n cacheSize?: number;\n}\n\nexport interface EmbeddingResult {\n embedding: number[];\n usage?: {\n promptTokens: number;\n totalTokens: number;\n };\n latency: number;\n}\n\n/**\n * Base embedding service interface\n */\nexport abstract class EmbeddingService extends EventEmitter {\n protected config: EmbeddingConfig;\n protected cache: Map<string, number[]> = new Map();\n\n constructor(config: EmbeddingConfig) {\n super();\n this.config = {\n cacheSize: 1000,\n ...config\n };\n }\n\n abstract embed(text: string): Promise<EmbeddingResult>;\n abstract embedBatch(texts: string[]): Promise<EmbeddingResult[]>;\n\n /**\n * Get cached embedding if available\n */\n protected getCached(text: string): number[] | null {\n return this.cache.get(text) || null;\n }\n\n /**\n * Cache embedding with LRU eviction\n */\n protected setCached(text: string, embedding: number[]): void {\n const cacheSize = this.config.cacheSize ?? 1000;\n if (this.cache.size >= cacheSize) {\n // Remove oldest entry (first in map)\n const firstKey = this.cache.keys().next().value as string | undefined;\n if (firstKey) {\n this.cache.delete(firstKey);\n }\n }\n this.cache.set(text, embedding);\n }\n\n /**\n * Clear cache\n */\n clearCache(): void {\n this.cache.clear();\n }\n}\n\n/**\n * OpenAI Embeddings Service\n *\n * Uses OpenAI's text-embedding-3-small (1536D) or text-embedding-3-large (3072D)\n * https://platform.openai.com/docs/guides/embeddings\n */\nexport class OpenAIEmbeddingService extends EmbeddingService {\n private apiKey: string;\n private model: string;\n private baseURL = 'https://api.openai.com/v1/embeddings';\n\n constructor(config: Omit<EmbeddingConfig, 'provider'> & { apiKey: string }) {\n super({ ...config, provider: 'openai' });\n this.apiKey = config.apiKey;\n this.model = config.model || 'text-embedding-3-small';\n }\n\n async embed(text: string): Promise<EmbeddingResult> {\n // Check cache\n const cached = this.getCached(text);\n if (cached) {\n return {\n embedding: cached,\n latency: 0\n };\n }\n\n const start = Date.now();\n\n try {\n const response = await fetch(this.baseURL, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.apiKey}`\n },\n body: JSON.stringify({\n model: this.model,\n input: text,\n dimensions: this.config.dimensions || undefined\n })\n });\n\n if (!response.ok) {\n throw new Error(`OpenAI API error: ${response.statusText}`);\n }\n\n const data: any = await response.json();\n const embedding: number[] = data.data[0].embedding;\n\n // Cache it\n this.setCached(text, embedding);\n\n const latency = Date.now() - start;\n\n this.emit('embed', { text, latency });\n\n return {\n embedding,\n usage: data.usage,\n latency\n };\n } catch (error: any) {\n throw new Error(`OpenAI embedding failed: ${error.message}`);\n }\n }\n\n async embedBatch(texts: string[]): Promise<EmbeddingResult[]> {\n const start = Date.now();\n\n try {\n const response = await fetch(this.baseURL, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.apiKey}`\n },\n body: JSON.stringify({\n model: this.model,\n input: texts,\n dimensions: this.config.dimensions || undefined\n })\n });\n\n if (!response.ok) {\n throw new Error(`OpenAI API error: ${response.statusText}`);\n }\n\n const data: any = await response.json();\n const latency = Date.now() - start;\n\n return data.data.map((item: any, index: number) => {\n const embedding: number[] = item.embedding;\n this.setCached(texts[index], embedding);\n\n return {\n embedding,\n usage: {\n promptTokens: Math.floor(data.usage.prompt_tokens / texts.length),\n totalTokens: Math.floor(data.usage.total_tokens / texts.length)\n },\n latency: Math.floor(latency / texts.length)\n };\n });\n } catch (error: any) {\n throw new Error(`OpenAI batch embedding failed: ${error.message}`);\n }\n }\n}\n\n/**\n * Transformers.js Local Embedding Service\n *\n * Runs locally without API calls using ONNX runtime\n * https://huggingface.co/docs/transformers.js\n */\nexport class TransformersEmbeddingService extends EmbeddingService {\n private pipeline: any = null;\n private modelName: string;\n\n constructor(config: Omit<EmbeddingConfig, 'provider'>) {\n super({ ...config, provider: 'transformers' });\n this.modelName = config.model || 'Xenova/all-MiniLM-L6-v2';\n }\n\n async initialize(): Promise<void> {\n if (this.pipeline) return;\n\n try {\n // Dynamically import transformers.js\n const { pipeline } = await import('@huggingface/transformers');\n\n this.pipeline = await pipeline('feature-extraction', this.modelName);\n this.emit('initialized', { model: this.modelName });\n } catch (error: any) {\n throw new Error(`Failed to initialize transformers.js: ${error.message}`);\n }\n }\n\n async embed(text: string): Promise<EmbeddingResult> {\n await this.initialize();\n\n // Check cache\n const cached = this.getCached(text);\n if (cached) {\n return {\n embedding: cached,\n latency: 0\n };\n }\n\n const start = Date.now();\n\n try {\n const output = await this.pipeline(text, { pooling: 'mean', normalize: true });\n\n // Convert to regular array\n const embedding = Array.from(output.data) as number[];\n\n // Cache it\n this.setCached(text, embedding);\n\n const latency = Date.now() - start;\n\n this.emit('embed', { text, latency });\n\n return {\n embedding,\n latency\n };\n } catch (error: any) {\n throw new Error(`Transformers.js embedding failed: ${error.message}`);\n }\n }\n\n async embedBatch(texts: string[]): Promise<EmbeddingResult[]> {\n await this.initialize();\n\n const start = Date.now();\n\n try {\n const results: EmbeddingResult[] = [];\n\n for (const text of texts) {\n const cached = this.getCached(text);\n\n if (cached) {\n results.push({\n embedding: cached,\n latency: 0\n });\n } else {\n const output = await this.pipeline(text, {\n pooling: 'mean',\n normalize: true\n });\n const embedding = Array.from(output.data) as number[];\n\n this.setCached(text, embedding);\n\n results.push({\n embedding,\n latency: Math.floor((Date.now() - start) / texts.length)\n });\n }\n }\n\n return results;\n } catch (error: any) {\n throw new Error(`Transformers.js batch embedding failed: ${error.message}`);\n }\n }\n}\n\n/**\n * Mock Embedding Service (for development/testing)\n *\n * Generates deterministic hash-based embeddings\n * Fast but not semantically meaningful\n */\nexport class MockEmbeddingService extends EmbeddingService {\n constructor(config?: Partial<EmbeddingConfig>) {\n super({\n provider: 'mock',\n dimensions: 384,\n ...config\n });\n }\n\n async embed(text: string): Promise<EmbeddingResult> {\n // Check cache\n const cached = this.getCached(text);\n if (cached) {\n return {\n embedding: cached,\n latency: 0\n };\n }\n\n const start = Date.now();\n\n // Generate hash-based embedding\n const embedding = this.hashEmbedding(text);\n\n // Cache it\n this.setCached(text, embedding);\n\n const latency = Date.now() - start;\n\n return {\n embedding,\n latency\n };\n }\n\n async embedBatch(texts: string[]): Promise<EmbeddingResult[]> {\n return Promise.all(texts.map(text => this.embed(text)));\n }\n\n private hashEmbedding(text: string): number[] {\n const dimensions = this.config.dimensions || 384;\n const embedding = new Array(dimensions);\n\n // Seed with text hash\n let hash = 0;\n for (let i = 0; i < text.length; i++) {\n hash = (hash << 5) - hash + text.charCodeAt(i);\n hash = hash & hash;\n }\n\n // Generate pseudo-random embedding\n for (let i = 0; i < dimensions; i++) {\n const seed = hash + i * 2654435761;\n const x = Math.sin(seed) * 10000;\n embedding[i] = x - Math.floor(x);\n }\n\n // Normalize to unit vector\n const norm = Math.sqrt(embedding.reduce((sum, v) => sum + v * v, 0));\n return embedding.map(v => v / norm);\n }\n}\n\n/**\n * Factory function to create appropriate embedding service\n */\nexport function createEmbeddingService(config: EmbeddingConfig): EmbeddingService {\n switch (config.provider) {\n case 'openai':\n if (!config.apiKey) {\n throw new Error('OpenAI API key required');\n }\n return new OpenAIEmbeddingService(config as any);\n\n case 'transformers':\n return new TransformersEmbeddingService(config);\n\n case 'mock':\n return new MockEmbeddingService(config);\n\n default:\n console.warn(`Unknown provider: ${config.provider}, using mock`);\n return new MockEmbeddingService(config);\n }\n}\n\n/**\n * Convenience function for quick embeddings\n */\nexport async function getEmbedding(\n text: string,\n config?: Partial<EmbeddingConfig>\n): Promise<number[]> {\n const service = createEmbeddingService({\n provider: 'mock',\n ...config\n } as EmbeddingConfig);\n\n const result = await service.embed(text);\n return result.embedding;\n}\n\n/**\n * Benchmark different embedding providers\n */\nexport async function benchmarkEmbeddings(testText: string = 'Hello world'): Promise<{\n mock: { latency: number; dimensions: number };\n transformers?: { latency: number; dimensions: number; error?: string };\n openai?: { latency: number; dimensions: number; error?: string };\n}> {\n const results: any = {};\n\n // Test mock\n const mockService = new MockEmbeddingService({ dimensions: 384 });\n const mockResult = await mockService.embed(testText);\n results.mock = {\n latency: mockResult.latency,\n dimensions: mockResult.embedding.length\n };\n\n // Test transformers (if available)\n try {\n const transformersService = new TransformersEmbeddingService({\n model: 'Xenova/all-MiniLM-L6-v2'\n });\n const transformersResult = await transformersService.embed(testText);\n results.transformers = {\n latency: transformersResult.latency,\n dimensions: transformersResult.embedding.length\n };\n } catch (error: any) {\n results.transformers = {\n error: error.message\n };\n }\n\n // Test OpenAI (if API key available)\n const apiKey = process.env.OPENAI_API_KEY;\n if (apiKey) {\n try {\n const openaiService = new OpenAIEmbeddingService({\n apiKey,\n model: 'text-embedding-3-small'\n });\n const openaiResult = await openaiService.embed(testText);\n results.openai = {\n latency: openaiResult.latency,\n dimensions: openaiResult.embedding.length\n };\n } catch (error: any) {\n results.openai = {\n error: error.message\n };\n }\n }\n\n return results;\n}\n"]}
@@ -507,7 +507,7 @@ export class OptimizedEmbedder {
507
507
  catch (error) {
508
508
  // Fallback to transformers.js
509
509
  console.warn('ONNX Runtime not available, using transformers.js fallback');
510
- const { pipeline } = await import('@xenova/transformers');
510
+ const { pipeline } = await import('@huggingface/transformers');
511
511
  this.tokenizer = await pipeline('feature-extraction', `Xenova/${this.config.modelId}`);
512
512
  }
513
513
  // Pre-allocate output buffer
@@ -1 +1 @@
1
- {"version":3,"file":"optimized-embedder.js","sourceRoot":"","sources":["../../src/embeddings/optimized-embedder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAgB,MAAM,IAAI,CAAC;AACxE,OAAO,EAAE,IAAI,EAAW,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AACzD,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAEpC,+EAA+E;AAC/E,qBAAqB;AACrB,+EAA+E;AAE/E,MAAM,eAAe,GAAG,KAAK,CAAC,CAAC,sBAAsB;AACrD,MAAM,cAAc,GAAG,GAAG,CAAC,CAAG,qBAAqB;AACnD,MAAM,sBAAsB,GAAG,mBAAmB,CAAC;AAcnD,MAAM,CAAC,MAAM,cAAc,GAAmB;IAC5C,OAAO,EAAE,kBAAkB;IAC3B,SAAS,EAAE,GAAG;IACd,SAAS,EAAE,GAAG;IACd,QAAQ,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,eAAe,EAAE,QAAQ,CAAC;IACpD,YAAY,EAAE,IAAI;CACnB,CAAC;AAEF,4DAA4D;AAC5D,MAAM,cAAc,GAMf;IACH,kBAAkB,EAAE;QAClB,GAAG,EAAE,uFAAuF;QAC5F,SAAS,EAAE,GAAG;QACd,IAAI,EAAE,MAAM;QACZ,SAAS,EAAE,IAAI;QACf,6CAA6C;KAC9C;IACD,uBAAuB,EAAE;QACvB,GAAG,EAAE,6EAA6E;QAClF,SAAS,EAAE,GAAG;QACd,IAAI,EAAE,MAAM;KACb;IACD,mBAAmB,EAAE;QACnB,GAAG,EAAE,wFAAwF;QAC7F,SAAS,EAAE,GAAG;QACd,IAAI,EAAE,MAAM;QACZ,SAAS,EAAE,IAAI;KAChB;IACD,WAAW,EAAE;QACX,GAAG,EAAE,gFAAgF;QACrF,SAAS,EAAE,GAAG;QACd,IAAI,EAAE,MAAM;QACZ,SAAS,EAAE,IAAI;KAChB;CACF,CAAC;AAEF,+EAA+E;AAC/E,gCAAgC;AAChC,+EAA+E;AAE/E;;;GAGG;AACH,SAAS,eAAe,CAAC,OAAe;IACtC,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC5C,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;IACzD,CAAC;IACD,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CAAC,4BAA4B,OAAO,8DAA8D,CAAC,CAAC;IACrH,CAAC;IACD,IAAI,CAAC,CAAC,OAAO,IAAI,cAAc,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,kBAAkB,OAAO,gBAAgB,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACrG,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,iBAAiB,CAAC,IAAY;IACrC,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC3D,CAAC;IACD,IAAI,IAAI,CAAC,MAAM,GAAG,eAAe,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CAAC,kCAAkC,eAAe,aAAa,CAAC,CAAC;IAClF,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,iBAAiB,CAAC,KAAe;IACxC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAClD,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,GAAG,cAAc,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CAAC,cAAc,KAAK,CAAC,MAAM,uBAAuB,cAAc,EAAE,CAAC,CAAC;IACrF,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,iBAAiB,CAAC,SAAiB,EAAE,OAAe;IAC3D,MAAM,aAAa,GAAG,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;IACpD,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,EAAE,GAAG,OAAO,OAAO,CAAC,CAAC;IACzD,MAAM,YAAY,GAAG,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;IAEnD,4DAA4D;IAC5D,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QAC5C,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAC;IAClF,CAAC;IAED,OAAO,YAAY,CAAC;AACtB,CAAC;AAED;;GAEG;AACH,SAAS,aAAa,CAAC,MAAkB;IACvC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC3D,CAAC;AAcD,MAAM,cAAc;IACV,KAAK,GAA2B,IAAI,GAAG,EAAE,CAAC;IAC1C,IAAI,GAAqB,IAAI,CAAC,CAAE,qBAAqB;IACrD,IAAI,GAAqB,IAAI,CAAC,CAAE,sBAAsB;IACtD,OAAO,CAAS;IAChB,IAAI,GAAG,CAAC,CAAC;IACT,MAAM,GAAG,CAAC,CAAC;IAEnB,YAAY,UAAkB,GAAG;QAC/B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED,sCAAsC;IAC9B,IAAI,CAAC,GAAW;QACtB,IAAI,IAAI,GAAG,UAAU,CAAC;QACtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACpC,IAAI,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YAC1B,IAAI,GAAG,CAAC,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;QACjC,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,gDAAgD;IACxC,UAAU,CAAC,IAAe;QAChC,IAAI,IAAI,KAAK,IAAI,CAAC,IAAI;YAAE,OAAO;QAE/B,+BAA+B;QAC/B,IAAI,IAAI,CAAC,IAAI;YAAE,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QAC1C,IAAI,IAAI,CAAC,IAAI;YAAE,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QAC1C,IAAI,IAAI,KAAK,IAAI,CAAC,IAAI;YAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QAE9C,eAAe;QACf,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACtB,IAAI,IAAI,CAAC,IAAI;YAAE,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACrC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,IAAI,CAAC,IAAI;YAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnC,CAAC;IAED,gDAAgD;IACxC,UAAU;QAChB,IAAI,CAAC,IAAI,CAAC,IAAI;YAAE,OAAO;QAEvB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAElC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACnB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;YAC3B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;QAC7B,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QAC/B,CAAC;IACH,CAAC;IAED,0BAA0B;IAC1B,GAAG,CAAC,GAAW;QACb,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACzB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAE/B,IAAI,IAAI,IAAI,IAAI,CAAC,GAAG,KAAK,GAAG,EAAE,CAAC;YAC7B,IAAI,CAAC,IAAI,EAAE,CAAC;YACZ,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YACtB,OAAO,IAAI,CAAC,KAAK,CAAC;QACpB,CAAC;QAED,IAAI,CAAC,MAAM,EAAE,CAAC;QACd,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,0BAA0B;IAC1B,GAAG,CAAC,GAAW,EAAE,KAAmB;QAClC,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAEnC,IAAI,QAAQ,IAAI,QAAQ,CAAC,GAAG,KAAK,GAAG,EAAE,CAAC;YACrC,uBAAuB;YACvB,QAAQ,CAAC,KAAK,GAAG,KAAK,CAAC;YACvB,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YAC1B,OAAO;QACT,CAAC;QAED,0CAA0C;QAC1C,IAAI,QAAQ,EAAE,CAAC;YACb,kDAAkD;YAClD,IAAI,QAAQ,CAAC,IAAI;gBAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;YACtD,IAAI,QAAQ,CAAC,IAAI;gBAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;YACtD,IAAI,QAAQ,KAAK,IAAI,CAAC,IAAI;gBAAE,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;YACtD,IAAI,QAAQ,KAAK,IAAI,CAAC,IAAI;gBAAE,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;YACtD,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACvB,CAAC;QAED,2BAA2B;QAC3B,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACpC,IAAI,CAAC,UAAU,EAAE,CAAC;QACpB,CAAC;QAED,0BAA0B;QAC1B,MAAM,IAAI,GAAc;YACtB,GAAG;YACH,IAAI,EAAE,CAAC;YACP,KAAK;YACL,IAAI,EAAE,IAAI;YACV,IAAI,EAAE,IAAI,CAAC,IAAI;SAChB,CAAC;QAEF,IAAI,IAAI,CAAC,IAAI;YAAE,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACrC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,IAAI,CAAC,IAAI;YAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QAEjC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;IACzB,CAAC;IAED,KAAK;QACH,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACnB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QAC7B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;IAC9B,CAAC;IAED,KAAK;QACH,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC;QACtC,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI;YACrB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,OAAO,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;SAC3C,CAAC;IACJ,CAAC;CACF;AAED,+EAA+E;AAC/E,wEAAwE;AACxE,+EAA+E;AAE/E,MAAM,SAAS;IACL,SAAS,CAAS;IAClB,KAAK,GAAmB,EAAE,CAAC;IAEnC,YAAY,KAAa;QACvB,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,OAAO;QACX,IAAI,IAAI,CAAC,SAAS,GAAG,CAAC,EAAE,CAAC;YACvB,IAAI,CAAC,SAAS,EAAE,CAAC;YACjB,OAAO;QACT,CAAC;QACD,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IAC1D,CAAC;IAED,OAAO;QACL,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAG,CAAC;YACjC,IAAI,EAAE,CAAC;QACT,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,SAAS,EAAE,CAAC;QACnB,CAAC;IACH,CAAC;CACF;AAED,+EAA+E;AAC/E,4EAA4E;AAC5E,+EAA+E;AAE/E;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,CAAe,EAAE,CAAe;IAC/D,MAAM,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC;IAErB,wEAAwE;IACxE,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC;IAC3C,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC;IACnD,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC;IAEnD,+BAA+B;IAC/B,MAAM,WAAW,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;IACpC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEV,OAAO,CAAC,GAAG,WAAW,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/B,kCAAkC;QAClC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,GAAC,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,GAAC,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,GAAC,CAAC,CAAC,CAAC;QACvD,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,GAAC,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,GAAC,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,GAAC,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,GAAC,CAAC,CAAC,CAAC;QACzD,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,GAAC,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,GAAC,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,GAAC,CAAC,CAAC,CAAC;QACvD,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,GAAC,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,GAAC,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,GAAC,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,GAAC,CAAC,CAAC,CAAC;QAEzD,2DAA2D;QAC3D,IAAI,IAAI,EAAE,GAAC,EAAE,GAAG,EAAE,GAAC,EAAE,CAAC;QACtB,IAAI,IAAI,EAAE,GAAC,EAAE,GAAG,EAAE,GAAC,EAAE,CAAC;QACtB,IAAI,IAAI,EAAE,GAAC,EAAE,GAAG,EAAE,GAAC,EAAE,CAAC;QACtB,IAAI,IAAI,EAAE,GAAC,EAAE,GAAG,EAAE,GAAC,EAAE,CAAC;QAEtB,oBAAoB;QACpB,MAAM,IAAI,EAAE,GAAC,EAAE,GAAG,EAAE,GAAC,EAAE,CAAC;QACxB,MAAM,IAAI,EAAE,GAAC,EAAE,GAAG,EAAE,GAAC,EAAE,CAAC;QACxB,MAAM,IAAI,EAAE,GAAC,EAAE,GAAG,EAAE,GAAC,EAAE,CAAC;QACxB,MAAM,IAAI,EAAE,GAAC,EAAE,GAAG,EAAE,GAAC,EAAE,CAAC;QAExB,oBAAoB;QACpB,MAAM,IAAI,EAAE,GAAC,EAAE,GAAG,EAAE,GAAC,EAAE,CAAC;QACxB,MAAM,IAAI,EAAE,GAAC,EAAE,GAAG,EAAE,GAAC,EAAE,CAAC;QACxB,MAAM,IAAI,EAAE,GAAC,EAAE,GAAG,EAAE,GAAC,EAAE,CAAC;QACxB,MAAM,IAAI,EAAE,GAAC,EAAE,GAAG,EAAE,GAAC,EAAE,CAAC;IAC1B,CAAC;IAED,uBAAuB;IACvB,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IACpC,IAAI,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IAC9C,IAAI,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IAE9C,mBAAmB;IACnB,OAAO,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QACpB,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3B,GAAG,IAAI,EAAE,GAAG,EAAE,CAAC;QACf,KAAK,IAAI,EAAE,GAAG,EAAE,CAAC;QACjB,KAAK,IAAI,EAAE,GAAG,EAAE,CAAC;IACnB,CAAC;IAED,4DAA4D;IAC5D,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC;IACvC,OAAO,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACrC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,CAAe,EAAE,CAAe;IAChE,MAAM,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC;IACrB,IAAI,GAAG,GAAG,CAAC,CAAC;IAEZ,MAAM,WAAW,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;IACpC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEV,OAAO,CAAC,GAAG,WAAW,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/B,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACvB,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,GAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAC,CAAC,CAAC,CAAC;QAC3B,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,GAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAC,CAAC,CAAC,CAAC;QAC3B,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,GAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAC,CAAC,CAAC,CAAC;QAC3B,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;IAC/C,CAAC;IAED,OAAO,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QACpB,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACtB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;IACf,CAAC;IAED,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACxB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,CAAe;IAC7C,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,MAAM,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC;IAErB,8BAA8B;IAC9B,MAAM,WAAW,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;IACpC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEV,OAAO,CAAC,GAAG,WAAW,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/B,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAC,CAAC,CAAC,CAAC;IAC5E,CAAC;IACD,OAAO,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QACpB,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACtB,CAAC;IAED,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEvB,IAAI,IAAI,GAAG,CAAC,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC;QACzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;YAC7B,CAAC,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC;QAClB,CAAC;IACH,CAAC;IAED,OAAO,CAAC,CAAC;AACX,CAAC;AAaD,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,OAAe,EACf,SAAiB,EACjB,UAAiD;IAEjD,yDAAyD;IACzD,eAAe,CAAC,OAAO,CAAC,CAAC;IAEzB,MAAM,SAAS,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IAE1C,2DAA2D;IAC3D,MAAM,SAAS,GAAG,iBAAiB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAExD,8BAA8B;IAC9B,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,SAAS,OAAO,sBAAsB,SAAS,EAAE,CAAC,CAAC;QAC/D,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,+CAA+C;IAC/C,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAEvD,OAAO,CAAC,GAAG,CAAC,eAAe,OAAO,KAAK,SAAS,CAAC,IAAI,MAAM,CAAC,CAAC;IAE7D,IAAI,CAAC;QACH,kDAAkD;QAClD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC1C,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;QACrE,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QAC5C,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,uBAAuB,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;QAChE,CAAC;QAED,MAAM,UAAU,GAAG,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,GAAG,EAAE,EAAE,CAAC,CAAC;QAC/E,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC;QAE1C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;QACtC,CAAC;QAED,MAAM,MAAM,GAAiB,EAAE,CAAC;QAChC,IAAI,eAAe,GAAG,CAAC,CAAC;QAExB,OAAO,IAAI,EAAE,CAAC;YACZ,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YAC5C,IAAI,IAAI;gBAAE,MAAM;YAEhB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnB,eAAe,IAAI,KAAK,CAAC,MAAM,CAAC;YAEhC,IAAI,UAAU,EAAE,CAAC;gBACf,UAAU,CAAC;oBACT,OAAO;oBACP,eAAe;oBACf,UAAU;oBACV,OAAO,EAAE,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,eAAe,GAAG,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;iBACnE,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,qBAAqB;QACrB,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACzE,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,WAAW,CAAC,CAAC;QAC3C,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC;QACzB,CAAC;QAED,sDAAsD;QACtD,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;QACzC,IAAI,SAAS,CAAC,MAAM,IAAI,UAAU,KAAK,SAAS,CAAC,MAAM,EAAE,CAAC;YACxD,MAAM,IAAI,KAAK,CACb,8BAA8B,OAAO,IAAI;gBACzC,aAAa,SAAS,CAAC,MAAM,UAAU,UAAU,IAAI;gBACrD,yDAAyD,CAC1D,CAAC;QACJ,CAAC;QAED,4CAA4C;QAC5C,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,cAAc,OAAO,OAAO,SAAS,EAAE,CAAC,CAAC;QAErD,gEAAgE;QAChE,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,GAAG,OAAO,YAAY,CAAC,CAAC;QACzD,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC;YACrC,OAAO;YACP,SAAS,EAAE,SAAS,CAAC,SAAS;YAC9B,SAAS,EAAE,SAAS,CAAC,SAAS,IAAI,KAAK;YACvC,YAAY,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACtC,IAAI,EAAE,WAAW;YACjB,MAAM,EAAE,UAAU,CAAC,yCAAyC;SAC7D,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAE9B,OAAO,SAAS,CAAC;IACnB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,sBAAsB,OAAO,KAAK,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC9G,CAAC;AACH,CAAC;AAED,MAAM,UAAU,mBAAmB;IAOjC,MAAM,QAAQ,GAAG,cAAc,CAAC,QAAQ,CAAC;IAEzC,OAAO,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QACzD,EAAE;QACF,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,KAAK;QAClC,UAAU,EAAE,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;KACrD,CAAC,CAAC,CAAC;AACN,CAAC;AAED,+EAA+E;AAC/E,2BAA2B;AAC3B,+EAA+E;AAE/E,MAAM,OAAO,iBAAiB;IACpB,MAAM,CAAiB;IACvB,KAAK,CAAiB;IACtB,WAAW,GAAQ,IAAI,CAAC;IACxB,SAAS,GAAQ,IAAI,CAAC;IACtB,WAAW,GAAG,KAAK,CAAC;IACpB,WAAW,GAAyB,IAAI,CAAC;IAEjD,gDAAgD;IACxC,YAAY,GAAwB,IAAI,CAAC;IAEjD,gDAAgD;IACxC,MAAM,CAAU,UAAU,GAAG,GAAG,CAAC;IACjC,cAAc,GAAkB,IAAI,aAAa,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;IAChF,mBAAmB,GAAkB,IAAI,aAAa,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;IACrF,kBAAkB,GAAkB,IAAI,aAAa,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;IAE5F,YAAY,SAAkC,EAAE;QAC9C,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,cAAc,EAAE,GAAG,MAAM,EAAE,CAAC;QAC/C,IAAI,CAAC,KAAK,GAAG,IAAI,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACzD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI;QACR,IAAI,IAAI,CAAC,WAAW;YAAE,OAAO;QAC7B,IAAI,IAAI,CAAC,WAAW;YAAE,OAAO,IAAI,CAAC,WAAW,CAAC;QAE9C,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;QAChC,MAAM,IAAI,CAAC,WAAW,CAAC;QACvB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;IAC1B,CAAC;IAEO,KAAK,CAAC,KAAK;QACjB,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,OAAO,CAAC,CAAC;QAE5E,qBAAqB;QACrB,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YACvD,MAAM,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,EAAE;gBAC1E,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,iBAAiB,IAAI,CAAC,MAAM,CAAC,OAAO,KAAK,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YAChG,CAAC,CAAC,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC;QAED,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,oBAAoB,SAAS,mDAAmD,CAAC,CAAC;QACpG,CAAC;QAED,oBAAoB;QACpB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;YAC7C,IAAI,CAAC,WAAW,GAAG,MAAM,GAAG,CAAC,gBAAgB,CAAC,MAAM,CAAC,SAAS,EAAE;gBAC9D,kBAAkB,EAAE,CAAC,KAAK,CAAC;gBAC3B,sBAAsB,EAAE,KAAK;aAC9B,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,8BAA8B;YAC9B,OAAO,CAAC,IAAI,CAAC,4DAA4D,CAAC,CAAC;YAC3E,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;YAC1D,IAAI,CAAC,SAAS,GAAG,MAAM,QAAQ,CAAC,oBAAoB,EAAE,UAAU,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QACzF,CAAC;QAED,6BAA6B;QAC7B,IAAI,CAAC,YAAY,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAC9D,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK,CAAC,IAAY;QACtB,6CAA6C;QAC7C,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAExB,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAElB,cAAc;QACd,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,IAAI,SAAuB,CAAC;QAE5B,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,SAAS,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QAC7C,CAAC;aAAM,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YAC1B,SAAS,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC;QACrD,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;QACpD,CAAC;QAED,YAAY;QACZ,eAAe,CAAC,SAAS,CAAC,CAAC;QAE3B,QAAQ;QACR,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAEhC,OAAO,SAAS,CAAC;IACnB,CAAC;IAEO,KAAK,CAAC,aAAa,CAAC,IAAY;QACtC,0CAA0C;QAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,UAAU,CAAC,CAAC;QAErE,gEAAgE;QAChE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAChC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3C,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;YACjC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;QAClC,CAAC;QAED,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;QAC7C,MAAM,WAAW,GAAI,GAAW,CAAC,MAAM,CAAC;QAExC,uDAAuD;QACvD,MAAM,QAAQ,GAAG,IAAI,WAAW,CAC9B,OAAO,EACP,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,EACvC,CAAC,CAAC,EAAE,MAAM,CAAC,CACZ,CAAC;QACF,MAAM,aAAa,GAAG,IAAI,WAAW,CACnC,OAAO,EACP,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,EAC5C,CAAC,CAAC,EAAE,MAAM,CAAC,CACZ,CAAC;QACF,MAAM,YAAY,GAAG,IAAI,WAAW,CAClC,OAAO,EACP,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,EAC3C,CAAC,CAAC,EAAE,MAAM,CAAC,CACZ,CAAC;QAEF,MAAM,KAAK,GAAG;YACZ,SAAS,EAAE,QAAQ;YACnB,cAAc,EAAE,aAAa;YAC7B,cAAc,EAAE,YAAY;SAC7B,CAAC;QAEF,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,IAAI,OAAO,CAAC,oBAAoB,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QAE1G,iCAAiC;QACjC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAoB,CAAC;QACzC,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;QAEzC,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,UAAU,CAAC,CAAC;QAC5C,MAAM,cAAc,GAAG,UAAU,GAAG,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;QAErD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAChC,MAAM,MAAM,GAAG,CAAC,GAAG,UAAU,CAAC;YAC9B,IAAI,CAAC,GAAG,CAAC,CAAC;YAEV,yBAAyB;YACzB,OAAO,CAAC,GAAG,cAAc,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;gBAClC,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;gBAC9B,MAAM,CAAC,CAAC,GAAC,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,GAAC,CAAC,CAAC,CAAC;gBAClC,MAAM,CAAC,CAAC,GAAC,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,GAAC,CAAC,CAAC,CAAC;gBAClC,MAAM,CAAC,CAAC,GAAC,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,GAAC,CAAC,CAAC,CAAC;YACpC,CAAC;YAED,YAAY;YACZ,OAAO,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC3B,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;QAED,+BAA+B;QAC/B,MAAM,SAAS,GAAG,CAAC,GAAG,MAAM,CAAC;QAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC;YACpC,MAAM,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC;QACzB,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,cAAc,CAAC,IAAY;QACjC,+CAA+C;QAC/C,sCAAsC;QACtC,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAC5D,MAAM,MAAM,GAAa,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ;QAExC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,0BAA0B;YAC1B,IAAI,IAAI,GAAG,CAAC,CAAC;YACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACrC,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YACvD,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK,GAAG,IAAI,CAAC,CAAC;QAC7C,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ;QAC1B,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,KAAK,CAAC,qBAAqB,CAAC,IAAY;QAC9C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAChF,OAAO,IAAI,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACvC,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,UAAU,CAAC,KAAe,EAAE,cAAsB,CAAC;QACvD,gCAAgC;QAChC,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAEzB,qCAAqC;QACrC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;QAED,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAElB,MAAM,OAAO,GAAmB,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACxD,MAAM,OAAO,GAAsC,EAAE,CAAC;QAEtD,uDAAuD;QACvD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YACxC,IAAI,MAAM,EAAE,CAAC;gBACX,OAAO,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC;YACtB,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC7C,CAAC;QACH,CAAC;QAED,yCAAyC;QACzC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;YAEvE,MAAM,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE;gBACtD,MAAM,SAAS,CAAC,OAAO,EAAE,CAAC;gBAC1B,IAAI,CAAC;oBACH,wDAAwD;oBACxD,IAAI,SAAuB,CAAC;oBAE5B,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;wBACrB,SAAS,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;oBAC7C,CAAC;yBAAM,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;wBAC1B,SAAS,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC;oBACrD,CAAC;yBAAM,CAAC;wBACN,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;oBACpD,CAAC;oBAED,eAAe,CAAC,SAAS,CAAC,CAAC;oBAC3B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;oBAChC,OAAO,CAAC,KAAK,CAAC,GAAG,SAAS,CAAC;gBAC7B,CAAC;wBAAS,CAAC;oBACT,SAAS,CAAC,OAAO,EAAE,CAAC;gBACtB,CAAC;YACH,CAAC,CAAC,CAAC,CAAC;QACN,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CACf,KAAa,EACb,UAAoB,EACpB,OAAe,CAAC;QAEhB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACzC,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;QAExD,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;YAChD,IAAI,EAAE,UAAU,CAAC,KAAK,CAAC;YACvB,KAAK,EAAE,gBAAgB,CAAC,QAAQ,EAAE,GAAG,CAAC;YACtC,KAAK;SACN,CAAC,CAAC,CAAC;QAEJ,OAAO,MAAM;aACV,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;aACjC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACpB,CAAC;IAED;;OAEG;IACH,aAAa;QACX,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI;YACrB,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS;SAC/B,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,UAAU;QACR,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;IAED;;OAEG;IACH,aAAa;QACX,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;;AAGH,+EAA+E;AAC/E,qBAAqB;AACrB,+EAA+E;AAE/E,IAAI,eAAe,GAA6B,IAAI,CAAC;AAErD,MAAM,UAAU,oBAAoB,CAAC,MAAgC;IACnE,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,eAAe,GAAG,IAAI,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAClD,CAAC;IACD,OAAO,eAAe,CAAC;AACzB,CAAC;AAED,+EAA+E;AAC/E,kBAAkB;AAClB,+EAA+E;AAE/E,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAAgB;IACnD,MAAM,EAAE,GAAG,OAAO,IAAI,cAAc,CAAC,OAAO,CAAC;IAC7C,OAAO,CAAC,GAAG,CAAC,uCAAuC,EAAE,EAAE,CAAC,CAAC;IAEzD,MAAM,aAAa,CAAC,EAAE,EAAE,cAAc,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,EAAE;QAC5D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,oBAAoB,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACtI,CAAC,CAAC,CAAC;IACH,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;IAEtC,MAAM,QAAQ,GAAG,oBAAoB,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;IACvD,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IACtB,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;IAExC,mBAAmB;IACnB,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC7C,OAAO,CAAC,GAAG,CAAC,mBAAmB,OAAO,CAAC,MAAM,qBAAqB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AACpI,CAAC","sourcesContent":["/**\n * Optimized Embedder for Agentic-Flow\n *\n * Uses ruvector's AdaptiveEmbedder optimizations:\n * - Float32Array with flattened matrices\n * - 256-entry LRU cache with FNV-1a hash\n * - SIMD-friendly loop unrolling (4x)\n * - Pre-allocated buffers (no GC pressure)\n *\n * Downloads ONNX models at init for offline use.\n */\n\nimport { existsSync, mkdirSync, writeFileSync, readFileSync } from 'fs';\nimport { join, dirname, resolve, normalize } from 'path';\nimport { homedir } from 'os';\nimport { createHash } from 'crypto';\n\n// ============================================================================\n// Security Constants\n// ============================================================================\n\nconst MAX_TEXT_LENGTH = 10000; // 10KB limit per text\nconst MAX_BATCH_SIZE = 100; // Maximum batch size\nconst VALID_MODEL_ID_PATTERN = /^[a-zA-Z0-9._-]+$/;\n\n// ============================================================================\n// Configuration\n// ============================================================================\n\nexport interface EmbedderConfig {\n modelId: string;\n dimension: number;\n cacheSize: number;\n modelDir: string;\n autoDownload: boolean;\n}\n\nexport const DEFAULT_CONFIG: EmbedderConfig = {\n modelId: 'all-MiniLM-L6-v2',\n dimension: 384,\n cacheSize: 256,\n modelDir: join(homedir(), '.agentic-flow', 'models'),\n autoDownload: true\n};\n\n// Model registry with download URLs and integrity checksums\nconst MODEL_REGISTRY: Record<string, {\n url: string;\n dimension: number;\n size: string;\n quantized?: boolean;\n sha256?: string; // Optional integrity checksum\n}> = {\n 'all-MiniLM-L6-v2': {\n url: 'https://huggingface.co/Xenova/all-MiniLM-L6-v2/resolve/main/onnx/model_quantized.onnx',\n dimension: 384,\n size: '23MB',\n quantized: true\n // sha256: 'to-be-computed-on-first-download'\n },\n 'all-MiniLM-L6-v2-full': {\n url: 'https://huggingface.co/Xenova/all-MiniLM-L6-v2/resolve/main/onnx/model.onnx',\n dimension: 384,\n size: '91MB'\n },\n 'bge-small-en-v1.5': {\n url: 'https://huggingface.co/Xenova/bge-small-en-v1.5/resolve/main/onnx/model_quantized.onnx',\n dimension: 384,\n size: '33MB',\n quantized: true\n },\n 'gte-small': {\n url: 'https://huggingface.co/Xenova/gte-small/resolve/main/onnx/model_quantized.onnx',\n dimension: 384,\n size: '33MB',\n quantized: true\n }\n};\n\n// ============================================================================\n// Security Validation Functions\n// ============================================================================\n\n/**\n * Validate model ID format and existence in registry\n * Prevents path traversal attacks\n */\nfunction validateModelId(modelId: string): void {\n if (!modelId || typeof modelId !== 'string') {\n throw new Error('Model ID must be a non-empty string');\n }\n if (!VALID_MODEL_ID_PATTERN.test(modelId)) {\n throw new Error(`Invalid model ID format: ${modelId}. Only alphanumeric, dots, hyphens, and underscores allowed.`);\n }\n if (!(modelId in MODEL_REGISTRY)) {\n throw new Error(`Unknown model: ${modelId}. Available: ${Object.keys(MODEL_REGISTRY).join(', ')}`);\n }\n}\n\n/**\n * Validate text input length\n * Prevents memory exhaustion attacks\n */\nfunction validateTextInput(text: string): void {\n if (!text || typeof text !== 'string') {\n throw new Error('Text input must be a non-empty string');\n }\n if (text.length > MAX_TEXT_LENGTH) {\n throw new Error(`Text exceeds maximum length of ${MAX_TEXT_LENGTH} characters`);\n }\n}\n\n/**\n * Validate batch size\n * Prevents CPU exhaustion attacks\n */\nfunction validateBatchSize(texts: string[]): void {\n if (!Array.isArray(texts)) {\n throw new Error('Batch input must be an array');\n }\n if (texts.length > MAX_BATCH_SIZE) {\n throw new Error(`Batch size ${texts.length} exceeds maximum of ${MAX_BATCH_SIZE}`);\n }\n}\n\n/**\n * Validate target directory is safe\n * Prevents writing outside intended directories\n */\nfunction validateTargetDir(targetDir: string, modelId: string): string {\n const normalizedDir = normalize(resolve(targetDir));\n const modelPath = join(normalizedDir, `${modelId}.onnx`);\n const resolvedPath = normalize(resolve(modelPath));\n\n // Ensure the resolved path starts with the target directory\n if (!resolvedPath.startsWith(normalizedDir)) {\n throw new Error('Path traversal detected: model path escapes target directory');\n }\n\n return resolvedPath;\n}\n\n/**\n * Compute SHA256 hash of buffer\n */\nfunction computeSha256(buffer: Uint8Array): string {\n return createHash('sha256').update(buffer).digest('hex');\n}\n\n// ============================================================================\n// O(1) LRU Cache with Doubly-Linked List (10-50x faster than array-based)\n// ============================================================================\n\ninterface CacheNode {\n key: string;\n hash: number;\n value: Float32Array;\n prev: CacheNode | null;\n next: CacheNode | null;\n}\n\nclass EmbeddingCache {\n private cache: Map<number, CacheNode> = new Map();\n private head: CacheNode | null = null; // Most recently used\n private tail: CacheNode | null = null; // Least recently used\n private maxSize: number;\n private hits = 0;\n private misses = 0;\n\n constructor(maxSize: number = 256) {\n this.maxSize = maxSize;\n }\n\n // FNV-1a hash for fast key generation\n private hash(key: string): number {\n let hash = 2166136261;\n for (let i = 0; i < key.length; i++) {\n hash ^= key.charCodeAt(i);\n hash = (hash * 16777619) >>> 0;\n }\n return hash;\n }\n\n // O(1) - Move node to head (most recently used)\n private moveToHead(node: CacheNode): void {\n if (node === this.head) return;\n\n // Remove from current position\n if (node.prev) node.prev.next = node.next;\n if (node.next) node.next.prev = node.prev;\n if (node === this.tail) this.tail = node.prev;\n\n // Move to head\n node.prev = null;\n node.next = this.head;\n if (this.head) this.head.prev = node;\n this.head = node;\n if (!this.tail) this.tail = node;\n }\n\n // O(1) - Remove tail node (least recently used)\n private removeTail(): void {\n if (!this.tail) return;\n\n this.cache.delete(this.tail.hash);\n\n if (this.tail.prev) {\n this.tail.prev.next = null;\n this.tail = this.tail.prev;\n } else {\n this.head = this.tail = null;\n }\n }\n\n // O(1) - Get cached value\n get(key: string): Float32Array | undefined {\n const h = this.hash(key);\n const node = this.cache.get(h);\n\n if (node && node.key === key) {\n this.hits++;\n this.moveToHead(node);\n return node.value;\n }\n\n this.misses++;\n return undefined;\n }\n\n // O(1) - Set cached value\n set(key: string, value: Float32Array): void {\n const h = this.hash(key);\n const existing = this.cache.get(h);\n\n if (existing && existing.key === key) {\n // Update existing node\n existing.value = value;\n this.moveToHead(existing);\n return;\n }\n\n // Handle hash collision - evict old entry\n if (existing) {\n // Remove the colliding entry from the linked list\n if (existing.prev) existing.prev.next = existing.next;\n if (existing.next) existing.next.prev = existing.prev;\n if (existing === this.head) this.head = existing.next;\n if (existing === this.tail) this.tail = existing.prev;\n this.cache.delete(h);\n }\n\n // Evict LRU if at capacity\n if (this.cache.size >= this.maxSize) {\n this.removeTail();\n }\n\n // Create new node at head\n const node: CacheNode = {\n key,\n hash: h,\n value,\n prev: null,\n next: this.head\n };\n\n if (this.head) this.head.prev = node;\n this.head = node;\n if (!this.tail) this.tail = node;\n\n this.cache.set(h, node);\n }\n\n get size(): number {\n return this.cache.size;\n }\n\n clear(): void {\n this.cache.clear();\n this.head = this.tail = null;\n this.hits = this.misses = 0;\n }\n\n stats(): { size: number; maxSize: number; hitRate: number } {\n const total = this.hits + this.misses;\n return {\n size: this.cache.size,\n maxSize: this.maxSize,\n hitRate: total > 0 ? this.hits / total : 0\n };\n }\n}\n\n// ============================================================================\n// Semaphore for Concurrency Control (enables parallel batch processing)\n// ============================================================================\n\nclass Semaphore {\n private available: number;\n private queue: (() => void)[] = [];\n\n constructor(count: number) {\n this.available = count;\n }\n\n async acquire(): Promise<void> {\n if (this.available > 0) {\n this.available--;\n return;\n }\n return new Promise(resolve => this.queue.push(resolve));\n }\n\n release(): void {\n if (this.queue.length > 0) {\n const next = this.queue.shift()!;\n next();\n } else {\n this.available++;\n }\n }\n}\n\n// ============================================================================\n// Optimized Vector Operations (8x unrolling, separate accumulators for ILP)\n// ============================================================================\n\n/**\n * Optimized cosine similarity with 8x loop unrolling and separate accumulators\n * ~3-4x faster than naive implementation due to instruction-level parallelism\n */\nexport function cosineSimilarity(a: Float32Array, b: Float32Array): number {\n const len = a.length;\n\n // Use 4 separate accumulators to maximize instruction-level parallelism\n let dot0 = 0, dot1 = 0, dot2 = 0, dot3 = 0;\n let normA0 = 0, normA1 = 0, normA2 = 0, normA3 = 0;\n let normB0 = 0, normB1 = 0, normB2 = 0, normB3 = 0;\n\n // Process 8 elements at a time\n const unrolledLen = len - (len % 8);\n let i = 0;\n\n for (; i < unrolledLen; i += 8) {\n // Load 8 elements from each array\n const a0 = a[i], a1 = a[i+1], a2 = a[i+2], a3 = a[i+3];\n const a4 = a[i+4], a5 = a[i+5], a6 = a[i+6], a7 = a[i+7];\n const b0 = b[i], b1 = b[i+1], b2 = b[i+2], b3 = b[i+3];\n const b4 = b[i+4], b5 = b[i+5], b6 = b[i+6], b7 = b[i+7];\n\n // Accumulate dot products (pairs to separate accumulators)\n dot0 += a0*b0 + a4*b4;\n dot1 += a1*b1 + a5*b5;\n dot2 += a2*b2 + a6*b6;\n dot3 += a3*b3 + a7*b7;\n\n // Accumulate norm A\n normA0 += a0*a0 + a4*a4;\n normA1 += a1*a1 + a5*a5;\n normA2 += a2*a2 + a6*a6;\n normA3 += a3*a3 + a7*a7;\n\n // Accumulate norm B\n normB0 += b0*b0 + b4*b4;\n normB1 += b1*b1 + b5*b5;\n normB2 += b2*b2 + b6*b6;\n normB3 += b3*b3 + b7*b7;\n }\n\n // Combine accumulators\n let dot = dot0 + dot1 + dot2 + dot3;\n let normA = normA0 + normA1 + normA2 + normA3;\n let normB = normB0 + normB1 + normB2 + normB3;\n\n // Handle remainder\n for (; i < len; i++) {\n const ai = a[i], bi = b[i];\n dot += ai * bi;\n normA += ai * ai;\n normB += bi * bi;\n }\n\n // Single sqrt with product (faster than two separate sqrts)\n const denom = Math.sqrt(normA * normB);\n return denom > 0 ? dot / denom : 0;\n}\n\n/**\n * Optimized euclidean distance with loop unrolling\n */\nexport function euclideanDistance(a: Float32Array, b: Float32Array): number {\n const len = a.length;\n let sum = 0;\n\n const unrolledLen = len - (len % 4);\n let i = 0;\n\n for (; i < unrolledLen; i += 4) {\n const d0 = a[i] - b[i];\n const d1 = a[i+1] - b[i+1];\n const d2 = a[i+2] - b[i+2];\n const d3 = a[i+3] - b[i+3];\n sum += d0 * d0 + d1 * d1 + d2 * d2 + d3 * d3;\n }\n\n for (; i < len; i++) {\n const d = a[i] - b[i];\n sum += d * d;\n }\n\n return Math.sqrt(sum);\n}\n\n/**\n * Normalize vector in-place (optimized)\n */\nexport function normalizeVector(v: Float32Array): Float32Array {\n let norm = 0;\n const len = v.length;\n\n // Compute norm with unrolling\n const unrolledLen = len - (len % 4);\n let i = 0;\n\n for (; i < unrolledLen; i += 4) {\n norm += v[i] * v[i] + v[i+1] * v[i+1] + v[i+2] * v[i+2] + v[i+3] * v[i+3];\n }\n for (; i < len; i++) {\n norm += v[i] * v[i];\n }\n\n norm = Math.sqrt(norm);\n\n if (norm > 0) {\n const invNorm = 1 / norm;\n for (let j = 0; j < len; j++) {\n v[j] *= invNorm;\n }\n }\n\n return v;\n}\n\n// ============================================================================\n// Model Downloader\n// ============================================================================\n\nexport interface DownloadProgress {\n modelId: string;\n bytesDownloaded: number;\n totalBytes: number;\n percent: number;\n}\n\nexport async function downloadModel(\n modelId: string,\n targetDir: string,\n onProgress?: (progress: DownloadProgress) => void\n): Promise<string> {\n // Security: Validate model ID before any file operations\n validateModelId(modelId);\n\n const modelInfo = MODEL_REGISTRY[modelId];\n\n // Security: Validate target path to prevent path traversal\n const modelPath = validateTargetDir(targetDir, modelId);\n\n // Check if already downloaded\n if (existsSync(modelPath)) {\n console.log(`Model ${modelId} already exists at ${modelPath}`);\n return modelPath;\n }\n\n // Create directory with restricted permissions\n mkdirSync(targetDir, { recursive: true, mode: 0o700 });\n\n console.log(`Downloading ${modelId} (${modelInfo.size})...`);\n\n try {\n // Security: Enforce HTTPS for all model downloads\n if (!modelInfo.url.startsWith('https://')) {\n throw new Error('Only HTTPS URLs are allowed for model downloads');\n }\n\n const response = await fetch(modelInfo.url);\n if (!response.ok) {\n throw new Error(`Failed to download: ${response.statusText}`);\n }\n\n const totalBytes = parseInt(response.headers.get('content-length') || '0', 10);\n const reader = response.body?.getReader();\n\n if (!reader) {\n throw new Error('No response body');\n }\n\n const chunks: Uint8Array[] = [];\n let bytesDownloaded = 0;\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n chunks.push(value);\n bytesDownloaded += value.length;\n\n if (onProgress) {\n onProgress({\n modelId,\n bytesDownloaded,\n totalBytes,\n percent: totalBytes > 0 ? (bytesDownloaded / totalBytes) * 100 : 0\n });\n }\n }\n\n // Concatenate chunks\n const totalLength = chunks.reduce((acc, chunk) => acc + chunk.length, 0);\n const buffer = new Uint8Array(totalLength);\n let offset = 0;\n for (const chunk of chunks) {\n buffer.set(chunk, offset);\n offset += chunk.length;\n }\n\n // Security: Verify integrity if checksum is available\n const actualHash = computeSha256(buffer);\n if (modelInfo.sha256 && actualHash !== modelInfo.sha256) {\n throw new Error(\n `Integrity check failed for ${modelId}. ` +\n `Expected: ${modelInfo.sha256}, Got: ${actualHash}. ` +\n 'The downloaded model may be corrupted or tampered with.'\n );\n }\n\n // Write to file with restricted permissions\n writeFileSync(modelPath, buffer, { mode: 0o600 });\n console.log(`Downloaded ${modelId} to ${modelPath}`);\n\n // Save metadata including computed hash for future verification\n const metaPath = join(targetDir, `${modelId}.meta.json`);\n writeFileSync(metaPath, JSON.stringify({\n modelId,\n dimension: modelInfo.dimension,\n quantized: modelInfo.quantized || false,\n downloadedAt: new Date().toISOString(),\n size: totalLength,\n sha256: actualHash // Store hash for future integrity checks\n }, null, 2), { mode: 0o600 });\n\n return modelPath;\n } catch (error) {\n throw new Error(`Failed to download ${modelId}: ${error instanceof Error ? error.message : String(error)}`);\n }\n}\n\nexport function listAvailableModels(): Array<{\n id: string;\n dimension: number;\n size: string;\n quantized: boolean;\n downloaded: boolean;\n}> {\n const modelDir = DEFAULT_CONFIG.modelDir;\n\n return Object.entries(MODEL_REGISTRY).map(([id, info]) => ({\n id,\n dimension: info.dimension,\n size: info.size,\n quantized: info.quantized || false,\n downloaded: existsSync(join(modelDir, `${id}.onnx`))\n }));\n}\n\n// ============================================================================\n// Optimized Embedder Class\n// ============================================================================\n\nexport class OptimizedEmbedder {\n private config: EmbedderConfig;\n private cache: EmbeddingCache;\n private onnxSession: any = null;\n private tokenizer: any = null;\n private initialized = false;\n private initPromise: Promise<void> | null = null;\n\n // Pre-allocated buffers for reduced GC pressure\n private outputBuffer: Float32Array | null = null;\n\n // Pre-allocated tensor buffers (max 512 tokens)\n private static readonly MAX_TOKENS = 512;\n private inputIdsBuffer: BigInt64Array = new BigInt64Array(OptimizedEmbedder.MAX_TOKENS);\n private attentionMaskBuffer: BigInt64Array = new BigInt64Array(OptimizedEmbedder.MAX_TOKENS);\n private tokenTypeIdsBuffer: BigInt64Array = new BigInt64Array(OptimizedEmbedder.MAX_TOKENS);\n\n constructor(config: Partial<EmbedderConfig> = {}) {\n this.config = { ...DEFAULT_CONFIG, ...config };\n this.cache = new EmbeddingCache(this.config.cacheSize);\n }\n\n /**\n * Initialize the embedder (download model if needed)\n */\n async init(): Promise<void> {\n if (this.initialized) return;\n if (this.initPromise) return this.initPromise;\n\n this.initPromise = this._init();\n await this.initPromise;\n this.initialized = true;\n }\n\n private async _init(): Promise<void> {\n const modelPath = join(this.config.modelDir, `${this.config.modelId}.onnx`);\n\n // Download if needed\n if (this.config.autoDownload && !existsSync(modelPath)) {\n await downloadModel(this.config.modelId, this.config.modelDir, (progress) => {\n process.stdout.write(`\\rDownloading ${this.config.modelId}: ${progress.percent.toFixed(1)}%`);\n });\n console.log('');\n }\n\n if (!existsSync(modelPath)) {\n throw new Error(`Model not found: ${modelPath}. Run 'agentic-flow embeddings init' to download.`);\n }\n\n // Load ONNX Runtime\n try {\n const ort = await import('onnxruntime-node');\n this.onnxSession = await ort.InferenceSession.create(modelPath, {\n executionProviders: ['cpu'],\n graphOptimizationLevel: 'all'\n });\n } catch (error) {\n // Fallback to transformers.js\n console.warn('ONNX Runtime not available, using transformers.js fallback');\n const { pipeline } = await import('@xenova/transformers');\n this.tokenizer = await pipeline('feature-extraction', `Xenova/${this.config.modelId}`);\n }\n\n // Pre-allocate output buffer\n this.outputBuffer = new Float32Array(this.config.dimension);\n }\n\n /**\n * Embed a single text (with caching)\n */\n async embed(text: string): Promise<Float32Array> {\n // Security: Validate input before processing\n validateTextInput(text);\n\n await this.init();\n\n // Check cache\n const cached = this.cache.get(text);\n if (cached) {\n return cached;\n }\n\n let embedding: Float32Array;\n\n if (this.onnxSession) {\n embedding = await this.embedWithOnnx(text);\n } else if (this.tokenizer) {\n embedding = await this.embedWithTransformers(text);\n } else {\n throw new Error('No embedding backend available');\n }\n\n // Normalize\n normalizeVector(embedding);\n\n // Cache\n this.cache.set(text, embedding);\n\n return embedding;\n }\n\n private async embedWithOnnx(text: string): Promise<Float32Array> {\n // Simple tokenization (for MiniLM models)\n const tokens = this.simpleTokenize(text);\n const seqLen = Math.min(tokens.length, OptimizedEmbedder.MAX_TOKENS);\n\n // Reuse pre-allocated buffers (50-70% less allocation overhead)\n for (let i = 0; i < seqLen; i++) {\n this.inputIdsBuffer[i] = BigInt(tokens[i]);\n this.attentionMaskBuffer[i] = 1n;\n this.tokenTypeIdsBuffer[i] = 0n;\n }\n\n const ort = await import('onnxruntime-node');\n const TensorClass = (ort as any).Tensor;\n\n // Create tensors with views into pre-allocated buffers\n const inputIds = new TensorClass(\n 'int64',\n this.inputIdsBuffer.subarray(0, seqLen),\n [1, seqLen]\n );\n const attentionMask = new TensorClass(\n 'int64',\n this.attentionMaskBuffer.subarray(0, seqLen),\n [1, seqLen]\n );\n const tokenTypeIds = new TensorClass(\n 'int64',\n this.tokenTypeIdsBuffer.subarray(0, seqLen),\n [1, seqLen]\n );\n\n const feeds = {\n input_ids: inputIds,\n attention_mask: attentionMask,\n token_type_ids: tokenTypeIds\n };\n\n const results = await this.onnxSession.run(feeds);\n const output = results['last_hidden_state'] || results['sentence_embedding'] || Object.values(results)[0];\n\n // Mean pooling with 4x unrolling\n const data = output.data as Float32Array;\n const hiddenSize = this.config.dimension;\n\n const pooled = new Float32Array(hiddenSize);\n const unrolledHidden = hiddenSize - (hiddenSize % 4);\n\n for (let i = 0; i < seqLen; i++) {\n const offset = i * hiddenSize;\n let j = 0;\n\n // 4x unrolled inner loop\n for (; j < unrolledHidden; j += 4) {\n pooled[j] += data[offset + j];\n pooled[j+1] += data[offset + j+1];\n pooled[j+2] += data[offset + j+2];\n pooled[j+3] += data[offset + j+3];\n }\n\n // Remainder\n for (; j < hiddenSize; j++) {\n pooled[j] += data[offset + j];\n }\n }\n\n // Normalize by sequence length\n const invSeqLen = 1 / seqLen;\n for (let j = 0; j < hiddenSize; j++) {\n pooled[j] *= invSeqLen;\n }\n\n return pooled;\n }\n\n private simpleTokenize(text: string): number[] {\n // Simple word-piece tokenization approximation\n // In production, use proper tokenizer\n const words = text.toLowerCase().split(/\\s+/).slice(0, 128);\n const tokens: number[] = [101]; // [CLS]\n\n for (const word of words) {\n // Simple hash to token ID\n let hash = 0;\n for (let i = 0; i < word.length; i++) {\n hash = ((hash << 5) - hash + word.charCodeAt(i)) | 0;\n }\n tokens.push(Math.abs(hash) % 30000 + 1000);\n }\n\n tokens.push(102); // [SEP]\n return tokens;\n }\n\n private async embedWithTransformers(text: string): Promise<Float32Array> {\n const result = await this.tokenizer(text, { pooling: 'mean', normalize: true });\n return new Float32Array(result.data);\n }\n\n /**\n * Embed multiple texts in batch with parallel processing\n * 3-4x faster than sequential processing for large batches\n */\n async embedBatch(texts: string[], concurrency: number = 4): Promise<Float32Array[]> {\n // Security: Validate batch size\n validateBatchSize(texts);\n\n // Security: Validate each text input\n for (const text of texts) {\n validateTextInput(text);\n }\n\n await this.init();\n\n const results: Float32Array[] = new Array(texts.length);\n const toEmbed: { index: number; text: string }[] = [];\n\n // Check cache first (O(1) per item with new LRU cache)\n for (let i = 0; i < texts.length; i++) {\n const cached = this.cache.get(texts[i]);\n if (cached) {\n results[i] = cached;\n } else {\n toEmbed.push({ index: i, text: texts[i] });\n }\n }\n\n // Parallel processing for uncached items\n if (toEmbed.length > 0) {\n const semaphore = new Semaphore(Math.min(concurrency, toEmbed.length));\n\n await Promise.all(toEmbed.map(async ({ index, text }) => {\n await semaphore.acquire();\n try {\n // Direct embedding (skip validation since already done)\n let embedding: Float32Array;\n\n if (this.onnxSession) {\n embedding = await this.embedWithOnnx(text);\n } else if (this.tokenizer) {\n embedding = await this.embedWithTransformers(text);\n } else {\n throw new Error('No embedding backend available');\n }\n\n normalizeVector(embedding);\n this.cache.set(text, embedding);\n results[index] = embedding;\n } finally {\n semaphore.release();\n }\n }));\n }\n\n return results;\n }\n\n /**\n * Find similar texts using optimized cosine similarity\n */\n async findSimilar(\n query: string,\n candidates: string[],\n topK: number = 5\n ): Promise<Array<{ text: string; score: number; index: number }>> {\n const queryEmb = await this.embed(query);\n const candidateEmbs = await this.embedBatch(candidates);\n\n const scores = candidateEmbs.map((emb, index) => ({\n text: candidates[index],\n score: cosineSimilarity(queryEmb, emb),\n index\n }));\n\n return scores\n .sort((a, b) => b.score - a.score)\n .slice(0, topK);\n }\n\n /**\n * Get cache statistics\n */\n getCacheStats(): { size: number; maxSize: number } {\n return {\n size: this.cache.size,\n maxSize: this.config.cacheSize\n };\n }\n\n /**\n * Clear the embedding cache\n */\n clearCache(): void {\n this.cache.clear();\n }\n\n /**\n * Check if initialized\n */\n isInitialized(): boolean {\n return this.initialized;\n }\n}\n\n// ============================================================================\n// Singleton Instance\n// ============================================================================\n\nlet defaultEmbedder: OptimizedEmbedder | null = null;\n\nexport function getOptimizedEmbedder(config?: Partial<EmbedderConfig>): OptimizedEmbedder {\n if (!defaultEmbedder) {\n defaultEmbedder = new OptimizedEmbedder(config);\n }\n return defaultEmbedder;\n}\n\n// ============================================================================\n// CLI Integration\n// ============================================================================\n\nexport async function initEmbeddings(modelId?: string): Promise<void> {\n const id = modelId || DEFAULT_CONFIG.modelId;\n console.log(`Initializing embeddings with model: ${id}`);\n\n await downloadModel(id, DEFAULT_CONFIG.modelDir, (progress) => {\n process.stdout.write(`\\r Downloading: ${progress.percent.toFixed(1)}% (${(progress.bytesDownloaded / 1024 / 1024).toFixed(1)}MB)`);\n });\n console.log('\\n ✓ Model downloaded');\n\n const embedder = getOptimizedEmbedder({ modelId: id });\n await embedder.init();\n console.log(' ✓ Embedder initialized');\n\n // Quick validation\n const testEmb = await embedder.embed('test');\n console.log(` ✓ Validation: ${testEmb.length}d embedding, norm=${Math.sqrt(testEmb.reduce((s, v) => s + v * v, 0)).toFixed(4)}`);\n}\n"]}
1
+ {"version":3,"file":"optimized-embedder.js","sourceRoot":"","sources":["../../src/embeddings/optimized-embedder.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Optimized Embedder for Agentic-Flow\n *\n * Uses ruvector's AdaptiveEmbedder optimizations:\n * - Float32Array with flattened matrices\n * - 256-entry LRU cache with FNV-1a hash\n * - SIMD-friendly loop unrolling (4x)\n * - Pre-allocated buffers (no GC pressure)\n *\n * Downloads ONNX models at init for offline use.\n */\n\nimport { existsSync, mkdirSync, writeFileSync, readFileSync } from 'fs';\nimport { join, dirname, resolve, normalize } from 'path';\nimport { homedir } from 'os';\nimport { createHash } from 'crypto';\n\n// ============================================================================\n// Security Constants\n// ============================================================================\n\nconst MAX_TEXT_LENGTH = 10000; // 10KB limit per text\nconst MAX_BATCH_SIZE = 100; // Maximum batch size\nconst VALID_MODEL_ID_PATTERN = /^[a-zA-Z0-9._-]+$/;\n\n// ============================================================================\n// Configuration\n// ============================================================================\n\nexport interface EmbedderConfig {\n modelId: string;\n dimension: number;\n cacheSize: number;\n modelDir: string;\n autoDownload: boolean;\n}\n\nexport const DEFAULT_CONFIG: EmbedderConfig = {\n modelId: 'all-MiniLM-L6-v2',\n dimension: 384,\n cacheSize: 256,\n modelDir: join(homedir(), '.agentic-flow', 'models'),\n autoDownload: true\n};\n\n// Model registry with download URLs and integrity checksums\nconst MODEL_REGISTRY: Record<string, {\n url: string;\n dimension: number;\n size: string;\n quantized?: boolean;\n sha256?: string; // Optional integrity checksum\n}> = {\n 'all-MiniLM-L6-v2': {\n url: 'https://huggingface.co/Xenova/all-MiniLM-L6-v2/resolve/main/onnx/model_quantized.onnx',\n dimension: 384,\n size: '23MB',\n quantized: true\n // sha256: 'to-be-computed-on-first-download'\n },\n 'all-MiniLM-L6-v2-full': {\n url: 'https://huggingface.co/Xenova/all-MiniLM-L6-v2/resolve/main/onnx/model.onnx',\n dimension: 384,\n size: '91MB'\n },\n 'bge-small-en-v1.5': {\n url: 'https://huggingface.co/Xenova/bge-small-en-v1.5/resolve/main/onnx/model_quantized.onnx',\n dimension: 384,\n size: '33MB',\n quantized: true\n },\n 'gte-small': {\n url: 'https://huggingface.co/Xenova/gte-small/resolve/main/onnx/model_quantized.onnx',\n dimension: 384,\n size: '33MB',\n quantized: true\n }\n};\n\n// ============================================================================\n// Security Validation Functions\n// ============================================================================\n\n/**\n * Validate model ID format and existence in registry\n * Prevents path traversal attacks\n */\nfunction validateModelId(modelId: string): void {\n if (!modelId || typeof modelId !== 'string') {\n throw new Error('Model ID must be a non-empty string');\n }\n if (!VALID_MODEL_ID_PATTERN.test(modelId)) {\n throw new Error(`Invalid model ID format: ${modelId}. Only alphanumeric, dots, hyphens, and underscores allowed.`);\n }\n if (!(modelId in MODEL_REGISTRY)) {\n throw new Error(`Unknown model: ${modelId}. Available: ${Object.keys(MODEL_REGISTRY).join(', ')}`);\n }\n}\n\n/**\n * Validate text input length\n * Prevents memory exhaustion attacks\n */\nfunction validateTextInput(text: string): void {\n if (!text || typeof text !== 'string') {\n throw new Error('Text input must be a non-empty string');\n }\n if (text.length > MAX_TEXT_LENGTH) {\n throw new Error(`Text exceeds maximum length of ${MAX_TEXT_LENGTH} characters`);\n }\n}\n\n/**\n * Validate batch size\n * Prevents CPU exhaustion attacks\n */\nfunction validateBatchSize(texts: string[]): void {\n if (!Array.isArray(texts)) {\n throw new Error('Batch input must be an array');\n }\n if (texts.length > MAX_BATCH_SIZE) {\n throw new Error(`Batch size ${texts.length} exceeds maximum of ${MAX_BATCH_SIZE}`);\n }\n}\n\n/**\n * Validate target directory is safe\n * Prevents writing outside intended directories\n */\nfunction validateTargetDir(targetDir: string, modelId: string): string {\n const normalizedDir = normalize(resolve(targetDir));\n const modelPath = join(normalizedDir, `${modelId}.onnx`);\n const resolvedPath = normalize(resolve(modelPath));\n\n // Ensure the resolved path starts with the target directory\n if (!resolvedPath.startsWith(normalizedDir)) {\n throw new Error('Path traversal detected: model path escapes target directory');\n }\n\n return resolvedPath;\n}\n\n/**\n * Compute SHA256 hash of buffer\n */\nfunction computeSha256(buffer: Uint8Array): string {\n return createHash('sha256').update(buffer).digest('hex');\n}\n\n// ============================================================================\n// O(1) LRU Cache with Doubly-Linked List (10-50x faster than array-based)\n// ============================================================================\n\ninterface CacheNode {\n key: string;\n hash: number;\n value: Float32Array;\n prev: CacheNode | null;\n next: CacheNode | null;\n}\n\nclass EmbeddingCache {\n private cache: Map<number, CacheNode> = new Map();\n private head: CacheNode | null = null; // Most recently used\n private tail: CacheNode | null = null; // Least recently used\n private maxSize: number;\n private hits = 0;\n private misses = 0;\n\n constructor(maxSize: number = 256) {\n this.maxSize = maxSize;\n }\n\n // FNV-1a hash for fast key generation\n private hash(key: string): number {\n let hash = 2166136261;\n for (let i = 0; i < key.length; i++) {\n hash ^= key.charCodeAt(i);\n hash = (hash * 16777619) >>> 0;\n }\n return hash;\n }\n\n // O(1) - Move node to head (most recently used)\n private moveToHead(node: CacheNode): void {\n if (node === this.head) return;\n\n // Remove from current position\n if (node.prev) node.prev.next = node.next;\n if (node.next) node.next.prev = node.prev;\n if (node === this.tail) this.tail = node.prev;\n\n // Move to head\n node.prev = null;\n node.next = this.head;\n if (this.head) this.head.prev = node;\n this.head = node;\n if (!this.tail) this.tail = node;\n }\n\n // O(1) - Remove tail node (least recently used)\n private removeTail(): void {\n if (!this.tail) return;\n\n this.cache.delete(this.tail.hash);\n\n if (this.tail.prev) {\n this.tail.prev.next = null;\n this.tail = this.tail.prev;\n } else {\n this.head = this.tail = null;\n }\n }\n\n // O(1) - Get cached value\n get(key: string): Float32Array | undefined {\n const h = this.hash(key);\n const node = this.cache.get(h);\n\n if (node && node.key === key) {\n this.hits++;\n this.moveToHead(node);\n return node.value;\n }\n\n this.misses++;\n return undefined;\n }\n\n // O(1) - Set cached value\n set(key: string, value: Float32Array): void {\n const h = this.hash(key);\n const existing = this.cache.get(h);\n\n if (existing && existing.key === key) {\n // Update existing node\n existing.value = value;\n this.moveToHead(existing);\n return;\n }\n\n // Handle hash collision - evict old entry\n if (existing) {\n // Remove the colliding entry from the linked list\n if (existing.prev) existing.prev.next = existing.next;\n if (existing.next) existing.next.prev = existing.prev;\n if (existing === this.head) this.head = existing.next;\n if (existing === this.tail) this.tail = existing.prev;\n this.cache.delete(h);\n }\n\n // Evict LRU if at capacity\n if (this.cache.size >= this.maxSize) {\n this.removeTail();\n }\n\n // Create new node at head\n const node: CacheNode = {\n key,\n hash: h,\n value,\n prev: null,\n next: this.head\n };\n\n if (this.head) this.head.prev = node;\n this.head = node;\n if (!this.tail) this.tail = node;\n\n this.cache.set(h, node);\n }\n\n get size(): number {\n return this.cache.size;\n }\n\n clear(): void {\n this.cache.clear();\n this.head = this.tail = null;\n this.hits = this.misses = 0;\n }\n\n stats(): { size: number; maxSize: number; hitRate: number } {\n const total = this.hits + this.misses;\n return {\n size: this.cache.size,\n maxSize: this.maxSize,\n hitRate: total > 0 ? this.hits / total : 0\n };\n }\n}\n\n// ============================================================================\n// Semaphore for Concurrency Control (enables parallel batch processing)\n// ============================================================================\n\nclass Semaphore {\n private available: number;\n private queue: (() => void)[] = [];\n\n constructor(count: number) {\n this.available = count;\n }\n\n async acquire(): Promise<void> {\n if (this.available > 0) {\n this.available--;\n return;\n }\n return new Promise(resolve => this.queue.push(resolve));\n }\n\n release(): void {\n if (this.queue.length > 0) {\n const next = this.queue.shift()!;\n next();\n } else {\n this.available++;\n }\n }\n}\n\n// ============================================================================\n// Optimized Vector Operations (8x unrolling, separate accumulators for ILP)\n// ============================================================================\n\n/**\n * Optimized cosine similarity with 8x loop unrolling and separate accumulators\n * ~3-4x faster than naive implementation due to instruction-level parallelism\n */\nexport function cosineSimilarity(a: Float32Array, b: Float32Array): number {\n const len = a.length;\n\n // Use 4 separate accumulators to maximize instruction-level parallelism\n let dot0 = 0, dot1 = 0, dot2 = 0, dot3 = 0;\n let normA0 = 0, normA1 = 0, normA2 = 0, normA3 = 0;\n let normB0 = 0, normB1 = 0, normB2 = 0, normB3 = 0;\n\n // Process 8 elements at a time\n const unrolledLen = len - (len % 8);\n let i = 0;\n\n for (; i < unrolledLen; i += 8) {\n // Load 8 elements from each array\n const a0 = a[i], a1 = a[i+1], a2 = a[i+2], a3 = a[i+3];\n const a4 = a[i+4], a5 = a[i+5], a6 = a[i+6], a7 = a[i+7];\n const b0 = b[i], b1 = b[i+1], b2 = b[i+2], b3 = b[i+3];\n const b4 = b[i+4], b5 = b[i+5], b6 = b[i+6], b7 = b[i+7];\n\n // Accumulate dot products (pairs to separate accumulators)\n dot0 += a0*b0 + a4*b4;\n dot1 += a1*b1 + a5*b5;\n dot2 += a2*b2 + a6*b6;\n dot3 += a3*b3 + a7*b7;\n\n // Accumulate norm A\n normA0 += a0*a0 + a4*a4;\n normA1 += a1*a1 + a5*a5;\n normA2 += a2*a2 + a6*a6;\n normA3 += a3*a3 + a7*a7;\n\n // Accumulate norm B\n normB0 += b0*b0 + b4*b4;\n normB1 += b1*b1 + b5*b5;\n normB2 += b2*b2 + b6*b6;\n normB3 += b3*b3 + b7*b7;\n }\n\n // Combine accumulators\n let dot = dot0 + dot1 + dot2 + dot3;\n let normA = normA0 + normA1 + normA2 + normA3;\n let normB = normB0 + normB1 + normB2 + normB3;\n\n // Handle remainder\n for (; i < len; i++) {\n const ai = a[i], bi = b[i];\n dot += ai * bi;\n normA += ai * ai;\n normB += bi * bi;\n }\n\n // Single sqrt with product (faster than two separate sqrts)\n const denom = Math.sqrt(normA * normB);\n return denom > 0 ? dot / denom : 0;\n}\n\n/**\n * Optimized euclidean distance with loop unrolling\n */\nexport function euclideanDistance(a: Float32Array, b: Float32Array): number {\n const len = a.length;\n let sum = 0;\n\n const unrolledLen = len - (len % 4);\n let i = 0;\n\n for (; i < unrolledLen; i += 4) {\n const d0 = a[i] - b[i];\n const d1 = a[i+1] - b[i+1];\n const d2 = a[i+2] - b[i+2];\n const d3 = a[i+3] - b[i+3];\n sum += d0 * d0 + d1 * d1 + d2 * d2 + d3 * d3;\n }\n\n for (; i < len; i++) {\n const d = a[i] - b[i];\n sum += d * d;\n }\n\n return Math.sqrt(sum);\n}\n\n/**\n * Normalize vector in-place (optimized)\n */\nexport function normalizeVector(v: Float32Array): Float32Array {\n let norm = 0;\n const len = v.length;\n\n // Compute norm with unrolling\n const unrolledLen = len - (len % 4);\n let i = 0;\n\n for (; i < unrolledLen; i += 4) {\n norm += v[i] * v[i] + v[i+1] * v[i+1] + v[i+2] * v[i+2] + v[i+3] * v[i+3];\n }\n for (; i < len; i++) {\n norm += v[i] * v[i];\n }\n\n norm = Math.sqrt(norm);\n\n if (norm > 0) {\n const invNorm = 1 / norm;\n for (let j = 0; j < len; j++) {\n v[j] *= invNorm;\n }\n }\n\n return v;\n}\n\n// ============================================================================\n// Model Downloader\n// ============================================================================\n\nexport interface DownloadProgress {\n modelId: string;\n bytesDownloaded: number;\n totalBytes: number;\n percent: number;\n}\n\nexport async function downloadModel(\n modelId: string,\n targetDir: string,\n onProgress?: (progress: DownloadProgress) => void\n): Promise<string> {\n // Security: Validate model ID before any file operations\n validateModelId(modelId);\n\n const modelInfo = MODEL_REGISTRY[modelId];\n\n // Security: Validate target path to prevent path traversal\n const modelPath = validateTargetDir(targetDir, modelId);\n\n // Check if already downloaded\n if (existsSync(modelPath)) {\n console.log(`Model ${modelId} already exists at ${modelPath}`);\n return modelPath;\n }\n\n // Create directory with restricted permissions\n mkdirSync(targetDir, { recursive: true, mode: 0o700 });\n\n console.log(`Downloading ${modelId} (${modelInfo.size})...`);\n\n try {\n // Security: Enforce HTTPS for all model downloads\n if (!modelInfo.url.startsWith('https://')) {\n throw new Error('Only HTTPS URLs are allowed for model downloads');\n }\n\n const response = await fetch(modelInfo.url);\n if (!response.ok) {\n throw new Error(`Failed to download: ${response.statusText}`);\n }\n\n const totalBytes = parseInt(response.headers.get('content-length') || '0', 10);\n const reader = response.body?.getReader();\n\n if (!reader) {\n throw new Error('No response body');\n }\n\n const chunks: Uint8Array[] = [];\n let bytesDownloaded = 0;\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n chunks.push(value);\n bytesDownloaded += value.length;\n\n if (onProgress) {\n onProgress({\n modelId,\n bytesDownloaded,\n totalBytes,\n percent: totalBytes > 0 ? (bytesDownloaded / totalBytes) * 100 : 0\n });\n }\n }\n\n // Concatenate chunks\n const totalLength = chunks.reduce((acc, chunk) => acc + chunk.length, 0);\n const buffer = new Uint8Array(totalLength);\n let offset = 0;\n for (const chunk of chunks) {\n buffer.set(chunk, offset);\n offset += chunk.length;\n }\n\n // Security: Verify integrity if checksum is available\n const actualHash = computeSha256(buffer);\n if (modelInfo.sha256 && actualHash !== modelInfo.sha256) {\n throw new Error(\n `Integrity check failed for ${modelId}. ` +\n `Expected: ${modelInfo.sha256}, Got: ${actualHash}. ` +\n 'The downloaded model may be corrupted or tampered with.'\n );\n }\n\n // Write to file with restricted permissions\n writeFileSync(modelPath, buffer, { mode: 0o600 });\n console.log(`Downloaded ${modelId} to ${modelPath}`);\n\n // Save metadata including computed hash for future verification\n const metaPath = join(targetDir, `${modelId}.meta.json`);\n writeFileSync(metaPath, JSON.stringify({\n modelId,\n dimension: modelInfo.dimension,\n quantized: modelInfo.quantized || false,\n downloadedAt: new Date().toISOString(),\n size: totalLength,\n sha256: actualHash // Store hash for future integrity checks\n }, null, 2), { mode: 0o600 });\n\n return modelPath;\n } catch (error) {\n throw new Error(`Failed to download ${modelId}: ${error instanceof Error ? error.message : String(error)}`);\n }\n}\n\nexport function listAvailableModels(): Array<{\n id: string;\n dimension: number;\n size: string;\n quantized: boolean;\n downloaded: boolean;\n}> {\n const modelDir = DEFAULT_CONFIG.modelDir;\n\n return Object.entries(MODEL_REGISTRY).map(([id, info]) => ({\n id,\n dimension: info.dimension,\n size: info.size,\n quantized: info.quantized || false,\n downloaded: existsSync(join(modelDir, `${id}.onnx`))\n }));\n}\n\n// ============================================================================\n// Optimized Embedder Class\n// ============================================================================\n\nexport class OptimizedEmbedder {\n private config: EmbedderConfig;\n private cache: EmbeddingCache;\n private onnxSession: any = null;\n private tokenizer: any = null;\n private initialized = false;\n private initPromise: Promise<void> | null = null;\n\n // Pre-allocated buffers for reduced GC pressure\n private outputBuffer: Float32Array | null = null;\n\n // Pre-allocated tensor buffers (max 512 tokens)\n private static readonly MAX_TOKENS = 512;\n private inputIdsBuffer: BigInt64Array = new BigInt64Array(OptimizedEmbedder.MAX_TOKENS);\n private attentionMaskBuffer: BigInt64Array = new BigInt64Array(OptimizedEmbedder.MAX_TOKENS);\n private tokenTypeIdsBuffer: BigInt64Array = new BigInt64Array(OptimizedEmbedder.MAX_TOKENS);\n\n constructor(config: Partial<EmbedderConfig> = {}) {\n this.config = { ...DEFAULT_CONFIG, ...config };\n this.cache = new EmbeddingCache(this.config.cacheSize);\n }\n\n /**\n * Initialize the embedder (download model if needed)\n */\n async init(): Promise<void> {\n if (this.initialized) return;\n if (this.initPromise) return this.initPromise;\n\n this.initPromise = this._init();\n await this.initPromise;\n this.initialized = true;\n }\n\n private async _init(): Promise<void> {\n const modelPath = join(this.config.modelDir, `${this.config.modelId}.onnx`);\n\n // Download if needed\n if (this.config.autoDownload && !existsSync(modelPath)) {\n await downloadModel(this.config.modelId, this.config.modelDir, (progress) => {\n process.stdout.write(`\\rDownloading ${this.config.modelId}: ${progress.percent.toFixed(1)}%`);\n });\n console.log('');\n }\n\n if (!existsSync(modelPath)) {\n throw new Error(`Model not found: ${modelPath}. Run 'agentic-flow embeddings init' to download.`);\n }\n\n // Load ONNX Runtime\n try {\n const ort = await import('onnxruntime-node');\n this.onnxSession = await ort.InferenceSession.create(modelPath, {\n executionProviders: ['cpu'],\n graphOptimizationLevel: 'all'\n });\n } catch (error) {\n // Fallback to transformers.js\n console.warn('ONNX Runtime not available, using transformers.js fallback');\n const { pipeline } = await import('@huggingface/transformers');\n this.tokenizer = await pipeline('feature-extraction', `Xenova/${this.config.modelId}`);\n }\n\n // Pre-allocate output buffer\n this.outputBuffer = new Float32Array(this.config.dimension);\n }\n\n /**\n * Embed a single text (with caching)\n */\n async embed(text: string): Promise<Float32Array> {\n // Security: Validate input before processing\n validateTextInput(text);\n\n await this.init();\n\n // Check cache\n const cached = this.cache.get(text);\n if (cached) {\n return cached;\n }\n\n let embedding: Float32Array;\n\n if (this.onnxSession) {\n embedding = await this.embedWithOnnx(text);\n } else if (this.tokenizer) {\n embedding = await this.embedWithTransformers(text);\n } else {\n throw new Error('No embedding backend available');\n }\n\n // Normalize\n normalizeVector(embedding);\n\n // Cache\n this.cache.set(text, embedding);\n\n return embedding;\n }\n\n private async embedWithOnnx(text: string): Promise<Float32Array> {\n // Simple tokenization (for MiniLM models)\n const tokens = this.simpleTokenize(text);\n const seqLen = Math.min(tokens.length, OptimizedEmbedder.MAX_TOKENS);\n\n // Reuse pre-allocated buffers (50-70% less allocation overhead)\n for (let i = 0; i < seqLen; i++) {\n this.inputIdsBuffer[i] = BigInt(tokens[i]);\n this.attentionMaskBuffer[i] = 1n;\n this.tokenTypeIdsBuffer[i] = 0n;\n }\n\n const ort = await import('onnxruntime-node');\n const TensorClass = (ort as any).Tensor;\n\n // Create tensors with views into pre-allocated buffers\n const inputIds = new TensorClass(\n 'int64',\n this.inputIdsBuffer.subarray(0, seqLen),\n [1, seqLen]\n );\n const attentionMask = new TensorClass(\n 'int64',\n this.attentionMaskBuffer.subarray(0, seqLen),\n [1, seqLen]\n );\n const tokenTypeIds = new TensorClass(\n 'int64',\n this.tokenTypeIdsBuffer.subarray(0, seqLen),\n [1, seqLen]\n );\n\n const feeds = {\n input_ids: inputIds,\n attention_mask: attentionMask,\n token_type_ids: tokenTypeIds\n };\n\n const results = await this.onnxSession.run(feeds);\n const output = results['last_hidden_state'] || results['sentence_embedding'] || Object.values(results)[0];\n\n // Mean pooling with 4x unrolling\n const data = output.data as Float32Array;\n const hiddenSize = this.config.dimension;\n\n const pooled = new Float32Array(hiddenSize);\n const unrolledHidden = hiddenSize - (hiddenSize % 4);\n\n for (let i = 0; i < seqLen; i++) {\n const offset = i * hiddenSize;\n let j = 0;\n\n // 4x unrolled inner loop\n for (; j < unrolledHidden; j += 4) {\n pooled[j] += data[offset + j];\n pooled[j+1] += data[offset + j+1];\n pooled[j+2] += data[offset + j+2];\n pooled[j+3] += data[offset + j+3];\n }\n\n // Remainder\n for (; j < hiddenSize; j++) {\n pooled[j] += data[offset + j];\n }\n }\n\n // Normalize by sequence length\n const invSeqLen = 1 / seqLen;\n for (let j = 0; j < hiddenSize; j++) {\n pooled[j] *= invSeqLen;\n }\n\n return pooled;\n }\n\n private simpleTokenize(text: string): number[] {\n // Simple word-piece tokenization approximation\n // In production, use proper tokenizer\n const words = text.toLowerCase().split(/\\s+/).slice(0, 128);\n const tokens: number[] = [101]; // [CLS]\n\n for (const word of words) {\n // Simple hash to token ID\n let hash = 0;\n for (let i = 0; i < word.length; i++) {\n hash = ((hash << 5) - hash + word.charCodeAt(i)) | 0;\n }\n tokens.push(Math.abs(hash) % 30000 + 1000);\n }\n\n tokens.push(102); // [SEP]\n return tokens;\n }\n\n private async embedWithTransformers(text: string): Promise<Float32Array> {\n const result = await this.tokenizer(text, { pooling: 'mean', normalize: true });\n return new Float32Array(result.data);\n }\n\n /**\n * Embed multiple texts in batch with parallel processing\n * 3-4x faster than sequential processing for large batches\n */\n async embedBatch(texts: string[], concurrency: number = 4): Promise<Float32Array[]> {\n // Security: Validate batch size\n validateBatchSize(texts);\n\n // Security: Validate each text input\n for (const text of texts) {\n validateTextInput(text);\n }\n\n await this.init();\n\n const results: Float32Array[] = new Array(texts.length);\n const toEmbed: { index: number; text: string }[] = [];\n\n // Check cache first (O(1) per item with new LRU cache)\n for (let i = 0; i < texts.length; i++) {\n const cached = this.cache.get(texts[i]);\n if (cached) {\n results[i] = cached;\n } else {\n toEmbed.push({ index: i, text: texts[i] });\n }\n }\n\n // Parallel processing for uncached items\n if (toEmbed.length > 0) {\n const semaphore = new Semaphore(Math.min(concurrency, toEmbed.length));\n\n await Promise.all(toEmbed.map(async ({ index, text }) => {\n await semaphore.acquire();\n try {\n // Direct embedding (skip validation since already done)\n let embedding: Float32Array;\n\n if (this.onnxSession) {\n embedding = await this.embedWithOnnx(text);\n } else if (this.tokenizer) {\n embedding = await this.embedWithTransformers(text);\n } else {\n throw new Error('No embedding backend available');\n }\n\n normalizeVector(embedding);\n this.cache.set(text, embedding);\n results[index] = embedding;\n } finally {\n semaphore.release();\n }\n }));\n }\n\n return results;\n }\n\n /**\n * Find similar texts using optimized cosine similarity\n */\n async findSimilar(\n query: string,\n candidates: string[],\n topK: number = 5\n ): Promise<Array<{ text: string; score: number; index: number }>> {\n const queryEmb = await this.embed(query);\n const candidateEmbs = await this.embedBatch(candidates);\n\n const scores = candidateEmbs.map((emb, index) => ({\n text: candidates[index],\n score: cosineSimilarity(queryEmb, emb),\n index\n }));\n\n return scores\n .sort((a, b) => b.score - a.score)\n .slice(0, topK);\n }\n\n /**\n * Get cache statistics\n */\n getCacheStats(): { size: number; maxSize: number } {\n return {\n size: this.cache.size,\n maxSize: this.config.cacheSize\n };\n }\n\n /**\n * Clear the embedding cache\n */\n clearCache(): void {\n this.cache.clear();\n }\n\n /**\n * Check if initialized\n */\n isInitialized(): boolean {\n return this.initialized;\n }\n}\n\n// ============================================================================\n// Singleton Instance\n// ============================================================================\n\nlet defaultEmbedder: OptimizedEmbedder | null = null;\n\nexport function getOptimizedEmbedder(config?: Partial<EmbedderConfig>): OptimizedEmbedder {\n if (!defaultEmbedder) {\n defaultEmbedder = new OptimizedEmbedder(config);\n }\n return defaultEmbedder;\n}\n\n// ============================================================================\n// CLI Integration\n// ============================================================================\n\nexport async function initEmbeddings(modelId?: string): Promise<void> {\n const id = modelId || DEFAULT_CONFIG.modelId;\n console.log(`Initializing embeddings with model: ${id}`);\n\n await downloadModel(id, DEFAULT_CONFIG.modelDir, (progress) => {\n process.stdout.write(`\\r Downloading: ${progress.percent.toFixed(1)}% (${(progress.bytesDownloaded / 1024 / 1024).toFixed(1)}MB)`);\n });\n console.log('\\n ✓ Model downloaded');\n\n const embedder = getOptimizedEmbedder({ modelId: id });\n await embedder.init();\n console.log(' ✓ Embedder initialized');\n\n // Quick validation\n const testEmb = await embedder.embed('test');\n console.log(` ✓ Validation: ${testEmb.length}d embedding, norm=${Math.sqrt(testEmb.reduce((s, v) => s + v * v, 0)).toFixed(4)}`);\n}\n"]}
@@ -0,0 +1,85 @@
1
+ export interface BenchmarkAnchor {
2
+ version: 1;
3
+ project: string;
4
+ corpusHash: string;
5
+ embeddingSpaceHash: string;
6
+ indexTopologyHash: string;
7
+ evaluatorHash: string;
8
+ }
9
+ export interface PromotionMetrics {
10
+ primary: number;
11
+ noopRate: number;
12
+ costPerWin: number;
13
+ regressed?: boolean;
14
+ }
15
+ export interface EvaluationReceipt {
16
+ version: 1;
17
+ experimentRevision: string;
18
+ candidateCommit: string;
19
+ candidateHash: string;
20
+ baselineGeneration: string;
21
+ anchor: BenchmarkAnchor;
22
+ anchorHash: string;
23
+ gateFingerprint: string;
24
+ baseline: PromotionMetrics;
25
+ candidate: PromotionMetrics;
26
+ anchorMetric?: {
27
+ baseline: number;
28
+ candidate: number;
29
+ };
30
+ createdAt: string;
31
+ }
32
+ export interface PromotionProposal {
33
+ version: 1;
34
+ receipt: EvaluationReceipt;
35
+ receiptHash: string;
36
+ promote: boolean;
37
+ reasons: string[];
38
+ }
39
+ export interface PromotionAuthorization {
40
+ version: 1;
41
+ receiptHash: string;
42
+ candidateCommit: string;
43
+ expiresAt: string;
44
+ signer: string;
45
+ signature: string;
46
+ publicKey: string;
47
+ }
48
+ export interface AtomicPromotionStore {
49
+ compareAndSwap(expectedGeneration: string, candidateHash: string, evidenceHash: string): Promise<{
50
+ promoted: boolean;
51
+ generation: string;
52
+ }>;
53
+ }
54
+ export interface PromotionRecord {
55
+ version: 1;
56
+ receiptHash: string;
57
+ candidateCommit: string;
58
+ candidateHash: string;
59
+ previousGeneration: string;
60
+ generation: string;
61
+ signer: string;
62
+ promotedAt: string;
63
+ }
64
+ export declare function governanceHash(value: unknown): string;
65
+ export declare function createBenchmarkAnchor(input: Omit<BenchmarkAnchor, 'version'>): BenchmarkAnchor;
66
+ export declare function createEvaluationReceipt(input: Omit<EvaluationReceipt, 'version' | 'anchorHash'>): EvaluationReceipt;
67
+ export declare function evaluateCandidate(receipt: EvaluationReceipt): Promise<PromotionProposal>;
68
+ export declare function authorizePromotion(proposal: PromotionProposal, signer: string, expiresAt: string, privateKey: string, publicKey: string): PromotionAuthorization;
69
+ export declare function verifyPromotionAuthorization(proposal: PromotionProposal, authorization: PromotionAuthorization, now?: Date): boolean;
70
+ export declare function promoteCandidate(proposal: PromotionProposal, authorization: PromotionAuthorization, store: AtomicPromotionStore, options: {
71
+ now?: Date;
72
+ trustedPublicKeys: ReadonlySet<string>;
73
+ }): Promise<PromotionRecord>;
74
+ export declare function verifyGovernanceReplay(bundle: {
75
+ proposal: PromotionProposal;
76
+ authorization: PromotionAuthorization;
77
+ promotion?: PromotionRecord;
78
+ }, options: {
79
+ now?: Date;
80
+ trustedPublicKeys: ReadonlySet<string>;
81
+ }): {
82
+ valid: boolean;
83
+ reasons: string[];
84
+ };
85
+ //# sourceMappingURL=flywheel-governance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flywheel-governance.d.ts","sourceRoot":"","sources":["../../src/harness/flywheel-governance.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,123 @@
1
+ /**
2
+ * Trusted evaluation/promotion boundary (ADR-077).
3
+ * Candidate jobs create evidence; only a trusted signer plus an atomic CAS can promote.
4
+ */
5
+ import { createHash, sign as cryptoSign, verify as cryptoVerify } from 'node:crypto';
6
+ import { evaluateMetaHarnessPromotion } from './metaharness.js';
7
+ function canonical(value) {
8
+ if (Array.isArray(value))
9
+ return `[${value.map(canonical).join(',')}]`;
10
+ if (value && typeof value === 'object') {
11
+ const object = value;
12
+ return `{${Object.keys(object).sort().map((key) => `${JSON.stringify(key)}:${canonical(object[key])}`).join(',')}}`;
13
+ }
14
+ return JSON.stringify(value);
15
+ }
16
+ export function governanceHash(value) {
17
+ return createHash('sha256').update(canonical(value)).digest('hex');
18
+ }
19
+ function assertDigest(name, digest) {
20
+ if (!/^[a-f0-9]{64}$/.test(digest))
21
+ throw new TypeError(`${name} must be a lowercase sha256 digest`);
22
+ }
23
+ export function createBenchmarkAnchor(input) {
24
+ for (const field of ['corpusHash', 'embeddingSpaceHash', 'indexTopologyHash', 'evaluatorHash']) {
25
+ assertDigest(field, input[field]);
26
+ }
27
+ if (!input.project.trim())
28
+ throw new TypeError('project is required');
29
+ return { version: 1, ...input };
30
+ }
31
+ export function createEvaluationReceipt(input) {
32
+ assertDigest('candidateHash', input.candidateHash);
33
+ assertDigest('gateFingerprint', input.gateFingerprint);
34
+ if (!input.experimentRevision.trim() || !input.candidateCommit.trim() || !input.baselineGeneration.trim()) {
35
+ throw new TypeError('experimentRevision, candidateCommit, and baselineGeneration are required');
36
+ }
37
+ if (!Number.isFinite(Date.parse(input.createdAt)))
38
+ throw new TypeError('createdAt must be an ISO timestamp');
39
+ return { version: 1, ...input, anchorHash: governanceHash(input.anchor) };
40
+ }
41
+ export async function evaluateCandidate(receipt) {
42
+ if (receipt.anchorHash !== governanceHash(receipt.anchor))
43
+ throw new Error('benchmark anchor hash mismatch');
44
+ const decision = await evaluateMetaHarnessPromotion({
45
+ baseline: receipt.baseline,
46
+ candidate: receipt.candidate,
47
+ ...(receipt.anchorMetric ? { anchor: receipt.anchorMetric } : {}),
48
+ });
49
+ return {
50
+ version: 1,
51
+ receipt,
52
+ receiptHash: governanceHash(receipt),
53
+ promote: decision.promote,
54
+ reasons: [...decision.reasons],
55
+ };
56
+ }
57
+ function authorizationPayload(auth) {
58
+ return canonical(auth);
59
+ }
60
+ export function authorizePromotion(proposal, signer, expiresAt, privateKey, publicKey) {
61
+ if (!proposal.promote)
62
+ throw new Error('cannot authorize a rejected or inconclusive proposal');
63
+ const unsigned = {
64
+ version: 1,
65
+ receiptHash: proposal.receiptHash,
66
+ candidateCommit: proposal.receipt.candidateCommit,
67
+ expiresAt,
68
+ signer,
69
+ };
70
+ const signature = cryptoSign(null, Buffer.from(authorizationPayload(unsigned)), privateKey).toString('base64');
71
+ return { ...unsigned, signature, publicKey };
72
+ }
73
+ export function verifyPromotionAuthorization(proposal, authorization, now = new Date()) {
74
+ const expiry = Date.parse(authorization.expiresAt);
75
+ if (!proposal.promote || authorization.receiptHash !== proposal.receiptHash ||
76
+ authorization.candidateCommit !== proposal.receipt.candidateCommit ||
77
+ !Number.isFinite(expiry) || expiry <= now.getTime())
78
+ return false;
79
+ const { signature, publicKey, ...unsigned } = authorization;
80
+ try {
81
+ return cryptoVerify(null, Buffer.from(authorizationPayload(unsigned)), publicKey, Buffer.from(signature, 'base64'));
82
+ }
83
+ catch {
84
+ return false;
85
+ }
86
+ }
87
+ export async function promoteCandidate(proposal, authorization, store, options) {
88
+ const now = options.now ?? new Date();
89
+ if (!options.trustedPublicKeys.has(authorization.publicKey))
90
+ throw new Error('untrusted promotion signer');
91
+ if (!verifyPromotionAuthorization(proposal, authorization, now))
92
+ throw new Error('invalid promotion authorization');
93
+ if (proposal.receiptHash !== governanceHash(proposal.receipt))
94
+ throw new Error('evaluation receipt hash mismatch');
95
+ const result = await store.compareAndSwap(proposal.receipt.baselineGeneration, proposal.receipt.candidateHash, proposal.receiptHash);
96
+ if (!result.promoted)
97
+ throw new Error('promotion race: baseline generation changed');
98
+ return {
99
+ version: 1,
100
+ receiptHash: proposal.receiptHash,
101
+ candidateCommit: proposal.receipt.candidateCommit,
102
+ candidateHash: proposal.receipt.candidateHash,
103
+ previousGeneration: proposal.receipt.baselineGeneration,
104
+ generation: result.generation,
105
+ signer: authorization.signer,
106
+ promotedAt: now.toISOString(),
107
+ };
108
+ }
109
+ export function verifyGovernanceReplay(bundle, options) {
110
+ const reasons = [];
111
+ if (bundle.proposal.receiptHash !== governanceHash(bundle.proposal.receipt))
112
+ reasons.push('receipt hash mismatch');
113
+ if (!options.trustedPublicKeys.has(bundle.authorization.publicKey))
114
+ reasons.push('untrusted signer');
115
+ if (!verifyPromotionAuthorization(bundle.proposal, bundle.authorization, options.now))
116
+ reasons.push('invalid authorization');
117
+ if (bundle.promotion && (bundle.promotion.receiptHash !== bundle.proposal.receiptHash ||
118
+ bundle.promotion.candidateHash !== bundle.proposal.receipt.candidateHash)) {
119
+ reasons.push('promotion lineage mismatch');
120
+ }
121
+ return { valid: reasons.length === 0, reasons };
122
+ }
123
+ //# sourceMappingURL=flywheel-governance.js.map