agentic-flow 2.1.2 โ†’ 2.1.3

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 (34) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/agents/claudeAgentDirect.js +4 -4
  3. package/dist/agents/claudeAgentDirect.js.map +1 -1
  4. package/dist/billing/cli.js +0 -0
  5. package/dist/cli-proxy.js +67 -3
  6. package/dist/cli-proxy.js.map +1 -1
  7. package/dist/config/claudeFlow.d.ts +1 -1
  8. package/dist/optimizations/configuration-tuning.d.ts +1 -1
  9. package/dist/router/providers/onnx-local-optimized.d.ts +10 -1
  10. package/dist/router/providers/onnx-local-optimized.d.ts.map +1 -1
  11. package/dist/router/providers/onnx-local-optimized.js +12 -10
  12. package/dist/router/providers/onnx-local-optimized.js.map +1 -1
  13. package/dist/router/providers/onnx-local.d.ts +9 -0
  14. package/dist/router/providers/onnx-local.d.ts.map +1 -1
  15. package/dist/router/providers/onnx-local.js +24 -9
  16. package/dist/router/providers/onnx-local.js.map +1 -1
  17. package/dist/router/providers/onnx-phi4.d.ts.map +1 -1
  18. package/dist/router/providers/onnx-phi4.js +2 -1
  19. package/dist/router/providers/onnx-phi4.js.map +1 -1
  20. package/dist/router/router.d.ts.map +1 -1
  21. package/dist/router/router.js +2 -1
  22. package/dist/router/router.js.map +1 -1
  23. package/dist/router/test-onnx-benchmark.js +2 -1
  24. package/dist/router/test-onnx-benchmark.js.map +1 -1
  25. package/dist/router/test-onnx-local.js +2 -1
  26. package/dist/router/test-onnx-local.js.map +1 -1
  27. package/dist/utils/model-downloader.d.ts +14 -0
  28. package/dist/utils/model-downloader.d.ts.map +1 -1
  29. package/dist/utils/model-downloader.js +19 -3
  30. package/dist/utils/model-downloader.js.map +1 -1
  31. package/package.json +1 -1
  32. package/wasm/reasoningbank/reasoningbank_wasm_bg.js +32 -32
  33. package/wasm/reasoningbank/reasoningbank_wasm_bg.wasm +0 -0
  34. package/wasm/reasoningbank/reasoningbank_wasm_bg.wasm.d.ts +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"test-onnx-benchmark.js","sourceRoot":"","sources":["../../src/router/test-onnx-benchmark.ts"],"names":[],"mappings":"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","sourcesContent":["#!/usr/bin/env node\n/**\n * Comprehensive benchmark for ONNX local inference\n * Tests CPU performance against targets\n */\n\nimport { ONNXLocalProvider } from './providers/onnx-local.js';\n\ninterface BenchmarkResult {\n test: string;\n tokens: number;\n latency: number;\n tokensPerSecond: number;\n}\n\nasync function runBenchmark() {\n console.log('๐Ÿ ONNX Local Inference Benchmark (Phi-4 CPU)\\n');\n console.log('Target: 15-25 tokens/sec on CPU');\n console.log('================================================\\n');\n\n const provider = new ONNXLocalProvider({\n modelPath: './models/phi-4/cpu_and_mobile/cpu-int4-rtn-block-32-acc-level-4/model.onnx',\n executionProviders: ['cpu'],\n maxTokens: 50,\n temperature: 0.7\n });\n\n const results: BenchmarkResult[] = [];\n\n // Test 1: Short response\n console.log('Test 1: Short Response (Math)');\n console.log('==============================');\n\n const test1Start = Date.now();\n const response1 = await provider.chat({\n model: 'phi-4',\n messages: [\n { role: 'user', content: 'What is 2+2?' }\n ],\n maxTokens: 20\n });\n const test1Latency = Date.now() - test1Start;\n const test1TPS = (response1.usage?.outputTokens || 0) / (test1Latency / 1000);\n\n console.log(`โœ… Response: ${response1.content[0].type === 'text' ? response1.content[0].text : ''}`);\n console.log(`โฑ๏ธ ${test1Latency}ms | ${test1TPS.toFixed(1)} tokens/sec\\n`);\n\n results.push({\n test: 'Short Math',\n tokens: response1.usage?.outputTokens || 0,\n latency: test1Latency,\n tokensPerSecond: test1TPS\n });\n\n // Test 2: Medium response\n console.log('Test 2: Medium Response (Reasoning)');\n console.log('=====================================');\n\n const test2Start = Date.now();\n const response2 = await provider.chat({\n model: 'phi-4',\n messages: [\n { role: 'user', content: 'Explain why the sky is blue in one sentence.' }\n ],\n maxTokens: 30\n });\n const test2Latency = Date.now() - test2Start;\n const test2TPS = (response2.usage?.outputTokens || 0) / (test2Latency / 1000);\n\n console.log(`โœ… Response: ${response2.content[0].type === 'text' ? response2.content[0].text : ''}`);\n console.log(`โฑ๏ธ ${test2Latency}ms | ${test2TPS.toFixed(1)} tokens/sec\\n`);\n\n results.push({\n test: 'Medium Reasoning',\n tokens: response2.usage?.outputTokens || 0,\n latency: test2Latency,\n tokensPerSecond: test2TPS\n });\n\n // Test 3: Longer response\n console.log('Test 3: Longer Response (Creative)');\n console.log('====================================');\n\n const test3Start = Date.now();\n const response3 = await provider.chat({\n model: 'phi-4',\n messages: [\n { role: 'user', content: 'List 5 programming languages.' }\n ],\n maxTokens: 50\n });\n const test3Latency = Date.now() - test3Start;\n const test3TPS = (response3.usage?.outputTokens || 0) / (test3Latency / 1000);\n\n console.log(`โœ… Response: ${response3.content[0].type === 'text' ? response3.content[0].text : ''}`);\n console.log(`โฑ๏ธ ${test3Latency}ms | ${test3TPS.toFixed(1)} tokens/sec\\n`);\n\n results.push({\n test: 'Longer Creative',\n tokens: response3.usage?.outputTokens || 0,\n latency: test3Latency,\n tokensPerSecond: test3TPS\n });\n\n // Test 4: Multi-turn conversation\n console.log('Test 4: Multi-Turn Conversation');\n console.log('================================');\n\n const test4Start = Date.now();\n const response4 = await provider.chat({\n model: 'phi-4',\n messages: [\n { role: 'user', content: 'Hello!' },\n { role: 'assistant', content: 'Hello! How can I help you today?' },\n { role: 'user', content: 'Tell me a fun fact about computers.' }\n ],\n maxTokens: 40\n });\n const test4Latency = Date.now() - test4Start;\n const test4TPS = (response4.usage?.outputTokens || 0) / (test4Latency / 1000);\n\n console.log(`โœ… Response: ${response4.content[0].type === 'text' ? response4.content[0].text : ''}`);\n console.log(`โฑ๏ธ ${test4Latency}ms | ${test4TPS.toFixed(1)} tokens/sec\\n`);\n\n results.push({\n test: 'Multi-Turn',\n tokens: response4.usage?.outputTokens || 0,\n latency: test4Latency,\n tokensPerSecond: test4TPS\n });\n\n // Summary\n console.log('\\n๐Ÿ“Š Benchmark Summary');\n console.log('====================\\n');\n\n const avgTPS = results.reduce((sum, r) => sum + r.tokensPerSecond, 0) / results.length;\n const avgLatency = results.reduce((sum, r) => sum + r.latency, 0) / results.length;\n const totalTokens = results.reduce((sum, r) => sum + r.tokens, 0);\n\n console.table(results.map(r => ({\n Test: r.test,\n Tokens: r.tokens,\n 'Latency (ms)': r.latency,\n 'Tokens/Sec': r.tokensPerSecond.toFixed(1)\n })));\n\n console.log(`\\n๐Ÿ“ˆ Performance Metrics:`);\n console.log(` Average Tokens/Sec: ${avgTPS.toFixed(1)}`);\n console.log(` Average Latency: ${avgLatency.toFixed(0)}ms`);\n console.log(` Total Tokens Generated: ${totalTokens}`);\n\n console.log(`\\n๐ŸŽฏ Target Validation:`);\n const targetMin = 15;\n const targetMax = 25;\n\n if (avgTPS >= targetMin && avgTPS <= targetMax * 1.5) {\n console.log(` โœ… PASS: ${avgTPS.toFixed(1)} tokens/sec is within acceptable range`);\n } else if (avgTPS < targetMin) {\n console.log(` โš ๏ธ SLOW: ${avgTPS.toFixed(1)} tokens/sec is below target (${targetMin}+)`);\n } else {\n console.log(` ๐Ÿš€ FAST: ${avgTPS.toFixed(1)} tokens/sec exceeds target!`);\n }\n\n console.log(`\\n๐Ÿ’ฐ Cost Savings:`);\n console.log(` Local Inference: $0.00`);\n console.log(` Anthropic Equivalent: ~$${(totalTokens * 0.00003).toFixed(4)}`);\n console.log(` Savings: 100%`);\n\n console.log(`\\n๐Ÿ”’ Privacy:`);\n console.log(` โœ… All processing local`);\n console.log(` โœ… No data sent to cloud`);\n console.log(` โœ… GDPR/HIPAA compliant`);\n\n await provider.dispose();\n}\n\nrunBenchmark().catch(error => {\n console.error('โŒ Benchmark failed:', error);\n process.exit(1);\n});\n"]}
