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.
- package/dist/.tsbuildinfo +1 -1
- package/dist/core/embedding-service.js +1 -1
- package/dist/core/embedding-service.js.map +1 -1
- package/dist/embeddings/optimized-embedder.js +1 -1
- package/dist/embeddings/optimized-embedder.js.map +1 -1
- package/dist/harness/flywheel-governance.d.ts +85 -0
- package/dist/harness/flywheel-governance.d.ts.map +1 -0
- package/dist/harness/flywheel-governance.js +123 -0
- package/dist/harness/flywheel-governance.js.map +1 -0
- package/dist/harness/metaharness.d.ts +6 -0
- package/dist/harness/metaharness.d.ts.map +1 -0
- package/dist/harness/metaharness.js +6 -0
- package/dist/harness/metaharness.js.map +1 -0
- package/dist/mcp/mcp-policy.d.ts +15 -0
- package/dist/mcp/mcp-policy.d.ts.map +1 -0
- package/dist/mcp/mcp-policy.js +36 -0
- package/dist/mcp/mcp-policy.js.map +1 -0
- package/dist/mcp/standalone-stdio.js +7 -0
- package/dist/mcp/standalone-stdio.js.map +1 -1
- package/dist/mcp/tools/harness-tools.d.ts +1 -0
- package/dist/mcp/tools/harness-tools.d.ts.map +1 -1
- package/dist/mcp/tools/harness-tools.js +13 -1
- package/dist/mcp/tools/harness-tools.js.map +1 -1
- package/dist/reasoningbank/utils/embeddings.js +2 -2
- package/dist/reasoningbank/utils/embeddings.js.map +1 -1
- package/dist/repair/darwin-repair.d.ts +13 -1
- package/dist/repair/darwin-repair.d.ts.map +1 -1
- package/dist/repair/darwin-repair.js +2 -2
- package/dist/repair/darwin-repair.js.map +1 -1
- package/dist/router/providers/onnx.js +2 -2
- package/dist/router/providers/onnx.js.map +1 -1
- package/dist/services/embedding-service.js +1 -1
- package/dist/services/embedding-service.js.map +1 -1
- package/dist/utils/model-cache.js +1 -1
- package/dist/utils/model-cache.js.map +1 -1
- package/package.json +12 -10
- package/wasm/reasoningbank/reasoningbank_wasm_bg.js +31 -31
- package/wasm/reasoningbank/reasoningbank_wasm_bg.wasm +0 -0
- package/wasm/reasoningbank/reasoningbank_wasm_bg.wasm.d.ts +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"embeddings.js","sourceRoot":"","sources":["../../../src/reasoningbank/utils/embeddings.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Embedding generation for semantic similarity\n * Uses local transformers.js - no API key required!\n */\n\nimport { pipeline, env } from '@xenova/transformers';\nimport { loadConfig } from './config.js';\n\n// Configure transformers.js to use WASM backend only (avoid ONNX runtime issues)\n// The native ONNX runtime causes \"DefaultLogger not registered\" errors in Node.js\nenv.backends.onnx.wasm.proxy = false; // Disable ONNX runtime proxy\nenv.backends.onnx.wasm.numThreads = 1; // Single thread for stability\n\nlet embeddingPipeline: any = null;\nlet initializationPromise: Promise<void> | null = null;\nconst embeddingCache = new Map<string, Float32Array>();\n// MEMORY LEAK FIX: Track TTL timers so they can be cleaned up\nconst embeddingTimers = new Map<string, NodeJS.Timeout>();\n\n/**\n * Initialize the embedding pipeline (lazy load)\n * RACE CONDITION FIX: Use promise-based initialization instead of busy-wait\n */\nasync function initializeEmbeddings(): Promise<void> {\n // Already initialized\n if (embeddingPipeline) return;\n\n // Initialization in progress - await existing promise\n if (initializationPromise) {\n return initializationPromise;\n }\n\n // Detect npx environment (known transformer initialization issues)\n const isNpxEnv = process.env.npm_lifecycle_event === 'npx' ||\n process.env.npm_execpath?.includes('npx') ||\n process.cwd().includes('/_npx/') ||\n process.cwd().includes('\\\\_npx\\\\');\n\n if (isNpxEnv && !process.env.FORCE_TRANSFORMERS) {\n console.log('[Embeddings] NPX environment detected - using hash-based embeddings');\n console.log('[Embeddings] For semantic search, install globally: npm install -g claude-flow');\n return;\n }\n\n // RACE CONDITION FIX: Create promise for concurrent callers to await\n initializationPromise = (async () => {\n console.log('[Embeddings] Initializing local embedding model (Xenova/all-MiniLM-L6-v2)...');\n console.log('[Embeddings] First run will download ~23MB model...');\n\n try {\n embeddingPipeline = await pipeline(\n 'feature-extraction',\n 'Xenova/all-MiniLM-L6-v2',\n { quantized: true } // Smaller, faster\n );\n console.log('[Embeddings] Local model ready! (384 dimensions)');\n } catch (error: any) {\n console.error('[Embeddings] Failed to initialize:', error?.message || error);\n console.warn('[Embeddings] Falling back to hash-based embeddings');\n // Reset promise so retry is possible\n initializationPromise = null;\n }\n })();\n\n return initializationPromise;\n}\n\n/**\n * Compute embedding for text using local model\n */\nexport async function computeEmbedding(text: string): Promise<Float32Array> {\n const config = loadConfig();\n\n // Check cache\n const cacheKey = `local:${text}`;\n if (embeddingCache.has(cacheKey)) {\n return embeddingCache.get(cacheKey)!;\n }\n\n let embedding: Float32Array;\n\n // Initialize if needed\n await initializeEmbeddings();\n\n if (embeddingPipeline) {\n try {\n // Use transformers.js for real embeddings\n const output = await embeddingPipeline(text, {\n pooling: 'mean',\n normalize: true\n });\n embedding = new Float32Array(output.data);\n } catch (error: any) {\n console.error('[Embeddings] Generation failed:', error?.message || error);\n embedding = hashEmbed(text, 384); // Fallback\n }\n } else {\n // Fallback to hash-based embeddings\n const dims = config?.embeddings?.dimensions || 384;\n embedding = hashEmbed(text, dims);\n }\n\n // MEMORY LEAK FIX: Clear existing timer if key exists\n const existingTimer = embeddingTimers.get(cacheKey);\n if (existingTimer) {\n clearTimeout(existingTimer);\n embeddingTimers.delete(cacheKey);\n }\n\n // Cache with LRU (limit 1000 entries)\n // PERFORMANCE FIX: Use proper LRU by tracking access order\n if (embeddingCache.size >= 1000) {\n // Find and remove oldest entry (first key in iteration order)\n const firstKey = embeddingCache.keys().next().value;\n if (firstKey) {\n embeddingCache.delete(firstKey);\n // Also clear its timer\n const timer = embeddingTimers.get(firstKey);\n if (timer) {\n clearTimeout(timer);\n embeddingTimers.delete(firstKey);\n }\n }\n }\n embeddingCache.set(cacheKey, embedding);\n\n // Set TTL for cache entry with tracked timer\n const ttl = config?.embeddings?.cache_ttl_seconds || 3600;\n const timerId = setTimeout(() => {\n embeddingCache.delete(cacheKey);\n embeddingTimers.delete(cacheKey);\n }, ttl * 1000);\n\n // MEMORY LEAK FIX: Track timer for cleanup\n embeddingTimers.set(cacheKey, timerId);\n\n return embedding;\n}\n\n/**\n * Batch compute embeddings (more efficient)\n */\nexport async function computeEmbeddingBatch(texts: string[]): Promise<Float32Array[]> {\n return Promise.all(texts.map(text => computeEmbedding(text)));\n}\n\n/**\n * Get embedding dimensions\n */\nexport function getEmbeddingDimensions(): number {\n return 384; // all-MiniLM-L6-v2 uses 384 dimensions\n}\n\n/**\n * Deterministic hash-based embedding (fallback)\n */\nfunction hashEmbed(text: string, dims: number): Float32Array {\n const hash = simpleHash(text);\n const vec = new Float32Array(dims);\n\n // Generate deterministic pseudo-random vector from hash\n for (let i = 0; i < dims; i++) {\n vec[i] = Math.sin(hash * (i + 1) * 0.01) + Math.cos(hash * i * 0.02);\n }\n\n return normalize(vec);\n}\n\n/**\n * Simple string hash function\n */\nfunction simpleHash(str: string): number {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n hash = ((hash << 5) - hash) + str.charCodeAt(i);\n hash |= 0;\n }\n return Math.abs(hash);\n}\n\n/**\n * Normalize vector to unit length\n */\nfunction normalize(vec: Float32Array): Float32Array {\n let mag = 0;\n for (let i = 0; i < vec.length; i++) {\n mag += vec[i] * vec[i];\n }\n mag = Math.sqrt(mag);\n\n if (mag === 0) return vec;\n\n for (let i = 0; i < vec.length; i++) {\n vec[i] /= mag;\n }\n return vec;\n}\n\n/**\n * Clear embedding cache\n * MEMORY LEAK FIX: Also clear all TTL timers\n */\nexport function clearEmbeddingCache(): void {\n // Clear all timers first to prevent memory leaks\n for (const timer of embeddingTimers.values()) {\n clearTimeout(timer);\n }\n embeddingTimers.clear();\n embeddingCache.clear();\n}\n"]}
|
|
1
|
+
{"version":3,"file":"embeddings.js","sourceRoot":"","sources":["../../../src/reasoningbank/utils/embeddings.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Embedding generation for semantic similarity\n * Uses local transformers.js - no API key required!\n */\n\nimport { pipeline, env } from '@huggingface/transformers';\nimport { loadConfig } from './config.js';\n\n// Configure transformers.js to use WASM backend only (avoid ONNX runtime issues)\n// The native ONNX runtime causes \"DefaultLogger not registered\" errors in Node.js\nenv.backends.onnx.wasm.proxy = false; // Disable ONNX runtime proxy\nenv.backends.onnx.wasm.numThreads = 1; // Single thread for stability\n\nlet embeddingPipeline: any = null;\nlet initializationPromise: Promise<void> | null = null;\nconst embeddingCache = new Map<string, Float32Array>();\n// MEMORY LEAK FIX: Track TTL timers so they can be cleaned up\nconst embeddingTimers = new Map<string, NodeJS.Timeout>();\n\n/**\n * Initialize the embedding pipeline (lazy load)\n * RACE CONDITION FIX: Use promise-based initialization instead of busy-wait\n */\nasync function initializeEmbeddings(): Promise<void> {\n // Already initialized\n if (embeddingPipeline) return;\n\n // Initialization in progress - await existing promise\n if (initializationPromise) {\n return initializationPromise;\n }\n\n // Detect npx environment (known transformer initialization issues)\n const isNpxEnv = process.env.npm_lifecycle_event === 'npx' ||\n process.env.npm_execpath?.includes('npx') ||\n process.cwd().includes('/_npx/') ||\n process.cwd().includes('\\\\_npx\\\\');\n\n if (isNpxEnv && !process.env.FORCE_TRANSFORMERS) {\n console.log('[Embeddings] NPX environment detected - using hash-based embeddings');\n console.log('[Embeddings] For semantic search, install globally: npm install -g claude-flow');\n return;\n }\n\n // RACE CONDITION FIX: Create promise for concurrent callers to await\n initializationPromise = (async () => {\n console.log('[Embeddings] Initializing local embedding model (Xenova/all-MiniLM-L6-v2)...');\n console.log('[Embeddings] First run will download ~23MB model...');\n\n try {\n embeddingPipeline = await pipeline(\n 'feature-extraction',\n 'Xenova/all-MiniLM-L6-v2',\n { dtype: 'q8' } // Transformers.js v3 quantized dtype\n );\n console.log('[Embeddings] Local model ready! (384 dimensions)');\n } catch (error: any) {\n console.error('[Embeddings] Failed to initialize:', error?.message || error);\n console.warn('[Embeddings] Falling back to hash-based embeddings');\n // Reset promise so retry is possible\n initializationPromise = null;\n }\n })();\n\n return initializationPromise;\n}\n\n/**\n * Compute embedding for text using local model\n */\nexport async function computeEmbedding(text: string): Promise<Float32Array> {\n const config = loadConfig();\n\n // Check cache\n const cacheKey = `local:${text}`;\n if (embeddingCache.has(cacheKey)) {\n return embeddingCache.get(cacheKey)!;\n }\n\n let embedding: Float32Array;\n\n // Initialize if needed\n await initializeEmbeddings();\n\n if (embeddingPipeline) {\n try {\n // Use transformers.js for real embeddings\n const output = await embeddingPipeline(text, {\n pooling: 'mean',\n normalize: true\n });\n embedding = new Float32Array(output.data);\n } catch (error: any) {\n console.error('[Embeddings] Generation failed:', error?.message || error);\n embedding = hashEmbed(text, 384); // Fallback\n }\n } else {\n // Fallback to hash-based embeddings\n const dims = config?.embeddings?.dimensions || 384;\n embedding = hashEmbed(text, dims);\n }\n\n // MEMORY LEAK FIX: Clear existing timer if key exists\n const existingTimer = embeddingTimers.get(cacheKey);\n if (existingTimer) {\n clearTimeout(existingTimer);\n embeddingTimers.delete(cacheKey);\n }\n\n // Cache with LRU (limit 1000 entries)\n // PERFORMANCE FIX: Use proper LRU by tracking access order\n if (embeddingCache.size >= 1000) {\n // Find and remove oldest entry (first key in iteration order)\n const firstKey = embeddingCache.keys().next().value;\n if (firstKey) {\n embeddingCache.delete(firstKey);\n // Also clear its timer\n const timer = embeddingTimers.get(firstKey);\n if (timer) {\n clearTimeout(timer);\n embeddingTimers.delete(firstKey);\n }\n }\n }\n embeddingCache.set(cacheKey, embedding);\n\n // Set TTL for cache entry with tracked timer\n const ttl = config?.embeddings?.cache_ttl_seconds || 3600;\n const timerId = setTimeout(() => {\n embeddingCache.delete(cacheKey);\n embeddingTimers.delete(cacheKey);\n }, ttl * 1000);\n\n // MEMORY LEAK FIX: Track timer for cleanup\n embeddingTimers.set(cacheKey, timerId);\n\n return embedding;\n}\n\n/**\n * Batch compute embeddings (more efficient)\n */\nexport async function computeEmbeddingBatch(texts: string[]): Promise<Float32Array[]> {\n return Promise.all(texts.map(text => computeEmbedding(text)));\n}\n\n/**\n * Get embedding dimensions\n */\nexport function getEmbeddingDimensions(): number {\n return 384; // all-MiniLM-L6-v2 uses 384 dimensions\n}\n\n/**\n * Deterministic hash-based embedding (fallback)\n */\nfunction hashEmbed(text: string, dims: number): Float32Array {\n const hash = simpleHash(text);\n const vec = new Float32Array(dims);\n\n // Generate deterministic pseudo-random vector from hash\n for (let i = 0; i < dims; i++) {\n vec[i] = Math.sin(hash * (i + 1) * 0.01) + Math.cos(hash * i * 0.02);\n }\n\n return normalize(vec);\n}\n\n/**\n * Simple string hash function\n */\nfunction simpleHash(str: string): number {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n hash = ((hash << 5) - hash) + str.charCodeAt(i);\n hash |= 0;\n }\n return Math.abs(hash);\n}\n\n/**\n * Normalize vector to unit length\n */\nfunction normalize(vec: Float32Array): Float32Array {\n let mag = 0;\n for (let i = 0; i < vec.length; i++) {\n mag += vec[i] * vec[i];\n }\n mag = Math.sqrt(mag);\n\n if (mag === 0) return vec;\n\n for (let i = 0; i < vec.length; i++) {\n vec[i] /= mag;\n }\n return vec;\n}\n\n/**\n * Clear embedding cache\n * MEMORY LEAK FIX: Also clear all TTL timers\n */\nexport function clearEmbeddingCache(): void {\n // Clear all timers first to prevent memory leaks\n for (const timer of embeddingTimers.values()) {\n clearTimeout(timer);\n }\n embeddingTimers.clear();\n embeddingCache.clear();\n}\n"]}
|
|
@@ -20,7 +20,18 @@
|
|
|
20
20
|
*
|
|
21
21
|
* @see docs/adr/ADR-074-metaharness-darwin-test-driven-repair.md
|
|
22
22
|
*/
|
|
23
|
-
|
|
23
|
+
interface ArchiveRecord {
|
|
24
|
+
score?: {
|
|
25
|
+
finalScore?: number;
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
interface EvolutionResult {
|
|
29
|
+
baseline: ArchiveRecord | null;
|
|
30
|
+
winner: ArchiveRecord | null;
|
|
31
|
+
winnerLineage: string[];
|
|
32
|
+
generations: number;
|
|
33
|
+
records: ArchiveRecord[];
|
|
34
|
+
}
|
|
24
35
|
export type SandboxMode = 'real' | 'mock' | 'agent';
|
|
25
36
|
export interface RepairOptions {
|
|
26
37
|
/** Path to the repo to repair/evolve. */
|
|
@@ -77,4 +88,5 @@ export declare class DarwinRepair {
|
|
|
77
88
|
constructor(defaults?: Partial<RepairOptions>);
|
|
78
89
|
repair(opts: RepairOptions): Promise<RepairResult>;
|
|
79
90
|
}
|
|
91
|
+
export {};
|
|
80
92
|
//# sourceMappingURL=darwin-repair.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"darwin-repair.d.ts","sourceRoot":"","sources":["../../src/repair/darwin-repair.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;
|
|
1
|
+
{"version":3,"file":"darwin-repair.d.ts","sourceRoot":"","sources":["../../src/repair/darwin-repair.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAKH,UAAU,aAAa;IACrB,KAAK,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACjC;AAED,UAAU,eAAe;IACvB,QAAQ,EAAE,aAAa,GAAG,IAAI,CAAC;IAC/B,MAAM,EAAE,aAAa,GAAG,IAAI,CAAC;IAC7B,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,aAAa,EAAE,CAAC;CAC1B;AAED,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAEpD,MAAM,WAAW,aAAa;IAC5B,yCAAyC;IACzC,QAAQ,EAAE,MAAM,CAAC;IACjB,yEAAyE;IACzE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qCAAqC;IACrC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,8DAA8D;IAC9D,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,sDAAsD;IACtD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+EAA+E;IAC/E,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,qCAAqC;IACrC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,qFAAqF;IACrF,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,iEAAiE;IACjE,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,gFAAgF;IAChF,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,YAAY;IAC3B,2DAA2D;IAC3D,QAAQ,EAAE,OAAO,CAAC;IAClB,gFAAgF;IAChF,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,iCAAiC;IACjC,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,8CAA8C;IAC9C,aAAa,EAAE,MAAM,CAAC;IACtB,kCAAkC;IAClC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,mCAAmC;IACnC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,8DAA8D;IAC9D,iBAAiB,EAAE,MAAM,CAAC;IAC1B,mEAAmE;IACnE,GAAG,EAAE,eAAe,CAAC;CACtB;AAED,8CAA8C;AAC9C,eAAO,MAAM,YAAY,EAAE,SAAS,MAAM,EAIzC,CAAC;AAMF;;;;GAIG;AACH,wBAAsB,MAAM,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,CAkCvE;AAED,8EAA8E;AAC9E,qBAAa,YAAY;IACX,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,GAAE,OAAO,CAAC,aAAa,CAAM;IAElE,MAAM,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;CAGnD"}
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
* @see docs/adr/ADR-074-metaharness-darwin-test-driven-repair.md
|
|
22
22
|
*/
|
|
23
23
|
import { resolve } from 'node:path';
|
|
24
|
-
import {
|
|
24
|
+
import { runMetaHarnessDarwin } from '../harness/metaharness.js';
|
|
25
25
|
/** Default scoring tasks for a repair run. */
|
|
26
26
|
export const REPAIR_TASKS = [
|
|
27
27
|
'run repository test suite',
|
|
@@ -50,7 +50,7 @@ export async function repair(opts) {
|
|
|
50
50
|
sandboxMode: opts.sandboxMode ?? 'real',
|
|
51
51
|
...(opts.taskTimeoutMs ? { taskTimeoutMs: opts.taskTimeoutMs } : {}),
|
|
52
52
|
};
|
|
53
|
-
const result = await
|
|
53
|
+
const result = await runMetaHarnessDarwin(config, { execute: true });
|
|
54
54
|
const baselineScore = finalScoreOf(result.baseline) ?? 0;
|
|
55
55
|
const winnerScore = finalScoreOf(result.winner);
|
|
56
56
|
const delta = (winnerScore ?? baselineScore) - baselineScore;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"darwin-repair.js","sourceRoot":"","sources":["../../src/repair/darwin-repair.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"darwin-repair.js","sourceRoot":"","sources":["../../src/repair/darwin-repair.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AA2DjE,8CAA8C;AAC9C,MAAM,CAAC,MAAM,YAAY,GAAsB;IAC7C,2BAA2B;IAC3B,iCAAiC;IACjC,qBAAqB;CACtB,CAAC;AAEF,SAAS,YAAY,CAAC,MAA4B;IAChD,OAAO,MAAM,EAAE,KAAK,EAAE,UAAU,IAAI,IAAI,CAAC;AAC3C,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,IAAmB;IAC9C,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG;QACb,QAAQ;QACR,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,cAAc,CAAC;QACpF,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,CAAC;QAClC,qBAAqB,EAAE,IAAI,CAAC,qBAAqB,IAAI,CAAC;QACtD,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC;QACvD,cAAc,EAAE,IAAI,CAAC,cAAc,IAAI,IAAI;QAC3C,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,CAAC;QAClC,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC;QACpB,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,MAAM;QACvC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACrE,CAAC;IAEF,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAoB,CAAC;IAExF,MAAM,aAAa,GAAG,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACzD,MAAM,WAAW,GAAG,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAChD,MAAM,KAAK,GAAG,CAAC,WAAW,IAAI,aAAa,CAAC,GAAG,aAAa,CAAC;IAC7D,wEAAwE;IACxE,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IAEtG,OAAO;QACL,QAAQ,EAAE,MAAM,CAAC,MAAM,IAAI,IAAI,IAAI,KAAK,GAAG,CAAC;QAC5C,QAAQ;QACR,aAAa,EAAE,MAAM,CAAC,aAAa;QACnC,aAAa;QACb,WAAW;QACX,iBAAiB,EAAE,KAAK;QACxB,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,iBAAiB,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM;QACxC,GAAG,EAAE,MAAM;KACZ,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,MAAM,OAAO,YAAY;IACM;IAA7B,YAA6B,WAAmC,EAAE;QAArC,aAAQ,GAAR,QAAQ,CAA6B;IAAG,CAAC;IAEtE,MAAM,CAAC,IAAmB;QACxB,OAAO,MAAM,CAAC,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;IAC/C,CAAC;CACF","sourcesContent":["/**\n * Darwin Repair — autonomous harness evolution / Test-Driven Repair (ADR-074).\n *\n * A typed wrapper over `@metaharness/darwin`'s `evolve()`: freeze the model and\n * evolve the harness around it (planner / context / reviewer / retry / tool /\n * memory / score policy), keeping only variants that *measurably* improve under\n * a frozen, reproducible scorer + safety gate.\n *\n * Modes (via `sandboxMode`):\n * - 'real' (default) — Test-Driven Repair: the repo's own test command is the\n * oracle, run in Darwin's shell-free, env-scrubbed sandbox.\n * - 'mock' — deterministic, surface-driven loop. No repo test, no Docker,\n * no network — used for hermetic smoke tests of the pipeline.\n * - 'agent' — runs the variant's real surface code (Node ≥ 22).\n *\n * NOTE: the headline SWE-bench-Lite TDR *product* (≈68.3% with-test) additionally\n * needs the official `swebench` Docker harness for issue checkout + grading — see\n * ADR-074 for that deployment path. This wrapper exposes the runnable `evolve()`\n * core that does not require Docker.\n *\n * @see docs/adr/ADR-074-metaharness-darwin-test-driven-repair.md\n */\n\nimport { resolve } from 'node:path';\nimport { runMetaHarnessDarwin } from '../harness/metaharness.js';\n\ninterface ArchiveRecord {\n score?: { finalScore?: number };\n}\n\ninterface EvolutionResult {\n baseline: ArchiveRecord | null;\n winner: ArchiveRecord | null;\n winnerLineage: string[];\n generations: number;\n records: ArchiveRecord[];\n}\n\nexport type SandboxMode = 'real' | 'mock' | 'agent';\n\nexport interface RepairOptions {\n /** Path to the repo to repair/evolve. */\n repoRoot: string;\n /** Work tree for Darwin artifacts. Default `<repoRoot>/.metaharness`. */\n workRoot?: string;\n /** Generations to run. Default 3. */\n generations?: number;\n /** Children produced per parent per generation. Default 4. */\n childrenPerGeneration?: number;\n /** Max variants evaluated concurrently. Default 4. */\n concurrency?: number;\n /** Minimum finalScore margin a child must beat its parent by. Default 0.05. */\n promotionDelta?: number;\n /** Deterministic seed. Default 0. */\n seed?: number;\n /** Fixed scoring tasks (the variant cannot edit these). Defaults to REPAIR_TASKS. */\n tasks?: string[];\n /** Evaluation substrate. Default 'real' (Test-Driven Repair). */\n sandboxMode?: SandboxMode;\n /** Per-variant test-command wall-clock budget (ms). Default Darwin's 120000. */\n taskTimeoutMs?: number;\n}\n\nexport interface RepairResult {\n /** True iff a child beat the baseline and was promoted. */\n improved: boolean;\n /** Winner variant id (lineage tail), or null when nothing beat the baseline. */\n winnerId: string | null;\n /** baseline → … → winner ids. */\n winnerLineage: string[];\n /** Baseline finalScore (0 if unevaluated). */\n baselineScore: number;\n /** Winner finalScore, or null. */\n winnerScore: number | null;\n /** winnerScore − baselineScore. */\n deltaOverBaseline: number;\n generations: number;\n /** Total variants in the archive (baseline + descendants). */\n variantsEvaluated: number;\n /** Full Darwin result for callers that need the archive/traces. */\n raw: EvolutionResult;\n}\n\n/** Default scoring tasks for a repair run. */\nexport const REPAIR_TASKS: readonly string[] = [\n 'run repository test suite',\n 'verify generated harness safety',\n 'check trace quality',\n];\n\nfunction finalScoreOf(record: ArchiveRecord | null): number | null {\n return record?.score?.finalScore ?? null;\n}\n\n/**\n * Run an autonomous repair/evolution pass over a repo and return a friendly\n * summary. Defaults to Test-Driven Repair ('real' sandbox): the repo's own\n * tests gate every promotion.\n */\nexport async function repair(opts: RepairOptions): Promise<RepairResult> {\n const repoRoot = resolve(opts.repoRoot);\n const config = {\n repoRoot,\n workRoot: opts.workRoot ? resolve(opts.workRoot) : resolve(repoRoot, '.metaharness'),\n generations: opts.generations ?? 3,\n childrenPerGeneration: opts.childrenPerGeneration ?? 4,\n tasks: opts.tasks ? [...opts.tasks] : [...REPAIR_TASKS],\n promotionDelta: opts.promotionDelta ?? 0.05,\n concurrency: opts.concurrency ?? 4,\n seed: opts.seed ?? 0,\n sandboxMode: opts.sandboxMode ?? 'real',\n ...(opts.taskTimeoutMs ? { taskTimeoutMs: opts.taskTimeoutMs } : {}),\n };\n\n const result = await runMetaHarnessDarwin(config, { execute: true }) as EvolutionResult;\n\n const baselineScore = finalScoreOf(result.baseline) ?? 0;\n const winnerScore = finalScoreOf(result.winner);\n const delta = (winnerScore ?? baselineScore) - baselineScore;\n // winnerLineage is baseline → … → winner, so the tail is the winner id.\n const winnerId = result.winner ? result.winnerLineage[result.winnerLineage.length - 1] ?? null : null;\n\n return {\n improved: result.winner != null && delta > 0,\n winnerId,\n winnerLineage: result.winnerLineage,\n baselineScore,\n winnerScore,\n deltaOverBaseline: delta,\n generations: result.generations,\n variantsEvaluated: result.records.length,\n raw: result,\n };\n}\n\n/** Reusable repair runner with bound defaults (e.g. a fixed sandbox mode). */\nexport class DarwinRepair {\n constructor(private readonly defaults: Partial<RepairOptions> = {}) {}\n\n repair(opts: RepairOptions): Promise<RepairResult> {\n return repair({ ...this.defaults, ...opts });\n }\n}\n"]}
|
|
@@ -19,12 +19,12 @@ async function ensureOnnxDependencies() {
|
|
|
19
19
|
}
|
|
20
20
|
if (!transformers) {
|
|
21
21
|
try {
|
|
22
|
-
const transformersModule = await import('@
|
|
22
|
+
const transformersModule = await import('@huggingface/transformers');
|
|
23
23
|
transformers = transformersModule;
|
|
24
24
|
transformers.env.allowLocalModels = true;
|
|
25
25
|
}
|
|
26
26
|
catch (e) {
|
|
27
|
-
throw new Error('@
|
|
27
|
+
throw new Error('@huggingface/transformers not installed. Run: npm install @huggingface/transformers');
|
|
28
28
|
}
|
|
29
29
|
}
|
|
30
30
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"onnx.js","sourceRoot":"","sources":["../../../src/router/providers/onnx.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * ONNX Runtime Provider for Local Model Inference\n *\n * Supports CPU and GPU execution providers for optimized local inference\n * Compatible with Phi-3, Llama, and other ONNX models\n */\n\nimport type {\n LLMProvider,\n ChatParams,\n ChatResponse,\n StreamChunk,\n ProviderError,\n Message,\n ContentBlock\n} from '../types.js';\n\n// Dynamic imports for optional ONNX dependencies\nlet ort: any;\nlet transformers: any;\n\nasync function ensureOnnxDependencies() {\n if (!ort) {\n try {\n const ortModule = await import('onnxruntime-node' as any);\n ort = ortModule;\n } catch (e) {\n throw new Error('onnxruntime-node not installed. Run: npm install onnxruntime-node');\n }\n }\n if (!transformers) {\n try {\n const transformersModule = await import('@xenova/transformers' as any);\n transformers = transformersModule;\n transformers.env.allowLocalModels = true;\n } catch (e) {\n throw new Error('@xenova/transformers not installed. Run: npm install @xenova/transformers');\n }\n }\n}\n\nexport interface ONNXConfig {\n modelPath?: string;\n modelId?: string; // HuggingFace model ID\n executionProviders?: string[];\n sessionOptions?: any;\n maxTokens?: number;\n temperature?: number;\n}\n\nexport class ONNXProvider implements LLMProvider {\n name = 'onnx';\n type = 'custom' as const;\n supportsStreaming = true;\n supportsTools = false;\n supportsMCP = false;\n\n private session: any = null;\n private generator: any = null;\n private config: ONNXConfig;\n private executionProviders: string[] = [];\n\n constructor(config: ONNXConfig = {}) {\n this.config = {\n modelId: config.modelId || 'Xenova/Phi-3-mini-4k-instruct',\n maxTokens: config.maxTokens || 512,\n temperature: config.temperature || 0.7,\n ...config\n };\n }\n\n /**\n * Detect available execution providers\n */\n private async detectExecutionProviders(): Promise<string[]> {\n const providers: string[] = [];\n\n // Try CUDA for NVIDIA GPUs\n try {\n if (process.platform === 'linux') {\n providers.push('cuda');\n this.executionProviders.push('cuda');\n }\n } catch (e) {\n // CUDA not available\n }\n\n // Try DirectML for Windows GPUs\n try {\n if (process.platform === 'win32') {\n providers.push('dml');\n this.executionProviders.push('dml');\n }\n } catch (e) {\n // DirectML not available\n }\n\n // Always fallback to CPU\n providers.push('cpu');\n this.executionProviders.push('cpu');\n\n console.log(`🔧 ONNX Execution Providers: ${this.executionProviders.join(', ')}`);\n\n return providers;\n }\n\n /**\n * Initialize ONNX session with model\n */\n private async initializeSession(): Promise<void> {\n if (this.generator) return;\n\n try {\n await ensureOnnxDependencies();\n\n console.log(`📦 Loading ONNX model: ${this.config.modelId}`);\n\n // Use Transformers.js for easier model loading\n this.generator = await transformers.pipeline(\n 'text-generation',\n this.config.modelId,\n {\n quantized: true, // Use quantized models for better CPU performance\n }\n );\n\n console.log(`✅ ONNX model loaded successfully`);\n\n } catch (error) {\n const providerError: ProviderError = {\n name: 'ONNXInitError',\n message: `Failed to initialize ONNX model: ${error}`,\n provider: 'onnx',\n retryable: false\n };\n throw providerError;\n }\n }\n\n /**\n * Format messages for model input\n */\n private formatMessages(messages: Message[]): string {\n // Simple chat template for Phi-3\n let prompt = '';\n\n for (const msg of messages) {\n const content = typeof msg.content === 'string'\n ? msg.content\n : msg.content.map(c => c.type === 'text' ? c.text : '').join('');\n\n if (msg.role === 'user') {\n prompt += `<|user|>\\n${content}<|end|>\\n`;\n } else if (msg.role === 'assistant') {\n prompt += `<|assistant|>\\n${content}<|end|>\\n`;\n } else if (msg.role === 'system') {\n prompt += `<|system|>\\n${content}<|end|>\\n`;\n }\n }\n\n prompt += '<|assistant|>\\n';\n return prompt;\n }\n\n /**\n * Chat completion\n */\n async chat(params: ChatParams): Promise<ChatResponse> {\n await this.initializeSession();\n\n const startTime = Date.now();\n const prompt = this.formatMessages(params.messages);\n\n try {\n const result = await this.generator(prompt, {\n max_new_tokens: params.maxTokens || this.config.maxTokens,\n temperature: params.temperature || this.config.temperature,\n do_sample: true,\n top_p: 0.9,\n });\n\n const generatedText = result[0].generated_text;\n\n // Extract only the new assistant response\n const assistantResponse = generatedText\n .split('<|assistant|>')\n .pop()\n ?.split('<|end|>')[0]\n ?.trim() || '';\n\n const latency = Date.now() - startTime;\n\n // Estimate token counts (rough approximation)\n const inputTokens = Math.ceil(prompt.length / 4);\n const outputTokens = Math.ceil(assistantResponse.length / 4);\n\n const content: ContentBlock[] = [{\n type: 'text',\n text: assistantResponse\n }];\n\n return {\n id: `onnx-${Date.now()}`,\n model: this.config.modelId || 'onnx-model',\n content,\n stopReason: 'end_turn',\n usage: {\n inputTokens,\n outputTokens\n },\n metadata: {\n provider: 'onnx',\n model: this.config.modelId,\n latency,\n cost: 0, // Local inference is free\n executionProviders: this.executionProviders\n }\n };\n\n } catch (error) {\n const providerError: ProviderError = {\n name: 'ONNXInferenceError',\n message: `ONNX inference failed: ${error}`,\n provider: 'onnx',\n retryable: true\n };\n throw providerError;\n }\n }\n\n /**\n * Streaming generation\n */\n async *stream(params: ChatParams): AsyncGenerator<StreamChunk> {\n await this.initializeSession();\n\n const prompt = this.formatMessages(params.messages);\n\n try {\n // Note: Transformers.js doesn't natively support streaming\n // We'll simulate it by yielding tokens as they're generated\n const result = await this.generator(prompt, {\n max_new_tokens: params.maxTokens || this.config.maxTokens,\n temperature: params.temperature || this.config.temperature,\n do_sample: true,\n top_p: 0.9,\n });\n\n const generatedText = result[0].generated_text;\n const assistantResponse = generatedText\n .split('<|assistant|>')\n .pop()\n ?.split('<|end|>')[0]\n ?.trim() || '';\n\n // Simulate streaming by chunking the response\n const words = assistantResponse.split(' ');\n for (let i = 0; i < words.length; i++) {\n const chunk = words[i] + (i < words.length - 1 ? ' ' : '');\n yield {\n type: 'content_block_delta',\n delta: {\n type: 'text_delta',\n text: chunk\n }\n };\n\n // Small delay to simulate real streaming\n await new Promise(resolve => setTimeout(resolve, 10));\n }\n\n yield {\n type: 'message_stop'\n };\n\n } catch (error) {\n const providerError: ProviderError = {\n name: 'ONNXStreamError',\n message: `ONNX streaming failed: ${error}`,\n provider: 'onnx',\n retryable: true\n };\n throw providerError;\n }\n }\n\n /**\n * Validate capabilities\n */\n validateCapabilities(features: string[]): boolean {\n const supported = ['chat', 'stream'];\n return features.every(f => supported.includes(f));\n }\n\n /**\n * Get model info\n */\n getModelInfo() {\n return {\n modelId: this.config.modelId,\n executionProviders: this.executionProviders,\n supportsGPU: this.executionProviders.includes('cuda') || this.executionProviders.includes('dml'),\n initialized: this.generator !== null\n };\n }\n\n /**\n * Cleanup resources\n */\n async dispose(): Promise<void> {\n if (this.generator) {\n this.generator = null;\n }\n if (this.session) {\n await this.session.release();\n this.session = null;\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"onnx.js","sourceRoot":"","sources":["../../../src/router/providers/onnx.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * ONNX Runtime Provider for Local Model Inference\n *\n * Supports CPU and GPU execution providers for optimized local inference\n * Compatible with Phi-3, Llama, and other ONNX models\n */\n\nimport type {\n LLMProvider,\n ChatParams,\n ChatResponse,\n StreamChunk,\n ProviderError,\n Message,\n ContentBlock\n} from '../types.js';\n\n// Dynamic imports for optional ONNX dependencies\nlet ort: any;\nlet transformers: any;\n\nasync function ensureOnnxDependencies() {\n if (!ort) {\n try {\n const ortModule = await import('onnxruntime-node' as any);\n ort = ortModule;\n } catch (e) {\n throw new Error('onnxruntime-node not installed. Run: npm install onnxruntime-node');\n }\n }\n if (!transformers) {\n try {\n const transformersModule = await import('@huggingface/transformers' as any);\n transformers = transformersModule;\n transformers.env.allowLocalModels = true;\n } catch (e) {\n throw new Error('@huggingface/transformers not installed. Run: npm install @huggingface/transformers');\n }\n }\n}\n\nexport interface ONNXConfig {\n modelPath?: string;\n modelId?: string; // HuggingFace model ID\n executionProviders?: string[];\n sessionOptions?: any;\n maxTokens?: number;\n temperature?: number;\n}\n\nexport class ONNXProvider implements LLMProvider {\n name = 'onnx';\n type = 'custom' as const;\n supportsStreaming = true;\n supportsTools = false;\n supportsMCP = false;\n\n private session: any = null;\n private generator: any = null;\n private config: ONNXConfig;\n private executionProviders: string[] = [];\n\n constructor(config: ONNXConfig = {}) {\n this.config = {\n modelId: config.modelId || 'Xenova/Phi-3-mini-4k-instruct',\n maxTokens: config.maxTokens || 512,\n temperature: config.temperature || 0.7,\n ...config\n };\n }\n\n /**\n * Detect available execution providers\n */\n private async detectExecutionProviders(): Promise<string[]> {\n const providers: string[] = [];\n\n // Try CUDA for NVIDIA GPUs\n try {\n if (process.platform === 'linux') {\n providers.push('cuda');\n this.executionProviders.push('cuda');\n }\n } catch (e) {\n // CUDA not available\n }\n\n // Try DirectML for Windows GPUs\n try {\n if (process.platform === 'win32') {\n providers.push('dml');\n this.executionProviders.push('dml');\n }\n } catch (e) {\n // DirectML not available\n }\n\n // Always fallback to CPU\n providers.push('cpu');\n this.executionProviders.push('cpu');\n\n console.log(`🔧 ONNX Execution Providers: ${this.executionProviders.join(', ')}`);\n\n return providers;\n }\n\n /**\n * Initialize ONNX session with model\n */\n private async initializeSession(): Promise<void> {\n if (this.generator) return;\n\n try {\n await ensureOnnxDependencies();\n\n console.log(`📦 Loading ONNX model: ${this.config.modelId}`);\n\n // Use Transformers.js for easier model loading\n this.generator = await transformers.pipeline(\n 'text-generation',\n this.config.modelId,\n {\n quantized: true, // Use quantized models for better CPU performance\n }\n );\n\n console.log(`✅ ONNX model loaded successfully`);\n\n } catch (error) {\n const providerError: ProviderError = {\n name: 'ONNXInitError',\n message: `Failed to initialize ONNX model: ${error}`,\n provider: 'onnx',\n retryable: false\n };\n throw providerError;\n }\n }\n\n /**\n * Format messages for model input\n */\n private formatMessages(messages: Message[]): string {\n // Simple chat template for Phi-3\n let prompt = '';\n\n for (const msg of messages) {\n const content = typeof msg.content === 'string'\n ? msg.content\n : msg.content.map(c => c.type === 'text' ? c.text : '').join('');\n\n if (msg.role === 'user') {\n prompt += `<|user|>\\n${content}<|end|>\\n`;\n } else if (msg.role === 'assistant') {\n prompt += `<|assistant|>\\n${content}<|end|>\\n`;\n } else if (msg.role === 'system') {\n prompt += `<|system|>\\n${content}<|end|>\\n`;\n }\n }\n\n prompt += '<|assistant|>\\n';\n return prompt;\n }\n\n /**\n * Chat completion\n */\n async chat(params: ChatParams): Promise<ChatResponse> {\n await this.initializeSession();\n\n const startTime = Date.now();\n const prompt = this.formatMessages(params.messages);\n\n try {\n const result = await this.generator(prompt, {\n max_new_tokens: params.maxTokens || this.config.maxTokens,\n temperature: params.temperature || this.config.temperature,\n do_sample: true,\n top_p: 0.9,\n });\n\n const generatedText = result[0].generated_text;\n\n // Extract only the new assistant response\n const assistantResponse = generatedText\n .split('<|assistant|>')\n .pop()\n ?.split('<|end|>')[0]\n ?.trim() || '';\n\n const latency = Date.now() - startTime;\n\n // Estimate token counts (rough approximation)\n const inputTokens = Math.ceil(prompt.length / 4);\n const outputTokens = Math.ceil(assistantResponse.length / 4);\n\n const content: ContentBlock[] = [{\n type: 'text',\n text: assistantResponse\n }];\n\n return {\n id: `onnx-${Date.now()}`,\n model: this.config.modelId || 'onnx-model',\n content,\n stopReason: 'end_turn',\n usage: {\n inputTokens,\n outputTokens\n },\n metadata: {\n provider: 'onnx',\n model: this.config.modelId,\n latency,\n cost: 0, // Local inference is free\n executionProviders: this.executionProviders\n }\n };\n\n } catch (error) {\n const providerError: ProviderError = {\n name: 'ONNXInferenceError',\n message: `ONNX inference failed: ${error}`,\n provider: 'onnx',\n retryable: true\n };\n throw providerError;\n }\n }\n\n /**\n * Streaming generation\n */\n async *stream(params: ChatParams): AsyncGenerator<StreamChunk> {\n await this.initializeSession();\n\n const prompt = this.formatMessages(params.messages);\n\n try {\n // Note: Transformers.js doesn't natively support streaming\n // We'll simulate it by yielding tokens as they're generated\n const result = await this.generator(prompt, {\n max_new_tokens: params.maxTokens || this.config.maxTokens,\n temperature: params.temperature || this.config.temperature,\n do_sample: true,\n top_p: 0.9,\n });\n\n const generatedText = result[0].generated_text;\n const assistantResponse = generatedText\n .split('<|assistant|>')\n .pop()\n ?.split('<|end|>')[0]\n ?.trim() || '';\n\n // Simulate streaming by chunking the response\n const words = assistantResponse.split(' ');\n for (let i = 0; i < words.length; i++) {\n const chunk = words[i] + (i < words.length - 1 ? ' ' : '');\n yield {\n type: 'content_block_delta',\n delta: {\n type: 'text_delta',\n text: chunk\n }\n };\n\n // Small delay to simulate real streaming\n await new Promise(resolve => setTimeout(resolve, 10));\n }\n\n yield {\n type: 'message_stop'\n };\n\n } catch (error) {\n const providerError: ProviderError = {\n name: 'ONNXStreamError',\n message: `ONNX streaming failed: ${error}`,\n provider: 'onnx',\n retryable: true\n };\n throw providerError;\n }\n }\n\n /**\n * Validate capabilities\n */\n validateCapabilities(features: string[]): boolean {\n const supported = ['chat', 'stream'];\n return features.every(f => supported.includes(f));\n }\n\n /**\n * Get model info\n */\n getModelInfo() {\n return {\n modelId: this.config.modelId,\n executionProviders: this.executionProviders,\n supportsGPU: this.executionProviders.includes('cuda') || this.executionProviders.includes('dml'),\n initialized: this.generator !== null\n };\n }\n\n /**\n * Cleanup resources\n */\n async dispose(): Promise<void> {\n if (this.generator) {\n this.generator = null;\n }\n if (this.session) {\n await this.session.release();\n this.session = null;\n }\n }\n}\n"]}
|
|
@@ -158,7 +158,7 @@ export class TransformersEmbeddingService extends EmbeddingService {
|
|
|
158
158
|
return;
|
|
159
159
|
try {
|
|
160
160
|
// Dynamically import transformers.js
|
|
161
|
-
const { pipeline } = await import('@
|
|
161
|
+
const { pipeline } = await import('@huggingface/transformers');
|
|
162
162
|
this.pipeline = await pipeline('feature-extraction', this.modelName);
|
|
163
163
|
this.emit('initialized', { model: this.modelName });
|
|
164
164
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"embedding-service.js","sourceRoot":"","sources":["../../src/services/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 if (this.cache.size >= this.config.cacheSize!) {\n // Remove oldest entry (first in map)\n const firstKey = this.cache.keys().next().value;\n this.cache.delete(firstKey);\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 = await response.json();\n const embedding = 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 = await response.json();\n const latency = Date.now() - start;\n\n return data.data.map((item: any, index: number) => {\n const embedding = 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/services/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 if (this.cache.size >= this.config.cacheSize!) {\n // Remove oldest entry (first in map)\n const firstKey = this.cache.keys().next().value;\n this.cache.delete(firstKey);\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 = await response.json();\n const embedding = 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 = await response.json();\n const latency = Date.now() - start;\n\n return data.data.map((item: any, index: number) => {\n const embedding = 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"]}
|
|
@@ -162,7 +162,7 @@ export async function getCachedOnnxEmbedder() {
|
|
|
162
162
|
}
|
|
163
163
|
export async function getCachedTransformersPipeline(task = 'feature-extraction', model = 'Xenova/all-MiniLM-L6-v2') {
|
|
164
164
|
return modelCache.getOrLoad(`transformers:${task}:${model}`, async () => {
|
|
165
|
-
const { pipeline } = await import('@
|
|
165
|
+
const { pipeline } = await import('@huggingface/transformers');
|
|
166
166
|
return pipeline(task, model);
|
|
167
167
|
}, 200 * 1024 * 1024 // 200MB estimate for transformers model
|
|
168
168
|
);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-cache.js","sourceRoot":"","sources":["../../src/utils/model-cache.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Global Model Cache\n *\n * Caches loaded models in memory to avoid repeated initialization overhead.\n * Supports ONNX embeddings, transformers.js pipelines, and other heavy models.\n */\n\ninterface CachedModel {\n model: any;\n loadedAt: number;\n lastUsed: number;\n useCount: number;\n sizeEstimate: number; // bytes\n}\n\ninterface CacheStats {\n models: number;\n totalSize: number;\n size?: number;\n totalHits: number;\n totalMisses: number;\n hits: number;\n misses: number;\n hitRate: number;\n}\n\nclass ModelCache {\n private cache = new Map<string, CachedModel>();\n private maxSize: number; // Max cache size in bytes\n private totalHits = 0;\n private totalMisses = 0;\n\n constructor(maxSizeMB: number = 512) {\n this.maxSize = maxSizeMB * 1024 * 1024;\n }\n\n /**\n * Get a cached model or load it\n */\n async getOrLoad<T>(\n key: string,\n loader: () => Promise<T>,\n sizeEstimate: number = 50 * 1024 * 1024 // Default 50MB estimate\n ): Promise<T> {\n const cached = this.cache.get(key);\n if (cached) {\n cached.lastUsed = Date.now();\n cached.useCount++;\n this.totalHits++;\n return cached.model as T;\n }\n\n this.totalMisses++;\n\n // Evict if needed\n this.evictIfNeeded(sizeEstimate);\n\n // Load model\n const model = await loader();\n\n this.cache.set(key, {\n model,\n loadedAt: Date.now(),\n lastUsed: Date.now(),\n useCount: 1,\n sizeEstimate\n });\n\n return model;\n }\n\n /**\n * Check if model is cached\n */\n has(key: string): boolean {\n return this.cache.has(key);\n }\n\n /**\n * Get cached model without loading\n */\n get<T>(key: string): T | undefined {\n const cached = this.cache.get(key);\n if (cached) {\n cached.lastUsed = Date.now();\n cached.useCount++;\n return cached.model as T;\n }\n return undefined;\n }\n\n /**\n * Manually cache a model\n */\n set(key: string, model: any, sizeEstimate: number = 50 * 1024 * 1024): void {\n this.evictIfNeeded(sizeEstimate);\n this.cache.set(key, {\n model,\n loadedAt: Date.now(),\n lastUsed: Date.now(),\n useCount: 1,\n sizeEstimate\n });\n }\n\n /**\n * Remove a model from cache\n */\n delete(key: string): boolean {\n return this.cache.delete(key);\n }\n\n /**\n * Clear all cached models\n */\n clear(): void {\n this.cache.clear();\n }\n\n /**\n * Get cache statistics\n */\n getStats(): CacheStats {\n let totalSize = 0;\n for (const cached of this.cache.values()) {\n totalSize += cached.sizeEstimate;\n }\n const hits = this.totalHits;\n const misses = this.totalMisses;\n const total = hits + misses;\n return {\n models: this.cache.size,\n totalSize,\n size: this.cache.size,\n totalHits: hits,\n totalMisses: misses,\n hits,\n misses,\n hitRate: total > 0 ? hits / total : 0\n };\n }\n\n /**\n * Evict least recently used models if cache is full\n */\n private evictIfNeeded(newSize: number): void {\n let currentSize = 0;\n for (const cached of this.cache.values()) {\n currentSize += cached.sizeEstimate;\n }\n\n if (currentSize + newSize <= this.maxSize) {\n return;\n }\n\n // Sort by last used time (LRU)\n const entries = Array.from(this.cache.entries())\n .sort((a, b) => a[1].lastUsed - b[1].lastUsed);\n\n // Evict until we have space\n for (const [key, cached] of entries) {\n if (currentSize + newSize <= this.maxSize) {\n break;\n }\n this.cache.delete(key);\n currentSize -= cached.sizeEstimate;\n }\n }\n}\n\n// Global singleton\nexport const modelCache = new ModelCache();\n\n// Convenience functions\nexport async function getCachedOnnxEmbedder(): Promise<any> {\n return modelCache.getOrLoad(\n 'onnx-embeddings',\n async () => {\n // Suppress experimental warning for WASM\n const originalEmit = process.emit;\n // @ts-ignore\n process.emit = function (name, data, ...args) {\n if (name === 'warning' && typeof data === 'object' &&\n (data as any).name === 'ExperimentalWarning' &&\n (data as any).message?.includes('Import')) {\n return false;\n }\n // @ts-ignore\n return originalEmit.apply(process, [name, data, ...args]);\n };\n\n try {\n const onnxModule = await import('ruvector-onnx-embeddings-wasm') as any;\n const EmbedderClass = onnxModule.OnnxEmbeddings || onnxModule.default;\n if (EmbedderClass) {\n const embedder = new EmbedderClass();\n await embedder.initialize?.();\n return embedder;\n }\n } finally {\n process.emit = originalEmit;\n }\n return null;\n },\n 100 * 1024 * 1024 // 100MB estimate for ONNX model\n );\n}\n\nexport async function getCachedTransformersPipeline(\n task: string = 'feature-extraction',\n model: string = 'Xenova/all-MiniLM-L6-v2'\n): Promise<any> {\n return modelCache.getOrLoad(\n `transformers:${task}:${model}`,\n async () => {\n const { pipeline } = await import('@xenova/transformers');\n return pipeline(task as any, model);\n },\n 200 * 1024 * 1024 // 200MB estimate for transformers model\n );\n}\n\nexport async function getCachedRuvectorCore(): Promise<any> {\n return modelCache.getOrLoad(\n 'ruvector-core',\n async () => {\n const ruvector = await import('ruvector');\n return ruvector;\n },\n 50 * 1024 * 1024\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"model-cache.js","sourceRoot":"","sources":["../../src/utils/model-cache.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Global Model Cache\n *\n * Caches loaded models in memory to avoid repeated initialization overhead.\n * Supports ONNX embeddings, transformers.js pipelines, and other heavy models.\n */\n\ninterface CachedModel {\n model: any;\n loadedAt: number;\n lastUsed: number;\n useCount: number;\n sizeEstimate: number; // bytes\n}\n\ninterface CacheStats {\n models: number;\n totalSize: number;\n size?: number;\n totalHits: number;\n totalMisses: number;\n hits: number;\n misses: number;\n hitRate: number;\n}\n\nclass ModelCache {\n private cache = new Map<string, CachedModel>();\n private maxSize: number; // Max cache size in bytes\n private totalHits = 0;\n private totalMisses = 0;\n\n constructor(maxSizeMB: number = 512) {\n this.maxSize = maxSizeMB * 1024 * 1024;\n }\n\n /**\n * Get a cached model or load it\n */\n async getOrLoad<T>(\n key: string,\n loader: () => Promise<T>,\n sizeEstimate: number = 50 * 1024 * 1024 // Default 50MB estimate\n ): Promise<T> {\n const cached = this.cache.get(key);\n if (cached) {\n cached.lastUsed = Date.now();\n cached.useCount++;\n this.totalHits++;\n return cached.model as T;\n }\n\n this.totalMisses++;\n\n // Evict if needed\n this.evictIfNeeded(sizeEstimate);\n\n // Load model\n const model = await loader();\n\n this.cache.set(key, {\n model,\n loadedAt: Date.now(),\n lastUsed: Date.now(),\n useCount: 1,\n sizeEstimate\n });\n\n return model;\n }\n\n /**\n * Check if model is cached\n */\n has(key: string): boolean {\n return this.cache.has(key);\n }\n\n /**\n * Get cached model without loading\n */\n get<T>(key: string): T | undefined {\n const cached = this.cache.get(key);\n if (cached) {\n cached.lastUsed = Date.now();\n cached.useCount++;\n return cached.model as T;\n }\n return undefined;\n }\n\n /**\n * Manually cache a model\n */\n set(key: string, model: any, sizeEstimate: number = 50 * 1024 * 1024): void {\n this.evictIfNeeded(sizeEstimate);\n this.cache.set(key, {\n model,\n loadedAt: Date.now(),\n lastUsed: Date.now(),\n useCount: 1,\n sizeEstimate\n });\n }\n\n /**\n * Remove a model from cache\n */\n delete(key: string): boolean {\n return this.cache.delete(key);\n }\n\n /**\n * Clear all cached models\n */\n clear(): void {\n this.cache.clear();\n }\n\n /**\n * Get cache statistics\n */\n getStats(): CacheStats {\n let totalSize = 0;\n for (const cached of this.cache.values()) {\n totalSize += cached.sizeEstimate;\n }\n const hits = this.totalHits;\n const misses = this.totalMisses;\n const total = hits + misses;\n return {\n models: this.cache.size,\n totalSize,\n size: this.cache.size,\n totalHits: hits,\n totalMisses: misses,\n hits,\n misses,\n hitRate: total > 0 ? hits / total : 0\n };\n }\n\n /**\n * Evict least recently used models if cache is full\n */\n private evictIfNeeded(newSize: number): void {\n let currentSize = 0;\n for (const cached of this.cache.values()) {\n currentSize += cached.sizeEstimate;\n }\n\n if (currentSize + newSize <= this.maxSize) {\n return;\n }\n\n // Sort by last used time (LRU)\n const entries = Array.from(this.cache.entries())\n .sort((a, b) => a[1].lastUsed - b[1].lastUsed);\n\n // Evict until we have space\n for (const [key, cached] of entries) {\n if (currentSize + newSize <= this.maxSize) {\n break;\n }\n this.cache.delete(key);\n currentSize -= cached.sizeEstimate;\n }\n }\n}\n\n// Global singleton\nexport const modelCache = new ModelCache();\n\n// Convenience functions\nexport async function getCachedOnnxEmbedder(): Promise<any> {\n return modelCache.getOrLoad(\n 'onnx-embeddings',\n async () => {\n // Suppress experimental warning for WASM\n const originalEmit = process.emit;\n // @ts-ignore\n process.emit = function (name, data, ...args) {\n if (name === 'warning' && typeof data === 'object' &&\n (data as any).name === 'ExperimentalWarning' &&\n (data as any).message?.includes('Import')) {\n return false;\n }\n // @ts-ignore\n return originalEmit.apply(process, [name, data, ...args]);\n };\n\n try {\n const onnxModule = await import('ruvector-onnx-embeddings-wasm') as any;\n const EmbedderClass = onnxModule.OnnxEmbeddings || onnxModule.default;\n if (EmbedderClass) {\n const embedder = new EmbedderClass();\n await embedder.initialize?.();\n return embedder;\n }\n } finally {\n process.emit = originalEmit;\n }\n return null;\n },\n 100 * 1024 * 1024 // 100MB estimate for ONNX model\n );\n}\n\nexport async function getCachedTransformersPipeline(\n task: string = 'feature-extraction',\n model: string = 'Xenova/all-MiniLM-L6-v2'\n): Promise<any> {\n return modelCache.getOrLoad(\n `transformers:${task}:${model}`,\n async () => {\n const { pipeline } = await import('@huggingface/transformers');\n return pipeline(task as any, model);\n },\n 200 * 1024 * 1024 // 200MB estimate for transformers model\n );\n}\n\nexport async function getCachedRuvectorCore(): Promise<any> {\n return modelCache.getOrLoad(\n 'ruvector-core',\n async () => {\n const ruvector = await import('ruvector');\n return ruvector;\n },\n 50 * 1024 * 1024\n );\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agentic-flow",
|
|
3
|
-
"version": "2.1.
|
|
3
|
+
"version": "2.1.1",
|
|
4
4
|
"description": "The agentic meta-harness — freeze the model, evolve the harness. An open runtime that routes each query to the cost-optimal model, evolves its own harness (planner/context/reviewer/retry/tool/memory/score policy) and autonomously repairs code, then orchestrates 66 specialized agents, 213 MCP tools, ReasoningBank memory, and multi-agent swarms on top. Built by @ruvnet on the Claude Agent SDK.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -25,6 +25,8 @@
|
|
|
25
25
|
"./router/cost-optimal": "./dist/router/cost-optimal-router.js",
|
|
26
26
|
"./repair": "./dist/repair/darwin-repair.js",
|
|
27
27
|
"./harness/provenance": "./dist/harness/provenance.js",
|
|
28
|
+
"./harness/metaharness": "./dist/harness/metaharness.js",
|
|
29
|
+
"./harness/governance": "./dist/harness/flywheel-governance.js",
|
|
28
30
|
"./agent-booster": "./dist/agent-booster/index.js",
|
|
29
31
|
"./transport/quic": "./dist/transport/quic.js",
|
|
30
32
|
"./embeddings": "./dist/embeddings/index.js",
|
|
@@ -33,7 +35,7 @@
|
|
|
33
35
|
"scripts": {
|
|
34
36
|
"postinstall": "node scripts/postinstall.js || true",
|
|
35
37
|
"start": "node --enable-source-maps dist/index.js",
|
|
36
|
-
"build": "(npm run build:wasm || true) &&
|
|
38
|
+
"build": "(npm run build:wasm || true) && tsc -p config/tsconfig.json --skipLibCheck && mkdir -p dist/reasoningbank && (cp -r src/reasoningbank/prompts dist/reasoningbank/ 2>/dev/null || true) && (cp -r src/reasoningbank/config dist/reasoningbank/ 2>/dev/null || true)",
|
|
37
39
|
"build:wasm": "cd ../reasoningbank && wasm-pack build --target bundler --out-dir pkg/bundler crates/reasoningbank-wasm && wasm-pack build --target web --out-dir pkg/web crates/reasoningbank-wasm && mkdir -p ../agentic-flow/wasm/reasoningbank && cp -r crates/reasoningbank-wasm/pkg/bundler/* ../agentic-flow/wasm/reasoningbank/ && cp -r crates/reasoningbank-wasm/pkg/web ../agentic-flow/wasm/reasoningbank/",
|
|
38
40
|
"build:wasm:clean": "rm -rf ../reasoningbank/crates/reasoningbank-wasm/pkg && rm -rf wasm/reasoningbank",
|
|
39
41
|
"dev": "tsx src/index.ts",
|
|
@@ -67,6 +69,7 @@
|
|
|
67
69
|
"proxy:quic:dev": "tsx src/proxy/quic-proxy.ts",
|
|
68
70
|
"benchmark:embeddings": "tsx src/benchmarks/embeddings-benchmark.ts",
|
|
69
71
|
"test:orchestration": "vitest run tests/orchestration/ --reporter=verbose",
|
|
72
|
+
"test:governance": "vitest run tests/harness/provenance.test.ts tests/harness/flywheel-governance.test.ts tests/mcp/mcp-policy.test.ts tests/embeddings/huggingface-offline.test.ts tests/repair/darwin-repair.test.ts",
|
|
70
73
|
"test:orchestration:smoke": "tsx tests/orchestration/orchestration-api.smoke.ts && tsx tests/orchestration/loop-policy.smoke.ts && tsx tests/orchestration/memory-plane.smoke.ts"
|
|
71
74
|
},
|
|
72
75
|
"keywords": [
|
|
@@ -158,21 +161,20 @@
|
|
|
158
161
|
},
|
|
159
162
|
"homepage": "https://github.com/ruvnet/agentic-flow#readme",
|
|
160
163
|
"engines": {
|
|
161
|
-
"node": ">=
|
|
164
|
+
"node": ">=20.0.0"
|
|
162
165
|
},
|
|
163
166
|
"dependencies": {
|
|
164
167
|
"@anthropic-ai/claude-agent-sdk": "^0.1.5",
|
|
165
168
|
"@anthropic-ai/sdk": "^0.65.0",
|
|
166
169
|
"@google/genai": "^1.22.0",
|
|
167
|
-
"@metaharness/darwin": "^0.7.0",
|
|
168
170
|
"@metaharness/router": "^0.3.2",
|
|
169
171
|
"@ruvector/core": "^0.1.29",
|
|
170
172
|
"@ruvector/edge-full": "^0.1.0",
|
|
171
|
-
"@ruvector/router": "^0.1.
|
|
172
|
-
"@ruvector/ruvllm": "^
|
|
173
|
+
"@ruvector/router": "^0.1.30",
|
|
174
|
+
"@ruvector/ruvllm": "^2.5.5",
|
|
173
175
|
"@ruvector/tiny-dancer": "^0.1.17",
|
|
174
176
|
"@supabase/supabase-js": "^2.78.0",
|
|
175
|
-
"@
|
|
177
|
+
"@huggingface/transformers": "^3.8.1",
|
|
176
178
|
"axios": "^1.12.2",
|
|
177
179
|
"dotenv": "^16.4.5",
|
|
178
180
|
"express": "^5.1.0",
|
|
@@ -180,7 +182,7 @@
|
|
|
180
182
|
"glob": "^13.0.0",
|
|
181
183
|
"gun": "^0.2020.1241",
|
|
182
184
|
"http-proxy-middleware": "^3.0.5",
|
|
183
|
-
"ruvector": "
|
|
185
|
+
"ruvector": "0.2.40",
|
|
184
186
|
"ruvector-onnx-embeddings-wasm": "^0.1.2",
|
|
185
187
|
"tiktoken": "^1.0.22",
|
|
186
188
|
"ulid": "^3.0.1",
|
|
@@ -195,12 +197,12 @@
|
|
|
195
197
|
"agentdb": "^3.0.0-alpha.14",
|
|
196
198
|
"better-sqlite3": "^11.10.0",
|
|
197
199
|
"onnxruntime-node": "^1.23.2",
|
|
198
|
-
"sharp": "^0.
|
|
200
|
+
"sharp": "^0.34.3",
|
|
199
201
|
"sql.js": "^1.11.0"
|
|
200
202
|
},
|
|
201
203
|
"overrides": {
|
|
202
204
|
"protobufjs": ">=7.5.5",
|
|
203
|
-
"@
|
|
205
|
+
"@huggingface/transformers": {
|
|
204
206
|
"sharp": "$sharp"
|
|
205
207
|
}
|
|
206
208
|
},
|