agentic-flow 3.0.0 → 3.2.0

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 (115) hide show
  1. package/.agents/skills/agentic-flow-ecosystem/SKILL.md +50 -0
  2. package/.claude/skills/agentic-flow-ecosystem/skill.md +58 -0
  3. package/.claude/skills/agentic-flow-quickstart/skill.md +6 -6
  4. package/.claude/skills/hooks-automation/skill.md +11 -11
  5. package/.claude/skills/memory-patterns/skill.md +7 -7
  6. package/.claude/skills/sparc-methodology/skill.md +13 -13
  7. package/.claude/skills/swarm-coordination/skill.md +5 -5
  8. package/.claude/skills/worker-benchmarks/skill.md +5 -5
  9. package/.claude/skills/worker-integration/skill.md +5 -5
  10. package/.claude/statusline.mjs +22 -5
  11. package/CHANGELOG.md +48 -0
  12. package/README.md +83 -71
  13. package/dist/.tsbuildinfo +1 -1
  14. package/dist/cli/commands/hooks.d.ts.map +1 -1
  15. package/dist/cli/commands/hooks.js +17 -17
  16. package/dist/cli/commands/hooks.js.map +1 -1
  17. package/dist/cli/commands/init.d.ts +2 -5
  18. package/dist/cli/commands/init.d.ts.map +1 -1
  19. package/dist/cli/commands/init.js +11 -15
  20. package/dist/cli/commands/init.js.map +1 -1
  21. package/dist/cli/commands/swarm.d.ts.map +1 -1
  22. package/dist/cli/commands/swarm.js +3 -2
  23. package/dist/cli/commands/swarm.js.map +1 -1
  24. package/dist/core/agentdb-fast.d.ts +21 -11
  25. package/dist/core/agentdb-fast.d.ts.map +1 -1
  26. package/dist/core/agentdb-fast.js +39 -14
  27. package/dist/core/agentdb-fast.js.map +1 -1
  28. package/dist/integrations/agent-booster.d.ts +35 -0
  29. package/dist/integrations/agent-booster.d.ts.map +1 -0
  30. package/dist/integrations/agent-booster.js +45 -0
  31. package/dist/integrations/agent-booster.js.map +1 -0
  32. package/dist/integrations/index.d.ts +15 -0
  33. package/dist/integrations/index.d.ts.map +1 -0
  34. package/dist/integrations/index.js +11 -0
  35. package/dist/integrations/index.js.map +1 -0
  36. package/dist/integrations/onnx-wasm-embedder.d.ts +59 -0
  37. package/dist/integrations/onnx-wasm-embedder.d.ts.map +1 -0
  38. package/dist/integrations/onnx-wasm-embedder.js +145 -0
  39. package/dist/integrations/onnx-wasm-embedder.js.map +1 -0
  40. package/dist/integrations/optional.d.ts +44 -0
  41. package/dist/integrations/optional.d.ts.map +1 -0
  42. package/dist/integrations/optional.js +107 -0
  43. package/dist/integrations/optional.js.map +1 -0
  44. package/dist/integrations/prompt-injection.d.ts +52 -0
  45. package/dist/integrations/prompt-injection.d.ts.map +1 -0
  46. package/dist/integrations/prompt-injection.js +126 -0
  47. package/dist/integrations/prompt-injection.js.map +1 -0
  48. package/dist/integrations/sublinear.d.ts +71 -0
  49. package/dist/integrations/sublinear.d.ts.map +1 -0
  50. package/dist/integrations/sublinear.js +227 -0
  51. package/dist/integrations/sublinear.js.map +1 -0
  52. package/dist/integrations/task-partition.d.ts +40 -0
  53. package/dist/integrations/task-partition.d.ts.map +1 -0
  54. package/dist/integrations/task-partition.js +173 -0
  55. package/dist/integrations/task-partition.js.map +1 -0
  56. package/dist/mcp/mcp-policy.d.ts.map +1 -1
  57. package/dist/mcp/mcp-policy.js +2 -0
  58. package/dist/mcp/mcp-policy.js.map +1 -1
  59. package/dist/mcp/standalone-stdio.js +12 -26
  60. package/dist/mcp/standalone-stdio.js.map +1 -1
  61. package/dist/mcp/tools/ecosystem-tools.d.ts +49 -0
  62. package/dist/mcp/tools/ecosystem-tools.d.ts.map +1 -0
  63. package/dist/mcp/tools/ecosystem-tools.js +126 -0
  64. package/dist/mcp/tools/ecosystem-tools.js.map +1 -0
  65. package/dist/proxy/anthropic-to-gemini.d.ts.map +1 -1
  66. package/dist/proxy/anthropic-to-gemini.js +10 -14
  67. package/dist/proxy/anthropic-to-gemini.js.map +1 -1
  68. package/dist/proxy/anthropic-to-openrouter.d.ts.map +1 -1
  69. package/dist/proxy/anthropic-to-openrouter.js +6 -25
  70. package/dist/proxy/anthropic-to-openrouter.js.map +1 -1
  71. package/dist/proxy/anthropic-to-requesty.d.ts.map +1 -1
  72. package/dist/proxy/anthropic-to-requesty.js +8 -10
  73. package/dist/proxy/anthropic-to-requesty.js.map +1 -1
  74. package/dist/proxy/sse-lines.d.ts +9 -0
  75. package/dist/proxy/sse-lines.d.ts.map +1 -0
  76. package/dist/proxy/sse-lines.js +37 -0
  77. package/dist/proxy/sse-lines.js.map +1 -0
  78. package/dist/reasoningbank/index.d.ts +2 -1
  79. package/dist/reasoningbank/index.d.ts.map +1 -1
  80. package/dist/reasoningbank/index.js +1 -1
  81. package/dist/reasoningbank/index.js.map +1 -1
  82. package/dist/reasoningbank/utils/embeddings.d.ts +17 -0
  83. package/dist/reasoningbank/utils/embeddings.d.ts.map +1 -1
  84. package/dist/reasoningbank/utils/embeddings.js +48 -17
  85. package/dist/reasoningbank/utils/embeddings.js.map +1 -1
  86. package/dist/routing/SemanticRouter.d.ts +25 -9
  87. package/dist/routing/SemanticRouter.d.ts.map +1 -1
  88. package/dist/routing/SemanticRouter.js +63 -12
  89. package/dist/routing/SemanticRouter.js.map +1 -1
  90. package/dist/utils/input-validator.d.ts +10 -2
  91. package/dist/utils/input-validator.d.ts.map +1 -1
  92. package/dist/utils/input-validator.js +30 -2
  93. package/dist/utils/input-validator.js.map +1 -1
  94. package/dist/utils/model-cache.d.ts.map +1 -1
  95. package/dist/utils/model-cache.js +6 -25
  96. package/dist/utils/model-cache.js.map +1 -1
  97. package/dist/utils/package-version.d.ts +9 -0
  98. package/dist/utils/package-version.d.ts.map +1 -0
  99. package/dist/utils/package-version.js +39 -0
  100. package/dist/utils/package-version.js.map +1 -0
  101. package/dist/wasm/onnx-embeddings-wasm.d.ts.map +1 -1
  102. package/dist/wasm/onnx-embeddings-wasm.js +21 -10
  103. package/dist/wasm/onnx-embeddings-wasm.js.map +1 -1
  104. package/docs/docker-tests/TEST-V1.7.8.Dockerfile +2 -2
  105. package/docs/docker-tests/TEST-V1.7.9-NODE20.Dockerfile +2 -2
  106. package/docs/docker-tests/TEST-V1.7.9.Dockerfile +2 -2
  107. package/docs/guides/CLAUDE-CODE-INTEGRATION.md +25 -8
  108. package/docs/guides/PROXY-ARCHITECTURE-AND-EXTENSION.md +22 -9
  109. package/docs/guides/STANDALONE_PROXY_GUIDE.md +16 -6
  110. package/docs/integrations/FASTMCP_CLI_INTEGRATION.md +1 -1
  111. package/docs/plans/requesty/02-architecture.md +5 -6
  112. package/docs/plans/requesty/03-implementation-phases.md +3 -4
  113. package/docs/plans/requesty/05-migration-guide.md +2 -2
  114. package/package.json +12 -7
  115. package/scripts/validate-providers.sh +7 -4