1
+ {"version":3,"file":"test-onnx-benchmark.js","sourceRoot":"","sources":["../../src/router/test-onnx-benchmark.ts"],"names":[],"mappings":"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","sourcesContent":["#!/usr/bin/env node\n/**\n * Comprehensive benchmark for ONNX local inference\n * Tests CPU performance against targets\n */\n\nimport { ONNXLocalProvider } from './providers/onnx-local.js';\nimport { PHI4_MODEL_PATH } from '../utils/model-downloader.js';\n\ninterface BenchmarkResult {\n test: string;\n tokens: number;\n latency: number;\n tokensPerSecond: number;\n}\n\nasync function runBenchmark() {\n console.log('๐Ÿ ONNX Local Inference Benchmark (Phi-4 CPU)\\n');\n console.log('Target: 15-25 tokens/sec on CPU');\n console.log('================================================\\n');\n\n const provider = new ONNXLocalProvider({\n modelPath: PHI4_MODEL_PATH,\n executionProviders: ['cpu'],\n maxTokens: 50,\n temperature: 0.7\n });\n\n const results: BenchmarkResult[] = [];\n\n // Test 1: Short response\n console.log('Test 1: Short Response (Math)');\n console.log('==============================');\n\n const test1Start = Date.now();\n const response1 = await provider.chat({\n model: 'phi-4',\n messages: [\n { role: 'user', content: 'What is 2+2?' }\n ],\n maxTokens: 20\n });\n const test1Latency = Date.now() - test1Start;\n const test1TPS = (response1.usage?.outputTokens || 0) / (test1Latency / 1000);\n\n console.log(`โœ… Response: ${response1.content[0].type === 'text' ? response1.content[0].text : ''}`);\n console.log(`โฑ๏ธ ${test1Latency}ms | ${test1TPS.toFixed(1)} tokens/sec\\n`);\n\n results.push({\n test: 'Short Math',\n tokens: response1.usage?.outputTokens || 0,\n latency: test1Latency,\n tokensPerSecond: test1TPS\n });\n\n // Test 2: Medium response\n console.log('Test 2: Medium Response (Reasoning)');\n console.log('=====================================');\n\n const test2Start = Date.now();\n const response2 = await provider.chat({\n model: 'phi-4',\n messages: [\n { role: 'user', content: 'Explain why the sky is blue in one sentence.' }\n ],\n maxTokens: 30\n });\n const test2Latency = Date.now() - test2Start;\n const test2TPS = (response2.usage?.outputTokens || 0) / (test2Latency / 1000);\n\n console.log(`โœ… Response: ${response2.content[0].type === 'text' ? response2.content[0].text : ''}`);\n console.log(`โฑ๏ธ ${test2Latency}ms | ${test2TPS.toFixed(1)} tokens/sec\\n`);\n\n results.push({\n test: 'Medium Reasoning',\n tokens: response2.usage?.outputTokens || 0,\n latency: test2Latency,\n tokensPerSecond: test2TPS\n });\n\n // Test 3: Longer response\n console.log('Test 3: Longer Response (Creative)');\n console.log('====================================');\n\n const test3Start = Date.now();\n const response3 = await provider.chat({\n model: 'phi-4',\n messages: [\n { role: 'user', content: 'List 5 programming languages.' }\n ],\n maxTokens: 50\n });\n const test3Latency = Date.now() - test3Start;\n const test3TPS = (response3.usage?.outputTokens || 0) / (test3Latency / 1000);\n\n console.log(`โœ… Response: ${response3.content[0].type === 'text' ? response3.content[0].text : ''}`);\n console.log(`โฑ๏ธ ${test3Latency}ms | ${test3TPS.toFixed(1)} tokens/sec\\n`);\n\n results.push({\n test: 'Longer Creative',\n tokens: response3.usage?.outputTokens || 0,\n latency: test3Latency,\n tokensPerSecond: test3TPS\n });\n\n // Test 4: Multi-turn conversation\n console.log('Test 4: Multi-Turn Conversation');\n console.log('================================');\n\n const test4Start = Date.now();\n const response4 = await provider.chat({\n model: 'phi-4',\n messages: [\n { role: 'user', content: 'Hello!' },\n { role: 'assistant', content: 'Hello! How can I help you today?' },\n { role: 'user', content: 'Tell me a fun fact about computers.' }\n ],\n maxTokens: 40\n });\n const test4Latency = Date.now() - test4Start;\n const test4TPS = (response4.usage?.outputTokens || 0) / (test4Latency / 1000);\n\n console.log(`โœ… Response: ${response4.content[0].type === 'text' ? response4.content[0].text : ''}`);\n console.log(`โฑ๏ธ ${test4Latency}ms | ${test4TPS.toFixed(1)} tokens/sec\\n`);\n\n results.push({\n test: 'Multi-Turn',\n tokens: response4.usage?.outputTokens || 0,\n latency: test4Latency,\n tokensPerSecond: test4TPS\n });\n\n // Summary\n console.log('\\n๐Ÿ“Š Benchmark Summary');\n console.log('====================\\n');\n\n const avgTPS = results.reduce((sum, r) => sum + r.tokensPerSecond, 0) / results.length;\n const avgLatency = results.reduce((sum, r) => sum + r.latency, 0) / results.length;\n const totalTokens = results.reduce((sum, r) => sum + r.tokens, 0);\n\n console.table(results.map(r => ({\n Test: r.test,\n Tokens: r.tokens,\n 'Latency (ms)': r.latency,\n 'Tokens/Sec': r.tokensPerSecond.toFixed(1)\n })));\n\n console.log(`\\n๐Ÿ“ˆ Performance Metrics:`);\n console.log(` Average Tokens/Sec: ${avgTPS.toFixed(1)}`);\n console.log(` Average Latency: ${avgLatency.toFixed(0)}ms`);\n console.log(` Total Tokens Generated: ${totalTokens}`);\n\n console.log(`\\n๐ŸŽฏ Target Validation:`);\n const targetMin = 15;\n const targetMax = 25;\n\n if (avgTPS >= targetMin && avgTPS <= targetMax * 1.5) {\n console.log(` โœ… PASS: ${avgTPS.toFixed(1)} tokens/sec is within acceptable range`);\n } else if (avgTPS < targetMin) {\n console.log(` โš ๏ธ SLOW: ${avgTPS.toFixed(1)} tokens/sec is below target (${targetMin}+)`);\n } else {\n console.log(` ๐Ÿš€ FAST: ${avgTPS.toFixed(1)} tokens/sec exceeds target!`);\n }\n\n console.log(`\\n๐Ÿ’ฐ Cost Savings:`);\n console.log(` Local Inference: $0.00`);\n console.log(` Anthropic Equivalent: ~$${(totalTokens * 0.00003).toFixed(4)}`);\n console.log(` Savings: 100%`);\n\n console.log(`\\n๐Ÿ”’ Privacy:`);\n console.log(` โœ… All processing local`);\n console.log(` โœ… No data sent to cloud`);\n console.log(` โœ… GDPR/HIPAA compliant`);\n\n await provider.dispose();\n}\n\nrunBenchmark().catch(error => {\n console.error('โŒ Benchmark failed:', error);\n process.exit(1);\n});\n"]}
@@ -3,11 +3,12 @@
3
3
  * Test ONNX local inference with Phi-4 model
4
4
  */
5
5
  import { ONNXLocalProvider } from './providers/onnx-local.js';
6
+ import { PHI4_MODEL_PATH } from '../utils/model-downloader.js';
6
7
  async function testONNXLocal() {
7
8
  console.log('๐Ÿงช Testing ONNX Local Inference (Phi-4 CPU)\n');
8
9
  try {
9
10
  const provider = new ONNXLocalProvider({
10
- modelPath: './models/phi-4/cpu_and_mobile/cpu-int4-rtn-block-32-acc-level-4/model.onnx',
11
+ modelPath: PHI4_MODEL_PATH,
11
12
  executionProviders: ['cpu'],
12
13
  maxTokens: 50
13
14
  });
@@ -1 +1 @@
1
- {"version":3,"file":"test-onnx-local.js","sourceRoot":"","sources":["../../src/router/test-onnx-local.ts"],"names":[],"mappings":";AACA;;GAEG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAE9D,KAAK,UAAU,aAAa;IAC1B,OAAO,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC;IAE7D,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,iBAAiB,CAAC;YACrC,SAAS,EAAE,4EAA4E;YACvF,kBAAkB,EAAE,CAAC,KAAK,CAAC;YAC3B,SAAS,EAAE,EAAE;SACd,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;QAEtC,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC;YACnC,KAAK,EAAE,OAAO;YACd,QAAQ,EAAE;gBACR,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE;aAC1C;YACD,SAAS,EAAE,EAAE;SACd,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,WAAW,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC9F,OAAO,CAAC,GAAG,CAAC,cAAc,QAAQ,CAAC,QAAQ,EAAE,OAAO,IAAI,CAAC,CAAC;QAC1D,OAAO,CAAC,GAAG,CAAC,aAAa,QAAQ,CAAC,KAAK,EAAE,WAAW,SAAS,QAAQ,CAAC,KAAK,EAAE,YAAY,MAAM,CAAC,CAAC;QACjG,OAAO,CAAC,GAAG,CAAC,YAAY,QAAQ,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC,gBAAgB,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEjF,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;QAEhC,MAAM,QAAQ,CAAC,OAAO,EAAE,CAAC;IAE3B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;QACzC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,aAAa,EAAE,CAAC","sourcesContent":["#!/usr/bin/env node\n/**\n * Test ONNX local inference with Phi-4 model\n */\n\nimport { ONNXLocalProvider } from './providers/onnx-local.js';\n\nasync function testONNXLocal() {\n console.log('๐Ÿงช Testing ONNX Local Inference (Phi-4 CPU)\\n');\n\n try {\n const provider = new ONNXLocalProvider({\n modelPath: './models/phi-4/cpu_and_mobile/cpu-int4-rtn-block-32-acc-level-4/model.onnx',\n executionProviders: ['cpu'],\n maxTokens: 50\n });\n\n console.log('Test: Simple Inference');\n console.log('======================');\n\n const response = await provider.chat({\n model: 'phi-4',\n messages: [\n { role: 'user', content: 'What is 2+2?' }\n ],\n maxTokens: 20\n });\n\n console.log('\\n๐Ÿ“ฅ Response:');\n console.log(` Text: ${response.content[0].type === 'text' ? response.content[0].text : ''}`);\n console.log(` Latency: ${response.metadata?.latency}ms`);\n console.log(` Tokens: ${response.usage?.inputTokens} in / ${response.usage?.outputTokens} out`);\n console.log(` Cost: $${response.metadata?.cost}`);\n console.log(` Providers: ${response.metadata?.executionProviders?.join(', ')}`);\n\n console.log('\\nโœ… Test passed!');\n\n await provider.dispose();\n\n } catch (error) {\n console.error('\\nโŒ Test failed:', error);\n process.exit(1);\n }\n}\n\ntestONNXLocal();\n"]}
1
+ {"version":3,"file":"test-onnx-local.js","sourceRoot":"","sources":["../../src/router/test-onnx-local.ts"],"names":[],"mappings":";AACA;;GAEG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAE/D,KAAK,UAAU,aAAa;IAC1B,OAAO,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC;IAE7D,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,iBAAiB,CAAC;YACrC,SAAS,EAAE,eAAe;YAC1B,kBAAkB,EAAE,CAAC,KAAK,CAAC;YAC3B,SAAS,EAAE,EAAE;SACd,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;QAEtC,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC;YACnC,KAAK,EAAE,OAAO;YACd,QAAQ,EAAE;gBACR,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE;aAC1C;YACD,SAAS,EAAE,EAAE;SACd,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,WAAW,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC9F,OAAO,CAAC,GAAG,CAAC,cAAc,QAAQ,CAAC,QAAQ,EAAE,OAAO,IAAI,CAAC,CAAC;QAC1D,OAAO,CAAC,GAAG,CAAC,aAAa,QAAQ,CAAC,KAAK,EAAE,WAAW,SAAS,QAAQ,CAAC,KAAK,EAAE,YAAY,MAAM,CAAC,CAAC;QACjG,OAAO,CAAC,GAAG,CAAC,YAAY,QAAQ,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC,gBAAgB,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEjF,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;QAEhC,MAAM,QAAQ,CAAC,OAAO,EAAE,CAAC;IAE3B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;QACzC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,aAAa,EAAE,CAAC","sourcesContent":["#!/usr/bin/env node\n/**\n * Test ONNX local inference with Phi-4 model\n */\n\nimport { ONNXLocalProvider } from './providers/onnx-local.js';\nimport { PHI4_MODEL_PATH } from '../utils/model-downloader.js';\n\nasync function testONNXLocal() {\n console.log('๐Ÿงช Testing ONNX Local Inference (Phi-4 CPU)\\n');\n\n try {\n const provider = new ONNXLocalProvider({\n modelPath: PHI4_MODEL_PATH,\n executionProviders: ['cpu'],\n maxTokens: 50\n });\n\n console.log('Test: Simple Inference');\n console.log('======================');\n\n const response = await provider.chat({\n model: 'phi-4',\n messages: [\n { role: 'user', content: 'What is 2+2?' }\n ],\n maxTokens: 20\n });\n\n console.log('\\n๐Ÿ“ฅ Response:');\n console.log(` Text: ${response.content[0].type === 'text' ? response.content[0].text : ''}`);\n console.log(` Latency: ${response.metadata?.latency}ms`);\n console.log(` Tokens: ${response.usage?.inputTokens} in / ${response.usage?.outputTokens} out`);\n console.log(` Cost: $${response.metadata?.cost}`);\n console.log(` Providers: ${response.metadata?.executionProviders?.join(', ')}`);\n\n console.log('\\nโœ… Test passed!');\n\n await provider.dispose();\n\n } catch (error) {\n console.error('\\nโŒ Test failed:', error);\n process.exit(1);\n }\n}\n\ntestONNXLocal();\n"]}
@@ -3,6 +3,20 @@
3
3
  *
4
4
  * Downloads Phi-4 ONNX model from HuggingFace on first use
5
5
  */
6
+ /**
7
+ * Where ONNX models live on disk.
8
+ *
9
+ * These paths were previously relative ('./models/...'), so they resolved
10
+ * against process.cwd() and a ~4.6GB download landed in whatever directory the
11
+ * command happened to run from โ€” re-downloaded once per working directory, and
12
+ * left untracked inside any repository it was invoked in.
13
+ *
14
+ * Exported so the reader (router/providers/onnx-local.ts) can resolve the same
15
+ * path the writer uses; the two previously disagreed (phi-4 vs phi-4-mini).
16
+ */
17
+ export declare const MODEL_ROOT: string;
18
+ export declare const PHI4_MODEL_PATH: string;
19
+ export declare const PHI4_MODEL_DATA_PATH: string;
6
20
  export interface DownloadProgress {
7
21
  downloaded: number;
8
22
  total: number;
@@ -1 +1 @@
1
- {"version":3,"file":"model-downloader.d.ts","sourceRoot":"","sources":["../../src/utils/model-downloader.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,OAAO,CAA4B;IAE3C;;;;OAIG;IACH,OAAO,CAAC,SAAS,CAIf;IAEF,OAAO,CAAC,aAAa,CAInB;IAEF;;OAEG;IACH,iBAAiB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO;IAK9C;;OAEG;IACH,OAAO,CAAC,cAAc;IAItB;;OAEG;IACG,aAAa,CACjB,SAAS,CAAC,EAAE,SAAS,EACrB,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,gBAAgB,KAAK,IAAI,GAChD,OAAO,CAAC,MAAM,CAAC;IAkFlB;;OAEG;IACG,eAAe,CAAC,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,gBAAgB,KAAK,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC;IA+BzF;;OAEG;IACG,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAyB/E;;OAEG;IACH,YAAY,IAAI,SAAS;IAIzB;;OAEG;IACH,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,gBAAgB,GAAG,MAAM;CAI1D;AAED;;GAEG;AACH,eAAO,MAAM,eAAe,iBAAwB,CAAC;AAErD;;GAEG;AACH,wBAAsB,eAAe,CACnC,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,gBAAgB,KAAK,IAAI,GAChD,OAAO,CAAC,MAAM,CAAC,CAEjB"}
1
+ {"version":3,"file":"model-downloader.d.ts","sourceRoot":"","sources":["../../src/utils/model-downloader.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AASH;;;;;;;;;;GAUG;AACH,eAAO,MAAM,UAAU,QACwB,CAAC;AAEhD,eAAO,MAAM,eAAe,QAE3B,CAAC;AAEF,eAAO,MAAM,oBAAoB,QAA4B,CAAC;AAE9D,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,OAAO,CAA4B;IAE3C;;;;OAIG;IACH,OAAO,CAAC,SAAS,CAIf;IAEF,OAAO,CAAC,aAAa,CAInB;IAEF;;OAEG;IACH,iBAAiB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO;IAK9C;;OAEG;IACH,OAAO,CAAC,cAAc;IAItB;;OAEG;IACG,aAAa,CACjB,SAAS,CAAC,EAAE,SAAS,EACrB,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,gBAAgB,KAAK,IAAI,GAChD,OAAO,CAAC,MAAM,CAAC;IAkFlB;;OAEG;IACG,eAAe,CAAC,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,gBAAgB,KAAK,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC;IA+BzF;;OAEG;IACG,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAyB/E;;OAEG;IACH,YAAY,IAAI,SAAS;IAIzB;;OAEG;IACH,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,gBAAgB,GAAG,MAAM;CAI1D;AAED;;GAEG;AACH,eAAO,MAAM,eAAe,iBAAwB,CAAC;AAErD;;GAEG;AACH,wBAAsB,eAAe,CACnC,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,gBAAgB,KAAK,IAAI,GAChD,OAAO,CAAC,MAAM,CAAC,CAEjB"}
@@ -4,9 +4,25 @@
4
4
  * Downloads Phi-4 ONNX model from HuggingFace on first use
5
5
  */
6
6
  import { createWriteStream, existsSync, mkdirSync } from 'fs';
7
- import { dirname } from 'path';
7
+ import { dirname, join } from 'path';
8
8
  import { createHash } from 'crypto';
9
9
  import { readFileSync } from 'fs';
10
+ import { homedir } from 'os';
11
+ /**
12
+ * Where ONNX models live on disk.
13
+ *
14
+ * These paths were previously relative ('./models/...'), so they resolved
15
+ * against process.cwd() and a ~4.6GB download landed in whatever directory the
16
+ * command happened to run from โ€” re-downloaded once per working directory, and
17
+ * left untracked inside any repository it was invoked in.
18
+ *
19
+ * Exported so the reader (router/providers/onnx-local.ts) can resolve the same
20
+ * path the writer uses; the two previously disagreed (phi-4 vs phi-4-mini).
21
+ */
22
+ export const MODEL_ROOT = process.env.AGENTIC_FLOW_MODEL_DIR
23
+ || join(homedir(), '.agentic-flow', 'models');
24
+ export const PHI4_MODEL_PATH = join(MODEL_ROOT, 'phi-4-mini', 'cpu_and_mobile', 'cpu-int4-rtn-block-32-acc-level-4', 'model.onnx');
25
+ export const PHI4_MODEL_DATA_PATH = `${PHI4_MODEL_PATH}.data`;
10
26
  export class ModelDownloader {
11
27
  baseUrl = 'https://huggingface.co';
12
28
  /**
@@ -17,12 +33,12 @@ export class ModelDownloader {
17
33
  phi4Model = {
18
34
  repo: 'microsoft/Phi-4-mini-instruct-onnx',
19
35
  filename: 'cpu_and_mobile/cpu-int4-rtn-block-32-acc-level-4/model.onnx',
20
- localPath: './models/phi-4-mini/cpu_and_mobile/cpu-int4-rtn-block-32-acc-level-4/model.onnx'
36
+ localPath: PHI4_MODEL_PATH
21
37
  };
22
38
  phi4ModelData = {
23
39
  repo: 'microsoft/Phi-4-mini-instruct-onnx',
24
40
  filename: 'cpu_and_mobile/cpu-int4-rtn-block-32-acc-level-4/model.onnx.data',
25
- localPath: './models/phi-4-mini/cpu_and_mobile/cpu-int4-rtn-block-32-acc-level-4/model.onnx.data'
41
+ localPath: PHI4_MODEL_DATA_PATH
26
42
  };
27
43
  /**
28
44
  * Check if model exists locally
@@ -1 +1 @@
1
- {"version":3,"file":"model-downloader.js","sourceRoot":"","sources":["../../src/utils/model-downloader.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAQ,MAAM,MAAM,CAAC;AAErC,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAelC,MAAM,OAAO,eAAe;IAClB,OAAO,GAAG,wBAAwB,CAAC;IAE3C;;;;OAIG;IACK,SAAS,GAAc;QAC7B,IAAI,EAAE,oCAAoC;QAC1C,QAAQ,EAAE,6DAA6D;QACvE,SAAS,EAAE,iFAAiF;KAC7F,CAAC;IAEM,aAAa,GAAc;QACjC,IAAI,EAAE,oCAAoC;QAC1C,QAAQ,EAAE,kEAAkE;QAC5E,SAAS,EAAE,sFAAsF;KAClG,CAAC;IAEF;;OAEG;IACH,iBAAiB,CAAC,SAAkB;QAClC,MAAM,IAAI,GAAG,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;QACnD,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED;;OAEG;IACK,cAAc,CAAC,KAAgB;QACrC,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,KAAK,CAAC,IAAI,iBAAiB,KAAK,CAAC,QAAQ,EAAE,CAAC;IACxE,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa,CACjB,SAAqB,EACrB,UAAiD;QAEjD,MAAM,KAAK,GAAG,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC;QAE1C,8BAA8B;QAC9B,IAAI,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;YAC5C,OAAO,CAAC,GAAG,CAAC,6BAA6B,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;YAC5D,OAAO,KAAK,CAAC,SAAS,CAAC;QACzB,CAAC;QAED,mBAAmB;QACnB,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACrC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACrB,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACtC,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QACvC,OAAO,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC;QACnE,OAAO,CAAC,GAAG,CAAC,WAAW,GAAG,EAAE,CAAC,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,mBAAmB,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;QAElD,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;YAElC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,IAAI,KAAK,CAAC,oBAAoB,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;YAC7D,CAAC;YAED,MAAM,SAAS,GAAG,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,GAAG,EAAE,EAAE,CAAC,CAAC;YAC9E,IAAI,cAAc,GAAG,CAAC,CAAC;YAEvB,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACnB,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;YAC3C,CAAC;YAED,MAAM,UAAU,GAAG,iBAAiB,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YAEtD,iBAAiB;YACjB,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACzC,MAAM,MAAM,GAAiB,EAAE,CAAC;YAEhC,OAAO,IAAI,EAAE,CAAC;gBACZ,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;gBAE5C,IAAI,IAAI;oBAAE,MAAM;gBAEhB,IAAI,KAAK,EAAE,CAAC;oBACV,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBACnB,cAAc,IAAI,KAAK,CAAC,MAAM,CAAC;oBAE/B,IAAI,UAAU,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;wBAChC,UAAU,CAAC;4BACT,UAAU,EAAE,cAAc;4BAC1B,KAAK,EAAE,SAAS;4BAChB,UAAU,EAAE,CAAC,cAAc,GAAG,SAAS,CAAC,GAAG,GAAG;yBAC/C,CAAC,CAAC;oBACL,CAAC;oBAED,cAAc;oBACd,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBAC1B,CAAC;YACH,CAAC;YAED,UAAU,CAAC,GAAG,EAAE,CAAC;YAEjB,iCAAiC;YACjC,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBAC1C,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;gBACzC,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YACjC,CAAC,CAAC,CAAC;YAEH,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;YAC/C,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,cAAc,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YAC1E,OAAO,CAAC,GAAG,CAAC,YAAY,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;YAE3C,OAAO,KAAK,CAAC,SAAS,CAAC;QAEzB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,KAAK,CAAC,CAAC;YACjD,MAAM,IAAI,KAAK,CAAC,6BAA6B,KAAK,EAAE,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,eAAe,CAAC,UAAiD;QACrE,MAAM,cAAc,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QACxE,MAAM,cAAc,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;QAE5E,IAAI,cAAc,IAAI,cAAc,EAAE,CAAC;YACrC,OAAO,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;QAClC,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;QAC1D,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC;QAC7D,OAAO,CAAC,GAAG,CAAC,+DAA+D,CAAC,CAAC;QAC7E,OAAO,CAAC,GAAG,CAAC,0DAA0D,CAAC,CAAC;QACxE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAEhB,sCAAsC;QACtC,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;YAC5C,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;YACrD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC;QAED,gCAAgC;QAChC,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,mEAAmE,CAAC,CAAC;YACjF,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;QAC3D,CAAC;QAED,OAAO,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;IAClC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CAAC,SAAiB,EAAE,cAAuB;QAC1D,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,OAAO,IAAI,CAAC,CAAC,wCAAwC;QACvD,CAAC;QAED,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;YAC3C,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAEnE,IAAI,IAAI,KAAK,cAAc,EAAE,CAAC;gBAC5B,OAAO,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;gBAC7C,OAAO,CAAC,KAAK,CAAC,gBAAgB,cAAc,EAAE,CAAC,CAAC;gBAChD,OAAO,CAAC,KAAK,CAAC,gBAAgB,IAAI,EAAE,CAAC,CAAC;gBACtC,OAAO,KAAK,CAAC;YACf,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;YAC3C,OAAO,IAAI,CAAC;QAEd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,KAAK,CAAC,CAAC;YACpD,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;OAEG;IACH,YAAY;QACV,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,cAAc,CAAC,QAA0B;QAC9C,MAAM,EAAE,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,CAAC,KAAK,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACjE,OAAO,GAAG,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC;IACpG,CAAC;CACF;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,eAAe,EAAE,CAAC;AAErD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,UAAiD;IAEjD,OAAO,eAAe,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;AACrD,CAAC","sourcesContent":["/**\n * Automatic Model Downloader for ONNX Phi-4\n *\n * Downloads Phi-4 ONNX model from HuggingFace on first use\n */\n\nimport { createWriteStream, existsSync, mkdirSync } from 'fs';\nimport { dirname, join } from 'path';\nimport { pipeline } from 'stream/promises';\nimport { createHash } from 'crypto';\nimport { readFileSync } from 'fs';\n\nexport interface DownloadProgress {\n downloaded: number;\n total: number;\n percentage: number;\n}\n\nexport interface ModelInfo {\n repo: string;\n filename: string;\n localPath: string;\n sha256?: string;\n}\n\nexport class ModelDownloader {\n private baseUrl = 'https://huggingface.co';\n\n /**\n * Phi-4 Mini ONNX INT4 quantized model (CPU optimized)\n * Size: ~52MB model + ~4.86GB data = ~4.9GB total\n * Note: Requires TWO files - model.onnx and model.onnx.data\n */\n private phi4Model: ModelInfo = {\n repo: 'microsoft/Phi-4-mini-instruct-onnx',\n filename: 'cpu_and_mobile/cpu-int4-rtn-block-32-acc-level-4/model.onnx',\n localPath: './models/phi-4-mini/cpu_and_mobile/cpu-int4-rtn-block-32-acc-level-4/model.onnx'\n };\n\n private phi4ModelData: ModelInfo = {\n repo: 'microsoft/Phi-4-mini-instruct-onnx',\n filename: 'cpu_and_mobile/cpu-int4-rtn-block-32-acc-level-4/model.onnx.data',\n localPath: './models/phi-4-mini/cpu_and_mobile/cpu-int4-rtn-block-32-acc-level-4/model.onnx.data'\n };\n\n /**\n * Check if model exists locally\n */\n isModelDownloaded(modelPath?: string): boolean {\n const path = modelPath || this.phi4Model.localPath;\n return existsSync(path);\n }\n\n /**\n * Get model download URL\n */\n private getDownloadUrl(model: ModelInfo): string {\n return `${this.baseUrl}/${model.repo}/resolve/main/${model.filename}`;\n }\n\n /**\n * Download model with progress tracking\n */\n async downloadModel(\n modelInfo?: ModelInfo,\n onProgress?: (progress: DownloadProgress) => void\n ): Promise<string> {\n const model = modelInfo || this.phi4Model;\n\n // Check if already downloaded\n if (this.isModelDownloaded(model.localPath)) {\n console.log(`โœ… Model already exists at ${model.localPath}`);\n return model.localPath;\n }\n\n // Create directory\n const dir = dirname(model.localPath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n\n const url = this.getDownloadUrl(model);\n console.log(`๐Ÿ“ฆ Downloading Phi-4 ONNX model from HuggingFace...`);\n console.log(` URL: ${url}`);\n console.log(` Destination: ${model.localPath}`);\n\n try {\n const response = await fetch(url);\n\n if (!response.ok) {\n throw new Error(`Download failed: ${response.statusText}`);\n }\n\n const totalSize = parseInt(response.headers.get('content-length') || '0', 10);\n let downloadedSize = 0;\n\n if (!response.body) {\n throw new Error('Response body is null');\n }\n\n const fileStream = createWriteStream(model.localPath);\n\n // Track progress\n const reader = response.body.getReader();\n const chunks: Uint8Array[] = [];\n\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) break;\n\n if (value) {\n chunks.push(value);\n downloadedSize += value.length;\n\n if (onProgress && totalSize > 0) {\n onProgress({\n downloaded: downloadedSize,\n total: totalSize,\n percentage: (downloadedSize / totalSize) * 100\n });\n }\n\n // Write chunk\n fileStream.write(value);\n }\n }\n\n fileStream.end();\n\n // Wait for file stream to finish\n await new Promise<void>((resolve, reject) => {\n fileStream.on('finish', () => resolve());\n fileStream.on('error', reject);\n });\n\n console.log(`โœ… Model downloaded successfully`);\n console.log(` Size: ${(downloadedSize / (1024 * 1024)).toFixed(2)} MB`);\n console.log(` Path: ${model.localPath}`);\n\n return model.localPath;\n\n } catch (error) {\n console.error(`โŒ Model download failed:`, error);\n throw new Error(`Failed to download model: ${error}`);\n }\n }\n\n /**\n * Download Phi-4 ONNX model if needed (downloads BOTH .onnx and .onnx.data files)\n */\n async ensurePhi4Model(onProgress?: (progress: DownloadProgress) => void): Promise<string> {\n const mainFileExists = this.isModelDownloaded(this.phi4Model.localPath);\n const dataFileExists = this.isModelDownloaded(this.phi4ModelData.localPath);\n\n if (mainFileExists && dataFileExists) {\n return this.phi4Model.localPath;\n }\n\n console.log(`๐Ÿ” Phi-4-mini ONNX model not found locally`);\n console.log(`๐Ÿ“ฅ Starting automatic download...`);\n console.log(` This is a one-time download (~4.9GB total)`);\n console.log(` Model: microsoft/Phi-4-mini-instruct-onnx (INT4 quantized)`);\n console.log(` Files: model.onnx (~52MB) + model.onnx.data (~4.86GB)`);\n console.log(``);\n\n // Download main model file if missing\n if (!mainFileExists) {\n console.log(`๐Ÿ“ฆ Downloading model.onnx...`);\n await this.downloadModel(this.phi4Model, onProgress);\n console.log(``);\n }\n\n // Download data file if missing\n if (!dataFileExists) {\n console.log(`๐Ÿ“ฆ Downloading model.onnx.data (this is the large 4.86GB file)...`);\n await this.downloadModel(this.phi4ModelData, onProgress);\n }\n\n return this.phi4Model.localPath;\n }\n\n /**\n * Verify model file integrity (optional)\n */\n async verifyModel(modelPath: string, expectedSha256?: string): Promise<boolean> {\n if (!expectedSha256) {\n return true; // Skip verification if no hash provided\n }\n\n try {\n const fileBuffer = readFileSync(modelPath);\n const hash = createHash('sha256').update(fileBuffer).digest('hex');\n\n if (hash !== expectedSha256) {\n console.error(`โŒ Model verification failed`);\n console.error(` Expected: ${expectedSha256}`);\n console.error(` Got: ${hash}`);\n return false;\n }\n\n console.log(`โœ… Model verification passed`);\n return true;\n\n } catch (error) {\n console.error(`โŒ Model verification error:`, error);\n return false;\n }\n }\n\n /**\n * Get model info\n */\n getModelInfo(): ModelInfo {\n return this.phi4Model;\n }\n\n /**\n * Format download progress for display\n */\n static formatProgress(progress: DownloadProgress): string {\n const mb = (bytes: number) => (bytes / (1024 * 1024)).toFixed(2);\n return `${progress.percentage.toFixed(1)}% (${mb(progress.downloaded)}/${mb(progress.total)} MB)`;\n }\n}\n\n/**\n * Global singleton instance\n */\nexport const modelDownloader = new ModelDownloader();\n\n/**\n * Convenience function for downloading Phi-4 model\n */\nexport async function ensurePhi4Model(\n onProgress?: (progress: DownloadProgress) => void\n): Promise<string> {\n return modelDownloader.ensurePhi4Model(onProgress);\n}\n"]}
1
+ {"version":3,"file":"model-downloader.js","sourceRoot":"","sources":["../../src/utils/model-downloader.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Automatic Model Downloader for ONNX Phi-4\n *\n * Downloads Phi-4 ONNX model from HuggingFace on first use\n */\n\nimport { createWriteStream, existsSync, mkdirSync } from 'fs';\nimport { dirname, join } from 'path';\nimport { pipeline } from 'stream/promises';\nimport { createHash } from 'crypto';\nimport { readFileSync } from 'fs';\nimport { homedir } from 'os';\n\n/**\n * Where ONNX models live on disk.\n *\n * These paths were previously relative ('./models/...'), so they resolved\n * against process.cwd() and a ~4.6GB download landed in whatever directory the\n * command happened to run from โ€” re-downloaded once per working directory, and\n * left untracked inside any repository it was invoked in.\n *\n * Exported so the reader (router/providers/onnx-local.ts) can resolve the same\n * path the writer uses; the two previously disagreed (phi-4 vs phi-4-mini).\n */\nexport const MODEL_ROOT = process.env.AGENTIC_FLOW_MODEL_DIR\n || join(homedir(), '.agentic-flow', 'models');\n\nexport const PHI4_MODEL_PATH = join(\n MODEL_ROOT, 'phi-4-mini', 'cpu_and_mobile', 'cpu-int4-rtn-block-32-acc-level-4', 'model.onnx'\n);\n\nexport const PHI4_MODEL_DATA_PATH = `${PHI4_MODEL_PATH}.data`;\n\nexport interface DownloadProgress {\n downloaded: number;\n total: number;\n percentage: number;\n}\n\nexport interface ModelInfo {\n repo: string;\n filename: string;\n localPath: string;\n sha256?: string;\n}\n\nexport class ModelDownloader {\n private baseUrl = 'https://huggingface.co';\n\n /**\n * Phi-4 Mini ONNX INT4 quantized model (CPU optimized)\n * Size: ~52MB model + ~4.86GB data = ~4.9GB total\n * Note: Requires TWO files - model.onnx and model.onnx.data\n */\n private phi4Model: ModelInfo = {\n repo: 'microsoft/Phi-4-mini-instruct-onnx',\n filename: 'cpu_and_mobile/cpu-int4-rtn-block-32-acc-level-4/model.onnx',\n localPath: PHI4_MODEL_PATH\n };\n\n private phi4ModelData: ModelInfo = {\n repo: 'microsoft/Phi-4-mini-instruct-onnx',\n filename: 'cpu_and_mobile/cpu-int4-rtn-block-32-acc-level-4/model.onnx.data',\n localPath: PHI4_MODEL_DATA_PATH\n };\n\n /**\n * Check if model exists locally\n */\n isModelDownloaded(modelPath?: string): boolean {\n const path = modelPath || this.phi4Model.localPath;\n return existsSync(path);\n }\n\n /**\n * Get model download URL\n */\n private getDownloadUrl(model: ModelInfo): string {\n return `${this.baseUrl}/${model.repo}/resolve/main/${model.filename}`;\n }\n\n /**\n * Download model with progress tracking\n */\n async downloadModel(\n modelInfo?: ModelInfo,\n onProgress?: (progress: DownloadProgress) => void\n ): Promise<string> {\n const model = modelInfo || this.phi4Model;\n\n // Check if already downloaded\n if (this.isModelDownloaded(model.localPath)) {\n console.log(`โœ… Model already exists at ${model.localPath}`);\n return model.localPath;\n }\n\n // Create directory\n const dir = dirname(model.localPath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n\n const url = this.getDownloadUrl(model);\n console.log(`๐Ÿ“ฆ Downloading Phi-4 ONNX model from HuggingFace...`);\n console.log(` URL: ${url}`);\n console.log(` Destination: ${model.localPath}`);\n\n try {\n const response = await fetch(url);\n\n if (!response.ok) {\n throw new Error(`Download failed: ${response.statusText}`);\n }\n\n const totalSize = parseInt(response.headers.get('content-length') || '0', 10);\n let downloadedSize = 0;\n\n if (!response.body) {\n throw new Error('Response body is null');\n }\n\n const fileStream = createWriteStream(model.localPath);\n\n // Track progress\n const reader = response.body.getReader();\n const chunks: Uint8Array[] = [];\n\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) break;\n\n if (value) {\n chunks.push(value);\n downloadedSize += value.length;\n\n if (onProgress && totalSize > 0) {\n onProgress({\n downloaded: downloadedSize,\n total: totalSize,\n percentage: (downloadedSize / totalSize) * 100\n });\n }\n\n // Write chunk\n fileStream.write(value);\n }\n }\n\n fileStream.end();\n\n // Wait for file stream to finish\n await new Promise<void>((resolve, reject) => {\n fileStream.on('finish', () => resolve());\n fileStream.on('error', reject);\n });\n\n console.log(`โœ… Model downloaded successfully`);\n console.log(` Size: ${(downloadedSize / (1024 * 1024)).toFixed(2)} MB`);\n console.log(` Path: ${model.localPath}`);\n\n return model.localPath;\n\n } catch (error) {\n console.error(`โŒ Model download failed:`, error);\n throw new Error(`Failed to download model: ${error}`);\n }\n }\n\n /**\n * Download Phi-4 ONNX model if needed (downloads BOTH .onnx and .onnx.data files)\n */\n async ensurePhi4Model(onProgress?: (progress: DownloadProgress) => void): Promise<string> {\n const mainFileExists = this.isModelDownloaded(this.phi4Model.localPath);\n const dataFileExists = this.isModelDownloaded(this.phi4ModelData.localPath);\n\n if (mainFileExists && dataFileExists) {\n return this.phi4Model.localPath;\n }\n\n console.log(`๐Ÿ” Phi-4-mini ONNX model not found locally`);\n console.log(`๐Ÿ“ฅ Starting automatic download...`);\n console.log(` This is a one-time download (~4.9GB total)`);\n console.log(` Model: microsoft/Phi-4-mini-instruct-onnx (INT4 quantized)`);\n console.log(` Files: model.onnx (~52MB) + model.onnx.data (~4.86GB)`);\n console.log(``);\n\n // Download main model file if missing\n if (!mainFileExists) {\n console.log(`๐Ÿ“ฆ Downloading model.onnx...`);\n await this.downloadModel(this.phi4Model, onProgress);\n console.log(``);\n }\n\n // Download data file if missing\n if (!dataFileExists) {\n console.log(`๐Ÿ“ฆ Downloading model.onnx.data (this is the large 4.86GB file)...`);\n await this.downloadModel(this.phi4ModelData, onProgress);\n }\n\n return this.phi4Model.localPath;\n }\n\n /**\n * Verify model file integrity (optional)\n */\n async verifyModel(modelPath: string, expectedSha256?: string): Promise<boolean> {\n if (!expectedSha256) {\n return true; // Skip verification if no hash provided\n }\n\n try {\n const fileBuffer = readFileSync(modelPath);\n const hash = createHash('sha256').update(fileBuffer).digest('hex');\n\n if (hash !== expectedSha256) {\n console.error(`โŒ Model verification failed`);\n console.error(` Expected: ${expectedSha256}`);\n console.error(` Got: ${hash}`);\n return false;\n }\n\n console.log(`โœ… Model verification passed`);\n return true;\n\n } catch (error) {\n console.error(`โŒ Model verification error:`, error);\n return false;\n }\n }\n\n /**\n * Get model info\n */\n getModelInfo(): ModelInfo {\n return this.phi4Model;\n }\n\n /**\n * Format download progress for display\n */\n static formatProgress(progress: DownloadProgress): string {\n const mb = (bytes: number) => (bytes / (1024 * 1024)).toFixed(2);\n return `${progress.percentage.toFixed(1)}% (${mb(progress.downloaded)}/${mb(progress.total)} MB)`;\n }\n}\n\n/**\n * Global singleton instance\n */\nexport const modelDownloader = new ModelDownloader();\n\n/**\n * Convenience function for downloading Phi-4 model\n */\nexport async function ensurePhi4Model(\n onProgress?: (progress: DownloadProgress) => void\n): Promise<string> {\n return modelDownloader.ensurePhi4Model(onProgress);\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agentic-flow",
3
- "version": "2.1.2",
3
+ "version": "2.1.3",
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",
@@ -104,32 +104,32 @@ export function log(message) {
104
104
  const len0 = WASM_VECTOR_LEN;
105
105
  wasm.log(ptr0, len0);
106
106
  }
107
- export function __wbg___wbindgen_debug_string_c25d447a39f5578f(arg0, arg1) {
107
+ export function __wbg___wbindgen_debug_string_0e68cf47c9cbd9b0(arg0, arg1) {
108
108
  const ret = debugString(getObject(arg1));
109
109
  const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_export, wasm.__wbindgen_export2);
110
110
  const len1 = WASM_VECTOR_LEN;
111
111
  getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);
112
112
  getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);
113
113
  }
114
- export function __wbg___wbindgen_is_function_1ff95bcc5517c252(arg0) {
114
+ export function __wbg___wbindgen_is_function_fcda5e3902d732fe(arg0) {
115
115
  const ret = typeof(getObject(arg0)) === 'function';
116
116
  return ret;
117
117
  }
118
- export function __wbg___wbindgen_is_undefined_c05833b95a3cf397(arg0) {
118
+ export function __wbg___wbindgen_is_undefined_8c687d0b90d5b524(arg0) {
119
119
  const ret = getObject(arg0) === undefined;
120
120
  return ret;
121
121
  }
122
- export function __wbg___wbindgen_throw_344f42d3211c4765(arg0, arg1) {
122
+ export function __wbg___wbindgen_throw_5d9e815e6fdf150f(arg0, arg1) {
123
123
  throw new Error(getStringFromWasm0(arg0, arg1));
124
124
  }
125
- export function __wbg__wbg_cb_unref_fffb441def202758(arg0) {
125
+ export function __wbg__wbg_cb_unref_997e73d32238e655(arg0) {
126
126
  getObject(arg0)._wbg_cb_unref();
127
127
  }
128
- export function __wbg_call_a6e5c5dce5018821() { return handleError(function (arg0, arg1, arg2) {
128
+ export function __wbg_call_6bcf8d3e20937e46() { return handleError(function (arg0, arg1, arg2) {
129
129
  const ret = getObject(arg0).call(getObject(arg1), getObject(arg2));
130
130
  return addHeapObject(ret);
131
131
  }, arguments); }
132
- export function __wbg_error_a6fa202b58aa1cd3(arg0, arg1) {
132
+ export function __wbg_error_757e9472f8410341(arg0, arg1) {
133
133
  let deferred0_0;
134
134
  let deferred0_1;
135
135
  try {
@@ -140,18 +140,18 @@ export function __wbg_error_a6fa202b58aa1cd3(arg0, arg1) {
140
140
  wasm.__wbindgen_export4(deferred0_0, deferred0_1, 1);
141
141
  }
142
142
  }
143
- export function __wbg_getRandomValues_ceb34d8ffce7e87f() { return handleError(function (arg0, arg1) {
143
+ export function __wbg_getRandomValues_a678b7300e8ed57f() { return handleError(function (arg0, arg1) {
144
144
  globalThis.crypto.getRandomValues(getArrayU8FromWasm0(arg0, arg1));
145
145
  }, arguments); }
146
- export function __wbg_get_78f252d074a84d0b() { return handleError(function (arg0, arg1) {
146
+ export function __wbg_get_989d0a1309644f2b() { return handleError(function (arg0, arg1) {
147
147
  const ret = Reflect.get(getObject(arg0), getObject(arg1));
148
148
  return addHeapObject(ret);
149
149
  }, arguments); }
150
- export function __wbg_indexedDB_c7dd741e3b661da5() { return handleError(function (arg0) {
150
+ export function __wbg_indexedDB_2d959d90beb14c29() { return handleError(function (arg0) {
151
151
  const ret = getObject(arg0).indexedDB;
152
152
  return isLikeNone(ret) ? 0 : addHeapObject(ret);
153
153
  }, arguments); }
154
- export function __wbg_instanceof_Window_05ba1ee4f6781663(arg0) {
154
+ export function __wbg_instanceof_Window_a3b8566f0a9c5d1a(arg0) {
155
155
  let result;
156
156
  try {
157
157
  result = getObject(arg0) instanceof Window;
@@ -161,21 +161,21 @@ export function __wbg_instanceof_Window_05ba1ee4f6781663(arg0) {
161
161
  const ret = result;
162
162
  return ret;
163
163
  }
164
- export function __wbg_log_d267660666346fb3(arg0) {
164
+ export function __wbg_log_363d83b9114c8831(arg0) {
165
165
  console.log(getObject(arg0));
166
166
  }
167
167
  export function __wbg_new_227d7c05414eb861() {
168
168
  const ret = new Error();
169
169
  return addHeapObject(ret);
170
170
  }
171
- export function __wbg_new_typed_1824d93f294193e5(arg0, arg1) {
171
+ export function __wbg_new_typed_6f8b0d724fe26c07(arg0, arg1) {
172
172
  try {
173
173
  var state0 = {a: arg0, b: arg1};
174
174
  var cb0 = (arg0, arg1) => {
175
175
  const a = state0.a;
176
176
  state0.a = 0;
177
177
  try {
178
- return __wasm_bindgen_func_elem_353(a, state0.b, arg0, arg1);
178
+ return __wasm_bindgen_func_elem_355(a, state0.b, arg0, arg1);
179
179
  } finally {
180
180
  state0.a = a;
181
181
  }
@@ -186,22 +186,22 @@ export function __wbg_new_typed_1824d93f294193e5(arg0, arg1) {
186
186
  state0.a = 0;
187
187
  }
188
188
  }
189
- export function __wbg_open_72e5234a49d5f85d() { return handleError(function (arg0, arg1, arg2, arg3) {
189
+ export function __wbg_open_56eb9bc2b4228b89() { return handleError(function (arg0, arg1, arg2, arg3) {
190
190
  const ret = getObject(arg0).open(getStringFromWasm0(arg1, arg2), arg3 >>> 0);
191
191
  return addHeapObject(ret);
192
192
  }, arguments); }
193
- export function __wbg_queueMicrotask_0ab5b2d2393e99b9(arg0) {
193
+ export function __wbg_queueMicrotask_85c90f6987555d65(arg0) {
194
194
  const ret = getObject(arg0).queueMicrotask;
195
195
  return addHeapObject(ret);
196
196
  }
197
- export function __wbg_queueMicrotask_6a09b7bc46549209(arg0) {
197
+ export function __wbg_queueMicrotask_f6a1fa10b81d1fc0(arg0) {
198
198
  queueMicrotask(getObject(arg0));
199
199
  }
200
200
  export function __wbg_reasoningbankwasm_new(arg0) {
201
201
  const ret = ReasoningBankWasm.__wrap(arg0);
202
202
  return addHeapObject(ret);
203
203
  }
204
- export function __wbg_resolve_2191a4dfe481c25b(arg0) {
204
+ export function __wbg_resolve_35ec7e0c6af4c82c(arg0) {
205
205
  const ret = Promise.resolve(getObject(arg0));
206
206
  return addHeapObject(ret);
207
207
  }
@@ -212,32 +212,32 @@ export function __wbg_stack_3b0d974bbf31e44f(arg0, arg1) {
212
212
  getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);
213
213
  getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);
214
214
  }
215
- export function __wbg_static_accessor_GLOBAL_4ef717fb391d88b7() {
215
+ export function __wbg_static_accessor_GLOBAL_8eb4cd83130a11a0() {
216
216
  const ret = typeof global === 'undefined' ? null : global;
217
217
  return isLikeNone(ret) ? 0 : addHeapObject(ret);
218
218
  }
219
- export function __wbg_static_accessor_GLOBAL_THIS_8d1badc68b5a74f4() {
219
+ export function __wbg_static_accessor_GLOBAL_THIS_1e7044f654e934db() {
220
220
  const ret = typeof globalThis === 'undefined' ? null : globalThis;
221
221
  return isLikeNone(ret) ? 0 : addHeapObject(ret);
222
222
  }
223
- export function __wbg_static_accessor_SELF_146583524fe1469b() {
223
+ export function __wbg_static_accessor_SELF_d8b50611246a6d92() {
224
224
  const ret = typeof self === 'undefined' ? null : self;
225
225
  return isLikeNone(ret) ? 0 : addHeapObject(ret);
226
226
  }
227
- export function __wbg_static_accessor_WINDOW_f2829a2234d7819e() {
227
+ export function __wbg_static_accessor_WINDOW_fd0bc376bf0f8b42() {
228
228
  const ret = typeof window === 'undefined' ? null : window;
229
229
  return isLikeNone(ret) ? 0 : addHeapObject(ret);
230
230
  }
231
- export function __wbg_then_6ec10ae38b3e92f7(arg0, arg1) {
231
+ export function __wbg_then_b830475380919203(arg0, arg1) {
232
232
  const ret = getObject(arg0).then(getObject(arg1));
233
233
  return addHeapObject(ret);
234
234
  }
235
- export function __wbindgen_cast_0000000000000001(arg0, arg1) {
235
+ export function __wbindgen_generic_0000000000000001(arg0, arg1) {
236
236
  // Cast intrinsic for `Closure(Closure { owned: true, function: Function { arguments: [Externref], shim_idx: 95, ret: Result(Unit), inner_ret: Some(Result(Unit)) }, mutable: true }) -> Externref`.
237
- const ret = makeMutClosure(arg0, arg1, __wasm_bindgen_func_elem_338);
237
+ const ret = makeMutClosure(arg0, arg1, __wasm_bindgen_func_elem_342);
238
238
  return addHeapObject(ret);
239
239
  }
240
- export function __wbindgen_cast_0000000000000002(arg0, arg1) {
240
+ export function __wbindgen_generic_0000000000000002(arg0, arg1) {
241
241
  // Cast intrinsic for `Ref(String) -> Externref`.
242
242
  const ret = getStringFromWasm0(arg0, arg1);
243
243
  return addHeapObject(ret);
@@ -249,10 +249,14 @@ export function __wbindgen_object_clone_ref(arg0) {
249
249
  export function __wbindgen_object_drop_ref(arg0) {
250
250
  takeObject(arg0);
251
251
  }
252
- function __wasm_bindgen_func_elem_338(arg0, arg1, arg2) {
252
+ function __wasm_bindgen_func_elem_355(arg0, arg1, arg2, arg3) {
253
+ wasm.__wasm_bindgen_func_elem_355(arg0, arg1, addHeapObject(arg2), addHeapObject(arg3));
254
+ }
255
+
256
+ function __wasm_bindgen_func_elem_342(arg0, arg1, arg2) {
253
257
  try {
254
258
  const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
255
- wasm.__wasm_bindgen_func_elem_338(retptr, arg0, arg1, addHeapObject(arg2));
259
+ wasm.__wasm_bindgen_func_elem_342(retptr, arg0, arg1, addHeapObject(arg2));
256
260
  var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);
257
261
  var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);
258
262
  if (r1) {
@@ -263,10 +267,6 @@ function __wasm_bindgen_func_elem_338(arg0, arg1, arg2) {
263
267
  }
264
268
  }
265
269
 
266
- function __wasm_bindgen_func_elem_353(arg0, arg1, arg2, arg3) {
267
- wasm.__wasm_bindgen_func_elem_353(arg0, arg1, addHeapObject(arg2), addHeapObject(arg3));
268
- }
269
-
270
270
  const ReasoningBankWasmFinalization = (typeof FinalizationRegistry === 'undefined')
271
271
  ? { register: () => {}, unregister: () => {} }
272
272
  : new FinalizationRegistry(ptr => wasm.__wbg_reasoningbankwasm_free(ptr, 1));
@@ -2,6 +2,7 @@
2
2
  /* eslint-disable */
3
3
  export const memory: WebAssembly.Memory;
4
4
  export const __wbg_reasoningbankwasm_free: (a: number, b: number) => void;
5
+ export const init: () => void;
5
6
  export const log: (a: number, b: number) => void;
6
7
  export const reasoningbankwasm_findSimilar: (a: number, b: number, c: number, d: number, e: number, f: number) => number;
7
8
  export const reasoningbankwasm_getPattern: (a: number, b: number, c: number) => number;
@@ -9,9 +10,8 @@ export const reasoningbankwasm_getStats: (a: number) => number;
9
10
  export const reasoningbankwasm_new: (a: number, b: number) => number;
10
11
  export const reasoningbankwasm_searchByCategory: (a: number, b: number, c: number, d: number) => number;
11
12
  export const reasoningbankwasm_storePattern: (a: number, b: number, c: number) => number;
12
- export const init: () => void;
13
- export const __wasm_bindgen_func_elem_338: (a: number, b: number, c: number, d: number) => void;
14
- export const __wasm_bindgen_func_elem_353: (a: number, b: number, c: number, d: number) => void;
13
+ export const __wasm_bindgen_func_elem_342: (a: number, b: number, c: number, d: number) => void;
14
+ export const __wasm_bindgen_func_elem_355: (a: number, b: number, c: number, d: number) => void;
15
15
  export const __wbindgen_export: (a: number, b: number) => number;
16
16
  export const __wbindgen_export2: (a: number, b: number, c: number, d: number) => number;
17
17
  export const __wbindgen_export3: (a: number) => void;