@@ -1 +1 @@
1
- {"version":3,"file":"model-cache.d.ts","sourceRoot":"","sources":["../../src/utils/model-cache.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAUH,UAAU,UAAU;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,cAAM,UAAU;IACd,OAAO,CAAC,KAAK,CAAkC;IAC/C,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,WAAW,CAAK;gBAEZ,SAAS,GAAE,MAAY;IAInC;;OAEG;IACG,SAAS,CAAC,CAAC,EACf,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACxB,YAAY,GAAE,MAAyB,GACtC,OAAO,CAAC,CAAC,CAAC;IA4Bb;;OAEG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAIzB;;OAEG;IACH,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;IAUlC;;OAEG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,YAAY,GAAE,MAAyB,GAAG,IAAI;IAW3E;;OAEG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAI5B;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,QAAQ,IAAI,UAAU;IAoBtB;;OAEG;IACH,OAAO,CAAC,aAAa;CAuBtB;AAGD,eAAO,MAAM,UAAU,YAAmB,CAAC;AAG3C,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,GAAG,CAAC,CAgC1D;AAED,wBAAsB,6BAA6B,CACjD,IAAI,GAAE,MAA6B,EACnC,KAAK,GAAE,MAAkC,GACxC,OAAO,CAAC,GAAG,CAAC,CASd;AAED,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,GAAG,CAAC,CAS1D"}
1
+ {"version":3,"file":"model-cache.d.ts","sourceRoot":"","sources":["../../src/utils/model-cache.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAUH,UAAU,UAAU;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,cAAM,UAAU;IACd,OAAO,CAAC,KAAK,CAAkC;IAC/C,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,WAAW,CAAK;gBAEZ,SAAS,GAAE,MAAY;IAInC;;OAEG;IACG,SAAS,CAAC,CAAC,EACf,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACxB,YAAY,GAAE,MAAyB,GACtC,OAAO,CAAC,CAAC,CAAC;IA4Bb;;OAEG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAIzB;;OAEG;IACH,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;IAUlC;;OAEG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,YAAY,GAAE,MAAyB,GAAG,IAAI;IAW3E;;OAEG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAI5B;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,QAAQ,IAAI,UAAU;IAoBtB;;OAEG;IACH,OAAO,CAAC,aAAa;CAuBtB;AAGD,eAAO,MAAM,UAAU,YAAmB,CAAC;AAG3C,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,GAAG,CAAC,CAa1D;AAED,wBAAsB,6BAA6B,CACjD,IAAI,GAAE,MAA6B,EACnC,KAAK,GAAE,MAAkC,GACxC,OAAO,CAAC,GAAG,CAAC,CASd;AAED,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,GAAG,CAAC,CAS1D"}
@@ -132,31 +132,12 @@ export const modelCache = new ModelCache();
132
132
  // Convenience functions
133
133
  export async function getCachedOnnxEmbedder() {
134
134
  return modelCache.getOrLoad('onnx-embeddings', async () => {
135
- // Suppress experimental warning for WASM
136
- const originalEmit = process.emit;
137
- // @ts-ignore
138
- process.emit = function (name, data, ...args) {
139
- if (name === 'warning' && typeof data === 'object' &&
140
- data.name === 'ExperimentalWarning' &&
141
- data.message?.includes('Import')) {
142
- return false;
143
- }
144
- // @ts-ignore
145
- return originalEmit.apply(process, [name, data, ...args]);
146
- };
147
- try {
148
- const onnxModule = await import('ruvector-onnx-embeddings-wasm');
149
- const EmbedderClass = onnxModule.OnnxEmbeddings || onnxModule.default;
150
- if (EmbedderClass) {
151
- const embedder = new EmbedderClass();
152
- await embedder.initialize?.();
153
- return embedder;
154
- }
155
- }
156
- finally {
157
- process.emit = originalEmit;
158
- }
159
- return null;
135
+ // ruvector-onnx-embeddings-wasm exposes WasmEmbedder (not the
136
+ // OnnxEmbeddings class this used to look for) and cannot be import()ed
137
+ // as published; the shared loader handles both. Resolves to an object
138
+ // with async embed(text) -> Float32Array, or null.
139
+ const { getOnnxWasmEmbedder } = await import('../integrations/onnx-wasm-embedder.js');
140
+ return getOnnxWasmEmbedder();
160
141
  }, 100 * 1024 * 1024 // 100MB estimate for ONNX model
161
142
  );
162
143
  }
@@ -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('@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"]}
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 // ruvector-onnx-embeddings-wasm exposes WasmEmbedder (not the\n // OnnxEmbeddings class this used to look for) and cannot be import()ed\n // as published; the shared loader handles both. Resolves to an object\n // with async embed(text) -> Float32Array, or null.\n const { getOnnxWasmEmbedder } = await import('../integrations/onnx-wasm-embedder.js');\n return getOnnxWasmEmbedder();\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"]}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Version from this package's package.json, found by walking up from this
3
+ * file (src/utils under tsx, dist/utils when built). Throws if it is missing,
4
+ * which only happens in a broken install, rather than falling back to a tag.
5
+ */
6
+ export declare function readPackageVersion(): string;
7
+ /** `agentic-flow@<installed version>`, for npx commands. */
8
+ export declare function packageSpec(): string;
9
+ //# sourceMappingURL=package-version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-version.d.ts","sourceRoot":"","sources":["../../src/utils/package-version.ts"],"names":[],"mappings":"AAYA;;;;GAIG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAgB3C;AAED,4DAA4D;AAC5D,wBAAgB,WAAW,IAAI,MAAM,CAEpC"}
@@ -0,0 +1,39 @@
1
+ // The installed agentic-flow version, for commands we write or print.
2
+ //
3
+ // Generated hooks, statuslines and help text run `npx agentic-flow@<this>`,
4
+ // never a dist-tag: @alpha still resolves to the deprecated March 3.0.0-alpha
5
+ // line, and @latest changes under an installed project without notice.
6
+ import * as fs from 'fs';
7
+ import * as path from 'path';
8
+ import { fileURLToPath } from 'url';
9
+ const VERSION_RE = /^\d+\.\d+\.\d+[\w.+-]*$/;
10
+ let cached;
11
+ /**
12
+ * Version from this package's package.json, found by walking up from this
13
+ * file (src/utils under tsx, dist/utils when built). Throws if it is missing,
14
+ * which only happens in a broken install, rather than falling back to a tag.
15
+ */
16
+ export function readPackageVersion() {
17
+ if (cached)
18
+ return cached;
19
+ let dir = path.dirname(fileURLToPath(import.meta.url));
20
+ for (;;) {
21
+ const file = path.join(dir, 'package.json');
22
+ if (fs.existsSync(file)) {
23
+ const pkg = JSON.parse(fs.readFileSync(file, 'utf-8'));
24
+ if (pkg.name === 'agentic-flow' && typeof pkg.version === 'string' && VERSION_RE.test(pkg.version)) {
25
+ cached = pkg.version;
26
+ return cached;
27
+ }
28
+ }
29
+ const parent = path.dirname(dir);
30
+ if (parent === dir)
31
+ throw new Error('agentic-flow: cannot find its own package.json to pin the version');
32
+ dir = parent;
33
+ }
34
+ }
35
+ /** `agentic-flow@<installed version>`, for npx commands. */
36
+ export function packageSpec() {
37
+ return `agentic-flow@${readPackageVersion()}`;
38
+ }
39
+ //# sourceMappingURL=package-version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-version.js","sourceRoot":"","sources":["../../src/utils/package-version.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,uEAAuE;AACvE,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,MAAM,UAAU,GAAG,yBAAyB,CAAC;AAC7C,IAAI,MAA0B,CAAC;AAE/B;;;;GAIG;AACH,MAAM,UAAU,kBAAkB;IAChC,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAC1B,IAAI,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACvD,SAAS,CAAC;QACR,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;QAC5C,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;YACvD,IAAI,GAAG,CAAC,IAAI,KAAK,cAAc,IAAI,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;gBACnG,MAAM,GAAG,GAAG,CAAC,OAAiB,CAAC;gBAC/B,OAAO,MAAM,CAAC;YAChB,CAAC;QACH,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,MAAM,KAAK,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,mEAAmE,CAAC,CAAC;QACzG,GAAG,GAAG,MAAM,CAAC;IACf,CAAC;AACH,CAAC;AAED,4DAA4D;AAC5D,MAAM,UAAU,WAAW;IACzB,OAAO,gBAAgB,kBAAkB,EAAE,EAAE,CAAC;AAChD,CAAC","sourcesContent":["// The installed agentic-flow version, for commands we write or print.\n//\n// Generated hooks, statuslines and help text run `npx agentic-flow@<this>`,\n// never a dist-tag: @alpha still resolves to the deprecated March 3.0.0-alpha\n// line, and @latest changes under an installed project without notice.\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { fileURLToPath } from 'url';\n\nconst VERSION_RE = /^\\d+\\.\\d+\\.\\d+[\\w.+-]*$/;\nlet cached: string | undefined;\n\n/**\n * Version from this package's package.json, found by walking up from this\n * file (src/utils under tsx, dist/utils when built). Throws if it is missing,\n * which only happens in a broken install, rather than falling back to a tag.\n */\nexport function readPackageVersion(): string {\n if (cached) return cached;\n let dir = path.dirname(fileURLToPath(import.meta.url));\n for (;;) {\n const file = path.join(dir, 'package.json');\n if (fs.existsSync(file)) {\n const pkg = JSON.parse(fs.readFileSync(file, 'utf-8'));\n if (pkg.name === 'agentic-flow' && typeof pkg.version === 'string' && VERSION_RE.test(pkg.version)) {\n cached = pkg.version as string;\n return cached;\n }\n }\n const parent = path.dirname(dir);\n if (parent === dir) throw new Error('agentic-flow: cannot find its own package.json to pin the version');\n dir = parent;\n }\n}\n\n/** `agentic-flow@<installed version>`, for npx commands. */\nexport function packageSpec(): string {\n return `agentic-flow@${readPackageVersion()}`;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"onnx-embeddings-wasm.d.ts","sourceRoot":"","sources":["../../src/wasm/onnx-embeddings-wasm.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAkCH,UAAU,SAAS;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,YAAY,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,GAAG,UAAU,CAAC;CAC7B;AAED,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,YAAY,EAAE,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,GAAG,UAAU,CAAC;CAC7B;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;CACtB;AAQD;;GAEG;AACH,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,OAAO,CAAC,CAoC/D;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,CAE7C;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,OAAO,CAEvC;AAED;;GAEG;AACH,wBAAsB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAqCtE;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,eAAe,CAAC,CAuC1E;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAY9E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,YAAY,GAAG,MAAM,CAkBzE;AAED;;GAEG;AACH,wBAAgB,QAAQ,IAAI,mBAAmB,CAY9C;AAED;;GAEG;AACH,wBAAsB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAO9C;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,IAAI,CAEjC;AA8BD;;GAEG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,WAAW,CAAS;IAEtB,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC;IAKxB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAKjD,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,eAAe,CAAC;IAKrD,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAK/D,gBAAgB,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,YAAY,GAAG,MAAM;IAI1D,WAAW,IAAI,OAAO;IAItB,aAAa,IAAI,OAAO;IAIxB,QAAQ,IAAI,mBAAmB;IAIzB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAIhC;AAKD;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,kBAAkB,CAK1D;;;;;;;;;;;;;;;AAED,wBAaE"}
1
+ {"version":3,"file":"onnx-embeddings-wasm.d.ts","sourceRoot":"","sources":["../../src/wasm/onnx-embeddings-wasm.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAkCH,UAAU,SAAS;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,YAAY,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,GAAG,UAAU,CAAC;CAC7B;AAED,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,YAAY,EAAE,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,GAAG,UAAU,CAAC;CAC7B;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;CACtB;AAQD;;GAEG;AACH,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,OAAO,CAAC,CA6C/D;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,CAE7C;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,OAAO,CAEvC;AAED;;GAEG;AACH,wBAAsB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAqCtE;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,eAAe,CAAC,CAuC1E;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAY9E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,YAAY,GAAG,MAAM,CAkBzE;AAED;;GAEG;AACH,wBAAgB,QAAQ,IAAI,mBAAmB,CAY9C;AAED;;GAEG;AACH,wBAAsB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAO9C;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,IAAI,CAEjC;AA8BD;;GAEG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,WAAW,CAAS;IAEtB,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC;IAKxB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAKjD,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,eAAe,CAAC;IAKrD,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAK/D,gBAAgB,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,YAAY,GAAG,MAAM;IAI1D,WAAW,IAAI,OAAO;IAItB,aAAa,IAAI,OAAO;IAIxB,QAAQ,IAAI,mBAAmB;IAIzB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAIhC;AAKD;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,kBAAkB,CAK1D;;;;;;;;;;;;;;;AAED,wBAaE"}
@@ -40,16 +40,27 @@ export async function initOnnxEmbeddingsWasm() {
40
40
  return initPromise;
41
41
  initPromise = (async () => {
42
42
  try {
43
- const mod = await import('ruvector-onnx-embeddings-wasm');
44
- wasmModule = mod;
45
- // Initialize WASM runtime
46
- if (wasmModule.initialize) {
47
- await wasmModule.initialize();
48
- }
49
- // Load default model
50
- if (wasmModule.loadModel && !wasmModule.isModelLoaded?.()) {
51
- await wasmModule.loadModel();
52
- }
43
+ // The package's own exports are WasmEmbedder/cosineSimilarity and its
44
+ // published glue cannot be import()ed directly; adapt the shared loader
45
+ // to this module's interface.
46
+ const { getOnnxWasmEmbedder, loadOnnxWasmModule } = await import('../integrations/onnx-wasm-embedder.js');
47
+ const [mod, embedder] = await Promise.all([loadOnnxWasmModule(), getOnnxWasmEmbedder()]);
48
+ if (!mod || !embedder)
49
+ throw new Error('ruvector-onnx-embeddings-wasm or its model is unavailable');
50
+ wasmModule = {
51
+ embed: (text) => embedder.embed(text),
52
+ embedBatch: (texts) => embedder.embedBatch(texts),
53
+ similarity: async (a, b) => mod.cosineSimilarity(await embedder.embed(a), await embedder.embed(b)),
54
+ cosineSimilarity: (a, b) => mod.cosineSimilarity(a, b),
55
+ loadModel: async () => { },
56
+ isModelLoaded: () => true,
57
+ getModelInfo: () => ({ name: 'all-MiniLM-L6-v2', dimension: embedder.dimension, vocabSize: 30522, maxSequenceLength: 256 }),
58
+ isAvailable: () => true,
59
+ isSIMDEnabled: () => Boolean(mod.simd_available?.()),
60
+ getVersion: () => mod.version(),
61
+ initialize: async () => { },
62
+ shutdown: async () => { },
63
+ };
53
64
  initialized = true;
54
65
  logger.info('ONNX Embeddings WASM initialized', {
55
66
  version: wasmModule.getVersion?.() || 'unknown',
@@ -1 +1 @@
1
- {"version":3,"file":"onnx-embeddings-wasm.js","sourceRoot":"","sources":["../../src/wasm/onnx-embeddings-wasm.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,eAAe;AACf,IAAI,UAAU,GAAgC,IAAI,CAAC;AACnD,IAAI,WAAW,GAAG,KAAK,CAAC;AACxB,IAAI,WAAW,GAA4B,IAAI,CAAC;AAyDhD,iBAAiB;AACjB,IAAI,KAAK,GAAG;IACV,eAAe,EAAE,CAAC;IAClB,cAAc,EAAE,CAAC;CAClB,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB;IAC1C,IAAI,WAAW;QAAE,OAAO,UAAU,KAAK,IAAI,CAAC;IAC5C,IAAI,WAAW;QAAE,OAAO,WAAW,CAAC;IAEpC,WAAW,GAAG,CAAC,KAAK,IAAI,EAAE;QACxB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,+BAA+B,CAAC,CAAC;YAC1D,UAAU,GAAG,GAAsC,CAAC;YAEpD,0BAA0B;YAC1B,IAAI,UAAU,CAAC,UAAU,EAAE,CAAC;gBAC1B,MAAM,UAAU,CAAC,UAAU,EAAE,CAAC;YAChC,CAAC;YAED,qBAAqB;YACrB,IAAI,UAAU,CAAC,SAAS,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,EAAE,EAAE,CAAC;gBAC1D,MAAM,UAAU,CAAC,SAAS,EAAE,CAAC;YAC/B,CAAC;YAED,WAAW,GAAG,IAAI,CAAC;YAEnB,MAAM,CAAC,IAAI,CAAC,kCAAkC,EAAE;gBAC9C,OAAO,EAAE,UAAU,CAAC,UAAU,EAAE,EAAE,IAAI,SAAS;gBAC/C,IAAI,EAAE,UAAU,CAAC,aAAa,EAAE,EAAE,IAAI,KAAK;gBAC3C,WAAW,EAAE,UAAU,CAAC,aAAa,EAAE,EAAE,IAAI,KAAK;aACnD,CAAC,CAAC;YAEH,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,oCAAoC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;YAC9D,WAAW,GAAG,IAAI,CAAC;YACnB,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC,CAAC,EAAE,CAAC;IAEL,OAAO,WAAW,CAAC;AACrB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB;IACjC,OAAO,UAAU,KAAK,IAAI,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,EAAE,IAAI,KAAK,CAAC,CAAC;AACtE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa;IAC3B,OAAO,UAAU,EAAE,aAAa,EAAE,EAAE,IAAI,KAAK,CAAC;AAChD,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,IAAY;IACtC,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,sBAAsB,EAAE,CAAC;IACjC,CAAC;IAED,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IAEpC,IAAI,UAAU,IAAI,UAAU,CAAC,aAAa,EAAE,EAAE,EAAE,CAAC;QAC/C,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC/C,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YAE7C,KAAK,CAAC,eAAe,EAAE,CAAC;YACxB,KAAK,CAAC,cAAc,IAAI,MAAM,CAAC;YAE/B,OAAO;gBACL,SAAS;gBACT,MAAM;gBACN,MAAM,EAAE,MAAM;aACf,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,CAAC,uCAAuC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QAClE,CAAC;IACH,CAAC;IAED,0CAA0C;IAC1C,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IACpC,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;IAE7C,KAAK,CAAC,eAAe,EAAE,CAAC;IACxB,KAAK,CAAC,cAAc,IAAI,MAAM,CAAC;IAE/B,OAAO;QACL,SAAS;QACT,MAAM;QACN,MAAM,EAAE,UAAU;KACnB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,KAAe;IAC9C,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,sBAAsB,EAAE,CAAC;IACjC,CAAC;IAED,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IAEpC,IAAI,UAAU,IAAI,UAAU,CAAC,UAAU,IAAI,UAAU,CAAC,aAAa,EAAE,EAAE,EAAE,CAAC;QACxE,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,MAAM,UAAU,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YACtD,MAAM,WAAW,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YAElD,KAAK,CAAC,eAAe,IAAI,KAAK,CAAC,MAAM,CAAC;YACtC,KAAK,CAAC,cAAc,IAAI,WAAW,CAAC;YAEpC,OAAO;gBACL,UAAU;gBACV,WAAW;gBACX,SAAS,EAAE,WAAW,GAAG,KAAK,CAAC,MAAM;gBACrC,MAAM,EAAE,MAAM;aACf,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,CAAC,6CAA6C,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QACxE,CAAC;IACH,CAAC;IAED,2CAA2C;IAC3C,MAAM,UAAU,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1D,MAAM,WAAW,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;IAElD,KAAK,CAAC,eAAe,IAAI,KAAK,CAAC,MAAM,CAAC;IACtC,KAAK,CAAC,cAAc,IAAI,WAAW,CAAC;IAEpC,OAAO;QACL,UAAU;QACV,WAAW;QACX,SAAS,EAAE,WAAW,GAAG,KAAK,CAAC,MAAM;QACrC,MAAM,EAAE,UAAU;KACnB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,KAAa,EAAE,KAAa;IAC3D,IAAI,UAAU,IAAI,UAAU,CAAC,UAAU,EAAE,CAAC;QACxC,IAAI,CAAC;YACH,OAAO,MAAM,UAAU,CAAC,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACnD,CAAC;QAAC,MAAM,CAAC;YACP,2BAA2B;QAC7B,CAAC;IACH,CAAC;IAED,WAAW;IACX,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC3E,OAAO,gBAAgB,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;AAChE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,CAAe,EAAE,CAAe;IAC/D,IAAI,UAAU,EAAE,gBAAgB,EAAE,CAAC;QACjC,OAAO,UAAU,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC3C,CAAC;IAED,cAAc;IACd,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,KAAK,GAAG,CAAC,CAAC;IAEd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACnB,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACrB,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACvB,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACxD,OAAO,WAAW,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,WAAW,CAAC;AACnD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,QAAQ;IACtB,MAAM,SAAS,GAAG,UAAU,EAAE,YAAY,EAAE,EAAE,CAAC;IAE/C,OAAO;QACL,SAAS,EAAE,mBAAmB,EAAE;QAChC,WAAW,EAAE,aAAa,EAAE;QAC5B,WAAW,EAAE,UAAU,EAAE,aAAa,EAAE,EAAE,IAAI,KAAK;QACnD,SAAS;QACT,eAAe,EAAE,KAAK,CAAC,eAAe;QACtC,cAAc,EAAE,KAAK,CAAC,cAAc;QACpC,YAAY,EAAE,KAAK,CAAC,eAAe,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,cAAc,GAAG,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;KAC3F,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ;IAC5B,IAAI,UAAU,EAAE,QAAQ,EAAE,CAAC;QACzB,MAAM,UAAU,CAAC,QAAQ,EAAE,CAAC;IAC9B,CAAC;IACD,UAAU,GAAG,IAAI,CAAC;IAClB,WAAW,GAAG,KAAK,CAAC;IACpB,WAAW,GAAG,IAAI,CAAC;AACrB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU;IACxB,KAAK,GAAG,EAAE,eAAe,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE,CAAC;AACpD,CAAC;AAED;;;GAGG;AACH,SAAS,WAAW,CAAC,IAAY,EAAE,MAAc,GAAG;IAClD,MAAM,SAAS,GAAG,IAAI,YAAY,CAAC,GAAG,CAAC,CAAC;IAExC,0CAA0C;IAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAChC,SAAS,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,IAAI,GAAG,GAAG,CAAC;QACjC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;QAC/C,SAAS,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;IAClD,CAAC;IAED,YAAY;IACZ,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7B,IAAI,IAAI,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;IACtC,CAAC;IACD,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7B,SAAS,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;IACvB,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;GAEG;AACH,MAAM,OAAO,kBAAkB;IACrB,WAAW,GAAG,KAAK,CAAC;IAE5B,KAAK,CAAC,IAAI;QACR,IAAI,CAAC,WAAW,GAAG,MAAM,sBAAsB,EAAE,CAAC;QAClD,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,IAAY;QACtB,IAAI,CAAC,IAAI,CAAC,WAAW;YAAE,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QACzC,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,KAAe;QAC9B,IAAI,CAAC,IAAI,CAAC,WAAW;YAAE,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QACzC,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,KAAa,EAAE,KAAa;QAC3C,IAAI,CAAC,IAAI,CAAC,WAAW;YAAE,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QACzC,OAAO,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAClC,CAAC;IAED,gBAAgB,CAAC,CAAe,EAAE,CAAe;QAC/C,OAAO,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAChC,CAAC;IAED,WAAW;QACT,OAAO,mBAAmB,EAAE,CAAC;IAC/B,CAAC;IAED,aAAa;QACX,OAAO,aAAa,EAAE,CAAC;IACzB,CAAC;IAED,QAAQ;QACN,OAAO,QAAQ,EAAE,CAAC;IACpB,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,MAAM,QAAQ,EAAE,CAAC;QACjB,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;IAC3B,CAAC;CACF;AAED,qBAAqB;AACrB,IAAI,QAAQ,GAA8B,IAAI,CAAC;AAE/C;;GAEG;AACH,MAAM,UAAU,qBAAqB;IACnC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,QAAQ,GAAG,IAAI,kBAAkB,EAAE,CAAC;IACtC,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,eAAe;IACb,kBAAkB;IAClB,qBAAqB;IACrB,sBAAsB;IACtB,mBAAmB;IACnB,aAAa;IACb,KAAK;IACL,UAAU;IACV,UAAU;IACV,gBAAgB;IAChB,QAAQ;IACR,QAAQ;IACR,UAAU;CACX,CAAC","sourcesContent":["/**\n * ONNX Embeddings WASM Integration\n *\n * Provides browser-compatible embeddings using ruvector-onnx-embeddings-wasm.\n *\n * Features:\n * - Pure WASM: No native dependencies, runs in browser\n * - all-MiniLM-L6-v2: 384-dimensional semantic embeddings\n * - SIMD Acceleration: Uses WebAssembly SIMD when available\n * - Small Bundle: Optimized WASM binary size\n *\n * Use Cases:\n * - Browser-based semantic search\n * - Client-side RAG applications\n * - Edge computing (Cloudflare Workers, Deno Deploy)\n * - Offline-first applications\n *\n * Performance:\n * - ~50ms per embedding (SIMD enabled)\n * - ~200ms per embedding (SIMD disabled)\n * - Batch processing: ~30ms per embedding\n */\n\nimport { logger } from '../utils/logger.js';\n\n// Module state\nlet wasmModule: OnnxEmbeddingsModule | null = null;\nlet initialized = false;\nlet initPromise: Promise<boolean> | null = null;\n\n/**\n * ONNX Embeddings WASM module interface\n */\ninterface OnnxEmbeddingsModule {\n // Core functions\n embed: (text: string) => Promise<Float32Array>;\n embedBatch: (texts: string[]) => Promise<Float32Array[]>;\n similarity: (text1: string, text2: string) => Promise<number>;\n cosineSimilarity: (a: Float32Array, b: Float32Array) => number;\n\n // Model management\n loadModel: (modelPath?: string) => Promise<void>;\n isModelLoaded: () => boolean;\n getModelInfo: () => ModelInfo;\n\n // Utilities\n isAvailable: () => boolean;\n isSIMDEnabled: () => boolean;\n getVersion: () => string;\n\n // Lifecycle\n initialize: () => Promise<void>;\n shutdown: () => Promise<void>;\n}\n\ninterface ModelInfo {\n name: string;\n dimension: number;\n vocabSize: number;\n maxSequenceLength: number;\n}\n\nexport interface OnnxEmbeddingResult {\n embedding: Float32Array;\n timeMs: number;\n source: 'wasm' | 'fallback';\n}\n\nexport interface OnnxBatchResult {\n embeddings: Float32Array[];\n totalTimeMs: number;\n avgTimeMs: number;\n source: 'wasm' | 'fallback';\n}\n\nexport interface OnnxEmbeddingsStats {\n available: boolean;\n simdEnabled: boolean;\n modelLoaded: boolean;\n modelInfo?: ModelInfo;\n totalEmbeddings: number;\n totalLatencyMs: number;\n avgLatencyMs: number;\n}\n\n// Stats tracking\nlet stats = {\n totalEmbeddings: 0,\n totalLatencyMs: 0,\n};\n\n/**\n * Initialize ONNX Embeddings WASM module\n */\nexport async function initOnnxEmbeddingsWasm(): Promise<boolean> {\n if (initialized) return wasmModule !== null;\n if (initPromise) return initPromise;\n\n initPromise = (async () => {\n try {\n const mod = await import('ruvector-onnx-embeddings-wasm');\n wasmModule = mod as unknown as OnnxEmbeddingsModule;\n\n // Initialize WASM runtime\n if (wasmModule.initialize) {\n await wasmModule.initialize();\n }\n\n // Load default model\n if (wasmModule.loadModel && !wasmModule.isModelLoaded?.()) {\n await wasmModule.loadModel();\n }\n\n initialized = true;\n\n logger.info('ONNX Embeddings WASM initialized', {\n version: wasmModule.getVersion?.() || 'unknown',\n simd: wasmModule.isSIMDEnabled?.() ?? false,\n modelLoaded: wasmModule.isModelLoaded?.() ?? false,\n });\n\n return true;\n } catch (error) {\n logger.debug('ONNX Embeddings WASM not available', { error });\n initialized = true;\n return false;\n }\n })();\n\n return initPromise;\n}\n\n/**\n * Check if ONNX WASM embeddings are available\n */\nexport function isOnnxWasmAvailable(): boolean {\n return wasmModule !== null && (wasmModule.isAvailable?.() ?? false);\n}\n\n/**\n * Check if SIMD acceleration is enabled\n */\nexport function isSIMDEnabled(): boolean {\n return wasmModule?.isSIMDEnabled?.() ?? false;\n}\n\n/**\n * Generate embedding for text using WASM\n */\nexport async function embed(text: string): Promise<OnnxEmbeddingResult> {\n if (!initialized) {\n await initOnnxEmbeddingsWasm();\n }\n\n const startTime = performance.now();\n\n if (wasmModule && wasmModule.isModelLoaded?.()) {\n try {\n const embedding = await wasmModule.embed(text);\n const timeMs = performance.now() - startTime;\n\n stats.totalEmbeddings++;\n stats.totalLatencyMs += timeMs;\n\n return {\n embedding,\n timeMs,\n source: 'wasm',\n };\n } catch (error) {\n logger.warn('WASM embedding failed, using fallback', { error });\n }\n }\n\n // Fallback to simple hash-based embedding\n const embedding = simpleEmbed(text);\n const timeMs = performance.now() - startTime;\n\n stats.totalEmbeddings++;\n stats.totalLatencyMs += timeMs;\n\n return {\n embedding,\n timeMs,\n source: 'fallback',\n };\n}\n\n/**\n * Generate embeddings for multiple texts (batch processing)\n */\nexport async function embedBatch(texts: string[]): Promise<OnnxBatchResult> {\n if (!initialized) {\n await initOnnxEmbeddingsWasm();\n }\n\n const startTime = performance.now();\n\n if (wasmModule && wasmModule.embedBatch && wasmModule.isModelLoaded?.()) {\n try {\n const embeddings = await wasmModule.embedBatch(texts);\n const totalTimeMs = performance.now() - startTime;\n\n stats.totalEmbeddings += texts.length;\n stats.totalLatencyMs += totalTimeMs;\n\n return {\n embeddings,\n totalTimeMs,\n avgTimeMs: totalTimeMs / texts.length,\n source: 'wasm',\n };\n } catch (error) {\n logger.warn('WASM batch embedding failed, using fallback', { error });\n }\n }\n\n // Fallback to sequential simple embeddings\n const embeddings = texts.map((text) => simpleEmbed(text));\n const totalTimeMs = performance.now() - startTime;\n\n stats.totalEmbeddings += texts.length;\n stats.totalLatencyMs += totalTimeMs;\n\n return {\n embeddings,\n totalTimeMs,\n avgTimeMs: totalTimeMs / texts.length,\n source: 'fallback',\n };\n}\n\n/**\n * Compute similarity between two texts\n */\nexport async function similarity(text1: string, text2: string): Promise<number> {\n if (wasmModule && wasmModule.similarity) {\n try {\n return await wasmModule.similarity(text1, text2);\n } catch {\n // Fall through to fallback\n }\n }\n\n // Fallback\n const [result1, result2] = await Promise.all([embed(text1), embed(text2)]);\n return cosineSimilarity(result1.embedding, result2.embedding);\n}\n\n/**\n * Compute cosine similarity between two embeddings\n */\nexport function cosineSimilarity(a: Float32Array, b: Float32Array): number {\n if (wasmModule?.cosineSimilarity) {\n return wasmModule.cosineSimilarity(a, b);\n }\n\n // JS fallback\n let dot = 0;\n let normA = 0;\n let normB = 0;\n\n for (let i = 0; i < a.length; i++) {\n dot += a[i] * b[i];\n normA += a[i] * a[i];\n normB += b[i] * b[i];\n }\n\n const denominator = Math.sqrt(normA) * Math.sqrt(normB);\n return denominator === 0 ? 0 : dot / denominator;\n}\n\n/**\n * Get embedding statistics\n */\nexport function getStats(): OnnxEmbeddingsStats {\n const modelInfo = wasmModule?.getModelInfo?.();\n\n return {\n available: isOnnxWasmAvailable(),\n simdEnabled: isSIMDEnabled(),\n modelLoaded: wasmModule?.isModelLoaded?.() ?? false,\n modelInfo,\n totalEmbeddings: stats.totalEmbeddings,\n totalLatencyMs: stats.totalLatencyMs,\n avgLatencyMs: stats.totalEmbeddings > 0 ? stats.totalLatencyMs / stats.totalEmbeddings : 0,\n };\n}\n\n/**\n * Shutdown WASM module\n */\nexport async function shutdown(): Promise<void> {\n if (wasmModule?.shutdown) {\n await wasmModule.shutdown();\n }\n wasmModule = null;\n initialized = false;\n initPromise = null;\n}\n\n/**\n * Reset stats (for testing)\n */\nexport function resetStats(): void {\n stats = { totalEmbeddings: 0, totalLatencyMs: 0 };\n}\n\n/**\n * Simple hash-based embedding fallback\n * Not semantic, but provides consistent embeddings for testing\n */\nfunction simpleEmbed(text: string, dim: number = 384): Float32Array {\n const embedding = new Float32Array(dim);\n\n // Multi-pass hash for better distribution\n for (let i = 0; i < text.length; i++) {\n const code = text.charCodeAt(i);\n embedding[i % dim] += code / 255;\n embedding[(i * 7) % dim] += (code * 0.3) / 255;\n embedding[(i * 13) % dim] += (code * 0.2) / 255;\n }\n\n // Normalize\n let norm = 0;\n for (let i = 0; i < dim; i++) {\n norm += embedding[i] * embedding[i];\n }\n norm = Math.sqrt(norm) || 1;\n for (let i = 0; i < dim; i++) {\n embedding[i] /= norm;\n }\n\n return embedding;\n}\n\n/**\n * OnnxEmbeddingsWasm class for object-oriented usage\n */\nexport class OnnxEmbeddingsWasm {\n private initialized = false;\n\n async init(): Promise<boolean> {\n this.initialized = await initOnnxEmbeddingsWasm();\n return this.initialized;\n }\n\n async embed(text: string): Promise<OnnxEmbeddingResult> {\n if (!this.initialized) await this.init();\n return embed(text);\n }\n\n async embedBatch(texts: string[]): Promise<OnnxBatchResult> {\n if (!this.initialized) await this.init();\n return embedBatch(texts);\n }\n\n async similarity(text1: string, text2: string): Promise<number> {\n if (!this.initialized) await this.init();\n return similarity(text1, text2);\n }\n\n cosineSimilarity(a: Float32Array, b: Float32Array): number {\n return cosineSimilarity(a, b);\n }\n\n isAvailable(): boolean {\n return isOnnxWasmAvailable();\n }\n\n isSIMDEnabled(): boolean {\n return isSIMDEnabled();\n }\n\n getStats(): OnnxEmbeddingsStats {\n return getStats();\n }\n\n async shutdown(): Promise<void> {\n await shutdown();\n this.initialized = false;\n }\n}\n\n// Singleton instance\nlet instance: OnnxEmbeddingsWasm | null = null;\n\n/**\n * Get singleton OnnxEmbeddingsWasm instance\n */\nexport function getOnnxEmbeddingsWasm(): OnnxEmbeddingsWasm {\n if (!instance) {\n instance = new OnnxEmbeddingsWasm();\n }\n return instance;\n}\n\nexport default {\n OnnxEmbeddingsWasm,\n getOnnxEmbeddingsWasm,\n initOnnxEmbeddingsWasm,\n isOnnxWasmAvailable,\n isSIMDEnabled,\n embed,\n embedBatch,\n similarity,\n cosineSimilarity,\n getStats,\n shutdown,\n resetStats,\n};\n"]}
1
+ {"version":3,"file":"onnx-embeddings-wasm.js","sourceRoot":"","sources":["../../src/wasm/onnx-embeddings-wasm.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * ONNX Embeddings WASM Integration\n *\n * Provides browser-compatible embeddings using ruvector-onnx-embeddings-wasm.\n *\n * Features:\n * - Pure WASM: No native dependencies, runs in browser\n * - all-MiniLM-L6-v2: 384-dimensional semantic embeddings\n * - SIMD Acceleration: Uses WebAssembly SIMD when available\n * - Small Bundle: Optimized WASM binary size\n *\n * Use Cases:\n * - Browser-based semantic search\n * - Client-side RAG applications\n * - Edge computing (Cloudflare Workers, Deno Deploy)\n * - Offline-first applications\n *\n * Performance:\n * - ~50ms per embedding (SIMD enabled)\n * - ~200ms per embedding (SIMD disabled)\n * - Batch processing: ~30ms per embedding\n */\n\nimport { logger } from '../utils/logger.js';\n\n// Module state\nlet wasmModule: OnnxEmbeddingsModule | null = null;\nlet initialized = false;\nlet initPromise: Promise<boolean> | null = null;\n\n/**\n * ONNX Embeddings WASM module interface\n */\ninterface OnnxEmbeddingsModule {\n // Core functions\n embed: (text: string) => Promise<Float32Array>;\n embedBatch: (texts: string[]) => Promise<Float32Array[]>;\n similarity: (text1: string, text2: string) => Promise<number>;\n cosineSimilarity: (a: Float32Array, b: Float32Array) => number;\n\n // Model management\n loadModel: (modelPath?: string) => Promise<void>;\n isModelLoaded: () => boolean;\n getModelInfo: () => ModelInfo;\n\n // Utilities\n isAvailable: () => boolean;\n isSIMDEnabled: () => boolean;\n getVersion: () => string;\n\n // Lifecycle\n initialize: () => Promise<void>;\n shutdown: () => Promise<void>;\n}\n\ninterface ModelInfo {\n name: string;\n dimension: number;\n vocabSize: number;\n maxSequenceLength: number;\n}\n\nexport interface OnnxEmbeddingResult {\n embedding: Float32Array;\n timeMs: number;\n source: 'wasm' | 'fallback';\n}\n\nexport interface OnnxBatchResult {\n embeddings: Float32Array[];\n totalTimeMs: number;\n avgTimeMs: number;\n source: 'wasm' | 'fallback';\n}\n\nexport interface OnnxEmbeddingsStats {\n available: boolean;\n simdEnabled: boolean;\n modelLoaded: boolean;\n modelInfo?: ModelInfo;\n totalEmbeddings: number;\n totalLatencyMs: number;\n avgLatencyMs: number;\n}\n\n// Stats tracking\nlet stats = {\n totalEmbeddings: 0,\n totalLatencyMs: 0,\n};\n\n/**\n * Initialize ONNX Embeddings WASM module\n */\nexport async function initOnnxEmbeddingsWasm(): Promise<boolean> {\n if (initialized) return wasmModule !== null;\n if (initPromise) return initPromise;\n\n initPromise = (async () => {\n try {\n // The package's own exports are WasmEmbedder/cosineSimilarity and its\n // published glue cannot be import()ed directly; adapt the shared loader\n // to this module's interface.\n const { getOnnxWasmEmbedder, loadOnnxWasmModule } = await import('../integrations/onnx-wasm-embedder.js');\n const [mod, embedder] = await Promise.all([loadOnnxWasmModule(), getOnnxWasmEmbedder()]);\n if (!mod || !embedder) throw new Error('ruvector-onnx-embeddings-wasm or its model is unavailable');\n wasmModule = {\n embed: (text: string) => embedder.embed(text),\n embedBatch: (texts: string[]) => embedder.embedBatch(texts),\n similarity: async (a: string, b: string) =>\n mod.cosineSimilarity(await embedder.embed(a), await embedder.embed(b)),\n cosineSimilarity: (a: Float32Array, b: Float32Array) => mod.cosineSimilarity(a, b),\n loadModel: async () => {},\n isModelLoaded: () => true,\n getModelInfo: () => ({ name: 'all-MiniLM-L6-v2', dimension: embedder.dimension, vocabSize: 30522, maxSequenceLength: 256 }),\n isAvailable: () => true,\n isSIMDEnabled: () => Boolean((mod as any).simd_available?.()),\n getVersion: () => mod.version(),\n initialize: async () => {},\n shutdown: async () => {},\n };\n\n initialized = true;\n\n logger.info('ONNX Embeddings WASM initialized', {\n version: wasmModule.getVersion?.() || 'unknown',\n simd: wasmModule.isSIMDEnabled?.() ?? false,\n modelLoaded: wasmModule.isModelLoaded?.() ?? false,\n });\n\n return true;\n } catch (error) {\n logger.debug('ONNX Embeddings WASM not available', { error });\n initialized = true;\n return false;\n }\n })();\n\n return initPromise;\n}\n\n/**\n * Check if ONNX WASM embeddings are available\n */\nexport function isOnnxWasmAvailable(): boolean {\n return wasmModule !== null && (wasmModule.isAvailable?.() ?? false);\n}\n\n/**\n * Check if SIMD acceleration is enabled\n */\nexport function isSIMDEnabled(): boolean {\n return wasmModule?.isSIMDEnabled?.() ?? false;\n}\n\n/**\n * Generate embedding for text using WASM\n */\nexport async function embed(text: string): Promise<OnnxEmbeddingResult> {\n if (!initialized) {\n await initOnnxEmbeddingsWasm();\n }\n\n const startTime = performance.now();\n\n if (wasmModule && wasmModule.isModelLoaded?.()) {\n try {\n const embedding = await wasmModule.embed(text);\n const timeMs = performance.now() - startTime;\n\n stats.totalEmbeddings++;\n stats.totalLatencyMs += timeMs;\n\n return {\n embedding,\n timeMs,\n source: 'wasm',\n };\n } catch (error) {\n logger.warn('WASM embedding failed, using fallback', { error });\n }\n }\n\n // Fallback to simple hash-based embedding\n const embedding = simpleEmbed(text);\n const timeMs = performance.now() - startTime;\n\n stats.totalEmbeddings++;\n stats.totalLatencyMs += timeMs;\n\n return {\n embedding,\n timeMs,\n source: 'fallback',\n };\n}\n\n/**\n * Generate embeddings for multiple texts (batch processing)\n */\nexport async function embedBatch(texts: string[]): Promise<OnnxBatchResult> {\n if (!initialized) {\n await initOnnxEmbeddingsWasm();\n }\n\n const startTime = performance.now();\n\n if (wasmModule && wasmModule.embedBatch && wasmModule.isModelLoaded?.()) {\n try {\n const embeddings = await wasmModule.embedBatch(texts);\n const totalTimeMs = performance.now() - startTime;\n\n stats.totalEmbeddings += texts.length;\n stats.totalLatencyMs += totalTimeMs;\n\n return {\n embeddings,\n totalTimeMs,\n avgTimeMs: totalTimeMs / texts.length,\n source: 'wasm',\n };\n } catch (error) {\n logger.warn('WASM batch embedding failed, using fallback', { error });\n }\n }\n\n // Fallback to sequential simple embeddings\n const embeddings = texts.map((text) => simpleEmbed(text));\n const totalTimeMs = performance.now() - startTime;\n\n stats.totalEmbeddings += texts.length;\n stats.totalLatencyMs += totalTimeMs;\n\n return {\n embeddings,\n totalTimeMs,\n avgTimeMs: totalTimeMs / texts.length,\n source: 'fallback',\n };\n}\n\n/**\n * Compute similarity between two texts\n */\nexport async function similarity(text1: string, text2: string): Promise<number> {\n if (wasmModule && wasmModule.similarity) {\n try {\n return await wasmModule.similarity(text1, text2);\n } catch {\n // Fall through to fallback\n }\n }\n\n // Fallback\n const [result1, result2] = await Promise.all([embed(text1), embed(text2)]);\n return cosineSimilarity(result1.embedding, result2.embedding);\n}\n\n/**\n * Compute cosine similarity between two embeddings\n */\nexport function cosineSimilarity(a: Float32Array, b: Float32Array): number {\n if (wasmModule?.cosineSimilarity) {\n return wasmModule.cosineSimilarity(a, b);\n }\n\n // JS fallback\n let dot = 0;\n let normA = 0;\n let normB = 0;\n\n for (let i = 0; i < a.length; i++) {\n dot += a[i] * b[i];\n normA += a[i] * a[i];\n normB += b[i] * b[i];\n }\n\n const denominator = Math.sqrt(normA) * Math.sqrt(normB);\n return denominator === 0 ? 0 : dot / denominator;\n}\n\n/**\n * Get embedding statistics\n */\nexport function getStats(): OnnxEmbeddingsStats {\n const modelInfo = wasmModule?.getModelInfo?.();\n\n return {\n available: isOnnxWasmAvailable(),\n simdEnabled: isSIMDEnabled(),\n modelLoaded: wasmModule?.isModelLoaded?.() ?? false,\n modelInfo,\n totalEmbeddings: stats.totalEmbeddings,\n totalLatencyMs: stats.totalLatencyMs,\n avgLatencyMs: stats.totalEmbeddings > 0 ? stats.totalLatencyMs / stats.totalEmbeddings : 0,\n };\n}\n\n/**\n * Shutdown WASM module\n */\nexport async function shutdown(): Promise<void> {\n if (wasmModule?.shutdown) {\n await wasmModule.shutdown();\n }\n wasmModule = null;\n initialized = false;\n initPromise = null;\n}\n\n/**\n * Reset stats (for testing)\n */\nexport function resetStats(): void {\n stats = { totalEmbeddings: 0, totalLatencyMs: 0 };\n}\n\n/**\n * Simple hash-based embedding fallback\n * Not semantic, but provides consistent embeddings for testing\n */\nfunction simpleEmbed(text: string, dim: number = 384): Float32Array {\n const embedding = new Float32Array(dim);\n\n // Multi-pass hash for better distribution\n for (let i = 0; i < text.length; i++) {\n const code = text.charCodeAt(i);\n embedding[i % dim] += code / 255;\n embedding[(i * 7) % dim] += (code * 0.3) / 255;\n embedding[(i * 13) % dim] += (code * 0.2) / 255;\n }\n\n // Normalize\n let norm = 0;\n for (let i = 0; i < dim; i++) {\n norm += embedding[i] * embedding[i];\n }\n norm = Math.sqrt(norm) || 1;\n for (let i = 0; i < dim; i++) {\n embedding[i] /= norm;\n }\n\n return embedding;\n}\n\n/**\n * OnnxEmbeddingsWasm class for object-oriented usage\n */\nexport class OnnxEmbeddingsWasm {\n private initialized = false;\n\n async init(): Promise<boolean> {\n this.initialized = await initOnnxEmbeddingsWasm();\n return this.initialized;\n }\n\n async embed(text: string): Promise<OnnxEmbeddingResult> {\n if (!this.initialized) await this.init();\n return embed(text);\n }\n\n async embedBatch(texts: string[]): Promise<OnnxBatchResult> {\n if (!this.initialized) await this.init();\n return embedBatch(texts);\n }\n\n async similarity(text1: string, text2: string): Promise<number> {\n if (!this.initialized) await this.init();\n return similarity(text1, text2);\n }\n\n cosineSimilarity(a: Float32Array, b: Float32Array): number {\n return cosineSimilarity(a, b);\n }\n\n isAvailable(): boolean {\n return isOnnxWasmAvailable();\n }\n\n isSIMDEnabled(): boolean {\n return isSIMDEnabled();\n }\n\n getStats(): OnnxEmbeddingsStats {\n return getStats();\n }\n\n async shutdown(): Promise<void> {\n await shutdown();\n this.initialized = false;\n }\n}\n\n// Singleton instance\nlet instance: OnnxEmbeddingsWasm | null = null;\n\n/**\n * Get singleton OnnxEmbeddingsWasm instance\n */\nexport function getOnnxEmbeddingsWasm(): OnnxEmbeddingsWasm {\n if (!instance) {\n instance = new OnnxEmbeddingsWasm();\n }\n return instance;\n}\n\nexport default {\n OnnxEmbeddingsWasm,\n getOnnxEmbeddingsWasm,\n initOnnxEmbeddingsWasm,\n isOnnxWasmAvailable,\n isSIMDEnabled,\n embed,\n embedBatch,\n similarity,\n cosineSimilarity,\n getStats,\n shutdown,\n resetStats,\n};\n"]}
@@ -6,8 +6,8 @@ RUN apk add --no-cache python3 make g++ sqlite sqlite-dev
6
6
  WORKDIR /test
7
7
 
8
8
  RUN echo "========================================" && \
9
- echo "Testing npx agentic-flow@latest" && \
9
+ echo "Testing npx agentic-flow@1.7.8" && \
10
10
  echo "========================================" && \
11
- npx agentic-flow@latest --version 2>&1 | head -20
11
+ npx agentic-flow@1.7.8 --version 2>&1 | head -20
12
12
 
13
13
  CMD ["echo", "✅ Test complete"]
@@ -6,8 +6,8 @@ RUN apk add --no-cache python3 make g++ sqlite sqlite-dev
6
6
  WORKDIR /test
7
7
 
8
8
  RUN echo "========================================" && \
9
- echo "Testing npx agentic-flow@latest with Node 20" && \
9
+ echo "Testing npx agentic-flow@1.7.9 with Node 20" && \
10
10
  echo "========================================" && \
11
- npx agentic-flow@latest --version 2>&1
11
+ npx agentic-flow@1.7.9 --version 2>&1
12
12
 
13
13
  CMD ["echo", "✅ Test complete"]
@@ -6,9 +6,9 @@ RUN apk add --no-cache python3 make g++ sqlite sqlite-dev
6
6
  WORKDIR /test
7
7
 
8
8
  RUN echo "========================================" && \
9
- echo "Testing npx agentic-flow@latest" && \
9
+ echo "Testing npx agentic-flow@1.7.9" && \
10
10
  echo "Expecting v1.7.9 with better-sqlite3 v11.x" && \
11
11
  echo "========================================" && \
12
- npx agentic-flow@latest --version 2>&1 | head -20
12
+ npx agentic-flow@1.7.9 --version 2>&1 | head -20
13
13
 
14
14
  CMD ["echo", "✅ Test complete"]
@@ -31,18 +31,29 @@ This command:
31
31
 
32
32
  **Terminal 1 - Start Proxy:**
33
33
  ```bash
34
+ export OPENROUTER_API_KEY=sk-or-v1-...
34
35
  npx agentic-flow proxy --provider openrouter --port 3000
36
+ # Prints: export ANTHROPIC_API_KEY=sk-ant-proxy-... (a new token every run)
35
37
  ```
36
38
 
37
39
  **Terminal 2 - Use Claude Code:**
38
40
  ```bash
39
41
  # Inline environment variables (cleanest native approach)
40
42
  ANTHROPIC_BASE_URL=http://localhost:3000 \
41
- ANTHROPIC_API_KEY=sk-ant-proxy-dummy \
42
- OPENROUTER_API_KEY=$OPENROUTER_API_KEY \
43
+ ANTHROPIC_API_KEY='<token printed by the proxy>' \
43
44
  claude "Write a Python function to sort a list"
44
45
  ```
45
46
 
47
+ The provider key stays with the proxy; Claude Code only needs the proxy token.
48
+
49
+ **Authentication (3.0.0+).** The proxy binds `127.0.0.1` and rejects any
50
+ `/v1/messages` request without its token, so nobody else on your network can
51
+ spend your provider key. On start it prints a random per-run token; pass it as
52
+ `ANTHROPIC_API_KEY` (sent as `x-api-key`) or as `Authorization: Bearer`. To
53
+ keep the same token across restarts, set `AGENTIC_FLOW_PROXY_TOKEN` before
54
+ starting the proxy and use that value. `AGENTIC_FLOW_PROXY_HOST` changes the
55
+ bind address; only widen it on a network you trust. `/health` needs no token.
56
+
46
57
  ---
47
58
 
48
59
  ### Option 3: Bash Wrapper Script
@@ -232,8 +243,7 @@ npx agentic-flow claude-code \
232
243
  4. **Wrapper spawns Claude Code with env:**
233
244
  ```bash
234
245
  ANTHROPIC_BASE_URL=http://localhost:3000
235
- ANTHROPIC_API_KEY=sk-ant-proxy-dummy
236
- OPENROUTER_API_KEY=sk-or-v1-xxxxx
246
+ ANTHROPIC_API_KEY=<the proxy's per-run token>
237
247
  claude "task"
238
248
  ```
239
249
 
@@ -309,7 +319,7 @@ VERBOSE=true npx agentic-flow proxy --provider openrouter
309
319
  # In another terminal, test with curl
310
320
  curl -X POST http://localhost:3000/v1/messages \
311
321
  -H "Content-Type: application/json" \
312
- -H "x-api-key: sk-ant-proxy-dummy" \
322
+ -H "x-api-key: <token printed by the proxy>" \
313
323
  -d '{"model":"claude-3-5-sonnet-20241022","messages":[{"role":"user","content":"hello"}],"max_tokens":100}'
314
324
  ```
315
325
 
@@ -361,14 +371,21 @@ proxy.start(3000);
361
371
 
362
372
  ### Environment Variable Presets
363
373
 
364
- Create `~/.agentic-flow-presets`:
374
+ Create `~/.agentic-flow-presets`. The proxies require a token, so give each
375
+ one a fixed token with `AGENTIC_FLOW_PROXY_TOKEN` when you start it and reuse
376
+ it here:
365
377
 
366
378
  ```bash
379
+ # Start the proxies with a stable token, e.g.
380
+ # AGENTIC_FLOW_PROXY_TOKEN=$AF_PROXY_TOKEN npx agentic-flow proxy --provider openrouter --port 3000
381
+ # AGENTIC_FLOW_PROXY_TOKEN=$AF_PROXY_TOKEN npx agentic-flow proxy --provider gemini --port 3001
382
+ export AF_PROXY_TOKEN="sk-ant-proxy-$(openssl rand -hex 32)"
383
+
367
384
  # OpenRouter preset
368
- alias claude-openrouter='ANTHROPIC_BASE_URL=http://localhost:3000 ANTHROPIC_API_KEY=dummy claude'
385
+ alias claude-openrouter='ANTHROPIC_BASE_URL=http://localhost:3000 ANTHROPIC_API_KEY=$AF_PROXY_TOKEN claude'
369
386
 
370
387
  # Gemini preset
371
- alias claude-gemini='ANTHROPIC_BASE_URL=http://localhost:3001 ANTHROPIC_API_KEY=dummy claude'
388
+ alias claude-gemini='ANTHROPIC_BASE_URL=http://localhost:3001 ANTHROPIC_API_KEY=$AF_PROXY_TOKEN claude'
372
389
 
373
390
  # Usage
374
391
  claude-openrouter "Write code"
@@ -110,6 +110,7 @@ private convertOpenAIStreamToAnthropic(chunk: string): string {
110
110
  ```typescript
111
111
  import express, { Request, Response } from 'express';
112
112
  import { logger } from '../utils/logger.js';
113
+ import { createProxyAuthMiddleware, resolveProxyHost, resolveProxyToken } from './proxy-auth.js';
113
114
 
114
115
  interface MistralMessage {
115
116
  role: 'system' | 'user' | 'assistant';
@@ -124,18 +125,23 @@ interface MistralRequest {
124
125
  stream?: boolean;
125
126
  }
126
127
 
128
+ // Every proxy that holds an upstream key must bind loopback and require a
129
+ // token (3.0.0+). proxy-auth.ts gives you both.
127
130
  export class AnthropicToMistralProxy {
128
131
  private app: express.Application;
129
132
  private mistralApiKey: string;
130
133
  private mistralBaseUrl: string;
131
134
  private defaultModel: string;
135
+ private authToken: string;
132
136
 
133
137
  constructor(config: {
134
138
  mistralApiKey: string;
135
139
  mistralBaseUrl?: string;
136
140
  defaultModel?: string;
141
+ authToken?: string; // default: AGENTIC_FLOW_PROXY_TOKEN or a random token
137
142
  }) {
138
143
  this.app = express();
144
+ this.authToken = config.authToken || resolveProxyToken();
139
145
  this.mistralApiKey = config.mistralApiKey;
140
146
  this.mistralBaseUrl = config.mistralBaseUrl || 'https://api.mistral.ai/v1';
141
147
  this.defaultModel = config.defaultModel || 'mistral-large-latest';
@@ -144,7 +150,13 @@ export class AnthropicToMistralProxy {
144
150
  this.setupRoutes();
145
151
  }
146
152
 
153
+ public getAuthToken(): string {
154
+ return this.authToken;
155
+ }
156
+
147
157
  private setupMiddleware(): void {
158
+ // Reject callers without the token before parsing their body. /health stays open.
159
+ this.app.use(createProxyAuthMiddleware(this.authToken));
148
160
  this.app.use(express.json({ limit: '50mb' }));
149
161
  }
150
162
 
@@ -246,10 +258,11 @@ export class AnthropicToMistralProxy {
246
258
  };
247
259
  }
248
260
 
249
- public start(port: number): void {
250
- this.app.listen(port, () => {
251
- logger.info('Mistral proxy started', { port });
252
- console.log(`\n✅ Mistral Proxy running at http://localhost:${port}\n`);
261
+ public start(port: number, host: string = resolveProxyHost()): void {
262
+ this.app.listen(port, host, () => {
263
+ logger.info('Mistral proxy started', { port, host });
264
+ console.log(`\n✅ Mistral Proxy running at http://${host}:${port}`);
265
+ console.log(` export ANTHROPIC_API_KEY=${this.authToken}\n`);
253
266
  });
254
267
  }
255
268
  }
@@ -283,7 +296,7 @@ node dist/proxy/anthropic-to-mistral.js
283
296
 
284
297
  # Terminal 2: Use with Claude Code
285
298
  export ANTHROPIC_BASE_URL=http://localhost:3000
286
- export ANTHROPIC_API_KEY=dummy-key
299
+ export ANTHROPIC_API_KEY='<token printed by the proxy>'
287
300
  npx agentic-flow --agent coder --task "Write hello world"
288
301
  ```
289
302
 
@@ -440,7 +453,7 @@ node dist/proxy/anthropic-to-ollama.js
440
453
 
441
454
  # Terminal 2: Use with agents
442
455
  export ANTHROPIC_BASE_URL=http://localhost:3000
443
- export ANTHROPIC_API_KEY=dummy-key
456
+ export ANTHROPIC_API_KEY='<token printed by the proxy>'
444
457
  npx agentic-flow --agent coder --task "Write hello world"
445
458
  ```
446
459
 
@@ -621,7 +634,7 @@ describe('Mistral Proxy', () => {
621
634
  it('should convert Anthropic request to Mistral format', async () => {
622
635
  const response = await fetch(`http://localhost:${port}/v1/messages`, {
623
636
  method: 'POST',
624
- headers: { 'Content-Type': 'application/json' },
637
+ headers: { 'Content-Type': 'application/json', 'x-api-key': proxy.getAuthToken() },
625
638
  body: JSON.stringify({
626
639
  model: 'claude-3-5-sonnet-20241022',
627
640
  messages: [{ role: 'user', content: 'Hello!' }],
@@ -672,9 +685,9 @@ if (options.provider === 'mistral' || process.env.USE_MISTRAL) {
672
685
  });
673
686
  proxy.start(3000);
674
687
 
675
- // Set environment for SDK
688
+ // Set environment for SDK; the proxy rejects requests without its token
676
689
  process.env.ANTHROPIC_BASE_URL = 'http://localhost:3000';
677
- process.env.ANTHROPIC_API_KEY = 'dummy-key';
690
+ process.env.ANTHROPIC_API_KEY = proxy.getAuthToken();
678
691
  }
679
692
  ```
680
693
 
@@ -52,7 +52,7 @@ npx agentic-flow proxy --provider openrouter
52
52
  ```bash
53
53
  # Point Claude Code to the proxy
54
54
  export ANTHROPIC_BASE_URL=http://localhost:3000
55
- export ANTHROPIC_API_KEY=sk-ant-proxy-dummy-key # Any value works
55
+ export ANTHROPIC_API_KEY='<token printed by the proxy>' # required; see below
56
56
 
57
57
  # Now use Claude Code normally
58
58
  claude
@@ -63,6 +63,14 @@ claude --agent coder --task "Create a REST API in Python"
63
63
 
64
64
  **That's it!** Claude Code will now route all requests through the proxy, using Gemini or OpenRouter instead of Anthropic.
65
65
 
66
+ **Authentication (3.0.0+).** The proxy binds `127.0.0.1` and rejects any
67
+ `/v1/messages` request without its token, so nobody else on your network can
68
+ spend your provider key. On start it prints a random per-run token; pass it as
69
+ `ANTHROPIC_API_KEY` (sent as `x-api-key`) or as `Authorization: Bearer`. To
70
+ keep the same token across restarts, set `AGENTIC_FLOW_PROXY_TOKEN` before
71
+ starting the proxy and use that value. `AGENTIC_FLOW_PROXY_HOST` changes the
72
+ bind address; only widen it on a network you trust. `/health` needs no token.
73
+
66
74
  ## Usage with Cursor IDE
67
75
 
68
76
  **Status:** Cursor does not currently support custom `ANTHROPIC_BASE_URL` for Anthropic models.
@@ -79,7 +87,7 @@ npx agentic-flow proxy
79
87
  # Configure Cursor
80
88
  Settings → API Keys
81
89
  Anthropic Base URL: http://localhost:3000
82
- Anthropic API Key: sk-ant-proxy-dummy-key
90
+ Anthropic API Key: <token printed by the proxy>
83
91
  ```
84
92
 
85
93
  ## Full Command Reference
@@ -106,6 +114,8 @@ npx agentic-flow proxy [OPTIONS]
106
114
  | `GOOGLE_GEMINI_API_KEY` | Gemini | Your Google Gemini API key |
107
115
  | `OPENROUTER_API_KEY` | OpenRouter | Your OpenRouter API key |
108
116
  | `COMPLETION_MODEL` | Optional | Override default model |
117
+ | `AGENTIC_FLOW_PROXY_TOKEN` | Optional | Token clients must send (default: random per run, printed on start) |
118
+ | `AGENTIC_FLOW_PROXY_HOST` | Optional | Bind address (default: `127.0.0.1`) |
109
119
 
110
120
  ## Examples
111
121
 
@@ -117,7 +127,7 @@ npx agentic-flow proxy --port 8080
117
127
 
118
128
  # In another terminal
119
129
  export ANTHROPIC_BASE_URL=http://localhost:8080
120
- export ANTHROPIC_API_KEY=sk-ant-proxy-dummy-key
130
+ export ANTHROPIC_API_KEY='<token printed by the proxy>'
121
131
  claude
122
132
  ```
123
133
 
@@ -129,7 +139,7 @@ npx agentic-flow proxy --provider openrouter --model "anthropic/claude-3.5-sonne
129
139
 
130
140
  # Use Claude Code
131
141
  export ANTHROPIC_BASE_URL=http://localhost:3000
132
- export ANTHROPIC_API_KEY=sk-ant-proxy-dummy-key
142
+ export ANTHROPIC_API_KEY='<token printed by the proxy>'
133
143
  claude --agent researcher --task "Analyze market trends"
134
144
  ```
135
145
 
@@ -141,7 +151,7 @@ npx agentic-flow proxy --provider openrouter --model "deepseek/deepseek-chat-v3.
141
151
 
142
152
  # 98% cost savings vs Claude Sonnet!
143
153
  export ANTHROPIC_BASE_URL=http://localhost:3000
144
- export ANTHROPIC_API_KEY=sk-ant-proxy-dummy-key
154
+ export ANTHROPIC_API_KEY='<token printed by the proxy>'
145
155
  claude --agent coder --task "Build a web scraper"
146
156
  ```
147
157
 
@@ -233,7 +243,7 @@ npx agentic-flow proxy
233
243
  # Enable MCP in Claude Code
234
244
  export ENABLE_CLAUDE_FLOW_SDK=true
235
245
  export ANTHROPIC_BASE_URL=http://localhost:3000
236
- export ANTHROPIC_API_KEY=sk-ant-proxy-dummy-key
246
+ export ANTHROPIC_API_KEY='<token printed by the proxy>'
237
247
 
238
248
  # MCP tools will be forwarded to Gemini/OpenRouter
239
249
  claude --agent coder --task "Use memory_store to save config"
@@ -367,7 +367,7 @@ npm run build
367
367
  npm publish
368
368
 
369
369
  # Users can then use:
370
- npx agentic-flow@latest mcp start
370
+ npx agentic-flow@3.2.0 mcp start
371
371
  ```
372
372
 
373
373
  ## 🚀 Advanced Usage