agentdb 3.0.0-alpha.2 → 3.0.0-alpha.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +978 -2342
- package/dist/agentdb.browser.js +1492 -0
- package/dist/agentdb.browser.js.map +7 -0
- package/dist/agentdb.browser.min.js +3 -0
- package/dist/agentdb.browser.min.js.map +7 -0
- package/dist/agentdb.wasm-loader.js +207 -0
- package/dist/schemas/frontier-schema.sql +0 -7
- package/dist/schemas/schema.sql +0 -7
- package/dist/simulation/cli.d.ts +9 -0
- package/dist/simulation/cli.d.ts.map +1 -0
- package/dist/simulation/cli.js +68 -0
- package/dist/simulation/cli.js.map +1 -0
- package/dist/simulation/runner.d.ts +21 -0
- package/dist/simulation/runner.d.ts.map +1 -0
- package/dist/simulation/runner.js +241 -0
- package/dist/simulation/runner.js.map +1 -0
- package/dist/simulation/scenarios/aidefence-integration.d.ts +24 -0
- package/dist/simulation/scenarios/aidefence-integration.d.ts.map +1 -0
- package/dist/simulation/scenarios/aidefence-integration.js +124 -0
- package/dist/simulation/scenarios/aidefence-integration.js.map +1 -0
- package/dist/simulation/scenarios/bmssp-integration.d.ts +23 -0
- package/dist/simulation/scenarios/bmssp-integration.d.ts.map +1 -0
- package/dist/simulation/scenarios/bmssp-integration.js +104 -0
- package/dist/simulation/scenarios/bmssp-integration.js.map +1 -0
- package/dist/simulation/scenarios/causal-reasoning.d.ts +16 -0
- package/dist/simulation/scenarios/causal-reasoning.d.ts.map +1 -0
- package/dist/simulation/scenarios/causal-reasoning.js +108 -0
- package/dist/simulation/scenarios/causal-reasoning.js.map +1 -0
- package/dist/simulation/scenarios/consciousness-explorer.d.ts +25 -0
- package/dist/simulation/scenarios/consciousness-explorer.d.ts.map +1 -0
- package/dist/simulation/scenarios/consciousness-explorer.js +108 -0
- package/dist/simulation/scenarios/consciousness-explorer.js.map +1 -0
- package/dist/simulation/scenarios/domain-examples/e-commerce-recommendations.d.ts +135 -0
- package/dist/simulation/scenarios/domain-examples/e-commerce-recommendations.d.ts.map +1 -0
- package/dist/simulation/scenarios/domain-examples/e-commerce-recommendations.js +158 -0
- package/dist/simulation/scenarios/domain-examples/e-commerce-recommendations.js.map +1 -0
- package/dist/simulation/scenarios/domain-examples/index.d.ts +14 -0
- package/dist/simulation/scenarios/domain-examples/index.d.ts.map +1 -0
- package/dist/simulation/scenarios/domain-examples/index.js +14 -0
- package/dist/simulation/scenarios/domain-examples/index.js.map +1 -0
- package/dist/simulation/scenarios/domain-examples/iot-sensor-networks.d.ts +178 -0
- package/dist/simulation/scenarios/domain-examples/iot-sensor-networks.d.ts.map +1 -0
- package/dist/simulation/scenarios/domain-examples/iot-sensor-networks.js +218 -0
- package/dist/simulation/scenarios/domain-examples/iot-sensor-networks.js.map +1 -0
- package/dist/simulation/scenarios/domain-examples/medical-imaging.d.ts +122 -0
- package/dist/simulation/scenarios/domain-examples/medical-imaging.d.ts.map +1 -0
- package/dist/simulation/scenarios/domain-examples/medical-imaging.js +129 -0
- package/dist/simulation/scenarios/domain-examples/medical-imaging.js.map +1 -0
- package/dist/simulation/scenarios/domain-examples/robotics-navigation.d.ts +166 -0
- package/dist/simulation/scenarios/domain-examples/robotics-navigation.d.ts.map +1 -0
- package/dist/simulation/scenarios/domain-examples/robotics-navigation.js +161 -0
- package/dist/simulation/scenarios/domain-examples/robotics-navigation.js.map +1 -0
- package/dist/simulation/scenarios/domain-examples/scientific-research.d.ts +151 -0
- package/dist/simulation/scenarios/domain-examples/scientific-research.d.ts.map +1 -0
- package/dist/simulation/scenarios/domain-examples/scientific-research.js +187 -0
- package/dist/simulation/scenarios/domain-examples/scientific-research.js.map +1 -0
- package/dist/simulation/scenarios/domain-examples/trading-systems.d.ts +102 -0
- package/dist/simulation/scenarios/domain-examples/trading-systems.d.ts.map +1 -0
- package/dist/simulation/scenarios/domain-examples/trading-systems.js +100 -0
- package/dist/simulation/scenarios/domain-examples/trading-systems.js.map +1 -0
- package/dist/simulation/scenarios/goalie-integration.d.ts +24 -0
- package/dist/simulation/scenarios/goalie-integration.d.ts.map +1 -0
- package/dist/simulation/scenarios/goalie-integration.js +121 -0
- package/dist/simulation/scenarios/goalie-integration.js.map +1 -0
- package/dist/simulation/scenarios/graph-traversal.d.ts +17 -0
- package/dist/simulation/scenarios/graph-traversal.d.ts.map +1 -0
- package/dist/simulation/scenarios/graph-traversal.js +101 -0
- package/dist/simulation/scenarios/graph-traversal.js.map +1 -0
- package/dist/simulation/scenarios/latent-space/attention-analysis.d.ts +45 -0
- package/dist/simulation/scenarios/latent-space/attention-analysis.d.ts.map +1 -0
- package/dist/simulation/scenarios/latent-space/attention-analysis.js +435 -0
- package/dist/simulation/scenarios/latent-space/attention-analysis.js.map +1 -0
- package/dist/simulation/scenarios/latent-space/clustering-analysis.d.ts +55 -0
- package/dist/simulation/scenarios/latent-space/clustering-analysis.d.ts.map +1 -0
- package/dist/simulation/scenarios/latent-space/clustering-analysis.js +606 -0
- package/dist/simulation/scenarios/latent-space/clustering-analysis.js.map +1 -0
- package/dist/simulation/scenarios/latent-space/hnsw-exploration.d.ts +74 -0
- package/dist/simulation/scenarios/latent-space/hnsw-exploration.d.ts.map +1 -0
- package/dist/simulation/scenarios/latent-space/hnsw-exploration.js +391 -0
- package/dist/simulation/scenarios/latent-space/hnsw-exploration.js.map +1 -0
- package/dist/simulation/scenarios/latent-space/hypergraph-exploration.d.ts +51 -0
- package/dist/simulation/scenarios/latent-space/hypergraph-exploration.d.ts.map +1 -0
- package/dist/simulation/scenarios/latent-space/hypergraph-exploration.js +536 -0
- package/dist/simulation/scenarios/latent-space/hypergraph-exploration.js.map +1 -0
- package/dist/simulation/scenarios/latent-space/index.d.ts +35 -0
- package/dist/simulation/scenarios/latent-space/index.d.ts.map +1 -0
- package/dist/simulation/scenarios/latent-space/index.js +35 -0
- package/dist/simulation/scenarios/latent-space/index.js.map +1 -0
- package/dist/simulation/scenarios/latent-space/neural-augmentation.d.ts +52 -0
- package/dist/simulation/scenarios/latent-space/neural-augmentation.d.ts.map +1 -0
- package/dist/simulation/scenarios/latent-space/neural-augmentation.js +472 -0
- package/dist/simulation/scenarios/latent-space/neural-augmentation.js.map +1 -0
- package/dist/simulation/scenarios/latent-space/quantum-hybrid.d.ts +53 -0
- package/dist/simulation/scenarios/latent-space/quantum-hybrid.d.ts.map +1 -0
- package/dist/simulation/scenarios/latent-space/quantum-hybrid.js +391 -0
- package/dist/simulation/scenarios/latent-space/quantum-hybrid.js.map +1 -0
- package/dist/simulation/scenarios/latent-space/self-organizing-hnsw.d.ts +52 -0
- package/dist/simulation/scenarios/latent-space/self-organizing-hnsw.d.ts.map +1 -0
- package/dist/simulation/scenarios/latent-space/self-organizing-hnsw.js +514 -0
- package/dist/simulation/scenarios/latent-space/self-organizing-hnsw.js.map +1 -0
- package/dist/simulation/scenarios/latent-space/traversal-optimization.d.ts +53 -0
- package/dist/simulation/scenarios/latent-space/traversal-optimization.d.ts.map +1 -0
- package/dist/simulation/scenarios/latent-space/traversal-optimization.js +595 -0
- package/dist/simulation/scenarios/latent-space/traversal-optimization.js.map +1 -0
- package/dist/simulation/scenarios/lean-agentic-swarm.d.ts +18 -0
- package/dist/simulation/scenarios/lean-agentic-swarm.d.ts.map +1 -0
- package/dist/simulation/scenarios/lean-agentic-swarm.js +132 -0
- package/dist/simulation/scenarios/lean-agentic-swarm.js.map +1 -0
- package/dist/simulation/scenarios/multi-agent-swarm.d.ts +17 -0
- package/dist/simulation/scenarios/multi-agent-swarm.d.ts.map +1 -0
- package/dist/simulation/scenarios/multi-agent-swarm.js +111 -0
- package/dist/simulation/scenarios/multi-agent-swarm.js.map +1 -0
- package/dist/simulation/scenarios/psycho-symbolic-reasoner.d.ts +23 -0
- package/dist/simulation/scenarios/psycho-symbolic-reasoner.d.ts.map +1 -0
- package/dist/simulation/scenarios/psycho-symbolic-reasoner.js +98 -0
- package/dist/simulation/scenarios/psycho-symbolic-reasoner.js.map +1 -0
- package/dist/simulation/scenarios/reflexion-learning.d.ts +16 -0
- package/dist/simulation/scenarios/reflexion-learning.d.ts.map +1 -0
- package/dist/simulation/scenarios/reflexion-learning.js +98 -0
- package/dist/simulation/scenarios/reflexion-learning.js.map +1 -0
- package/dist/simulation/scenarios/research-swarm.d.ts +24 -0
- package/dist/simulation/scenarios/research-swarm.d.ts.map +1 -0
- package/dist/simulation/scenarios/research-swarm.js +146 -0
- package/dist/simulation/scenarios/research-swarm.js.map +1 -0
- package/dist/simulation/scenarios/skill-evolution.d.ts +16 -0
- package/dist/simulation/scenarios/skill-evolution.d.ts.map +1 -0
- package/dist/simulation/scenarios/skill-evolution.js +109 -0
- package/dist/simulation/scenarios/skill-evolution.js.map +1 -0
- package/dist/simulation/scenarios/stock-market-emergence.d.ts +33 -0
- package/dist/simulation/scenarios/stock-market-emergence.d.ts.map +1 -0
- package/dist/simulation/scenarios/stock-market-emergence.js +246 -0
- package/dist/simulation/scenarios/stock-market-emergence.js.map +1 -0
- package/dist/simulation/scenarios/strange-loops.d.ts +18 -0
- package/dist/simulation/scenarios/strange-loops.d.ts.map +1 -0
- package/dist/simulation/scenarios/strange-loops.js +133 -0
- package/dist/simulation/scenarios/strange-loops.js.map +1 -0
- package/dist/simulation/scenarios/sublinear-solver.d.ts +22 -0
- package/dist/simulation/scenarios/sublinear-solver.d.ts.map +1 -0
- package/dist/simulation/scenarios/sublinear-solver.js +82 -0
- package/dist/simulation/scenarios/sublinear-solver.js.map +1 -0
- package/dist/simulation/scenarios/temporal-lead-solver.d.ts +23 -0
- package/dist/simulation/scenarios/temporal-lead-solver.d.ts.map +1 -0
- package/dist/simulation/scenarios/temporal-lead-solver.js +90 -0
- package/dist/simulation/scenarios/temporal-lead-solver.js.map +1 -0
- package/dist/simulation/scenarios/voting-system-consensus.d.ts +27 -0
- package/dist/simulation/scenarios/voting-system-consensus.d.ts.map +1 -0
- package/dist/simulation/scenarios/voting-system-consensus.js +175 -0
- package/dist/simulation/scenarios/voting-system-consensus.js.map +1 -0
- package/dist/simulation/types.d.ts +162 -0
- package/dist/simulation/types.d.ts.map +1 -0
- package/dist/simulation/types.js +5 -0
- package/dist/simulation/types.js.map +1 -0
- package/dist/simulation/utils/PerformanceOptimizer.d.ts +115 -0
- package/dist/simulation/utils/PerformanceOptimizer.d.ts.map +1 -0
- package/dist/simulation/utils/PerformanceOptimizer.js +223 -0
- package/dist/simulation/utils/PerformanceOptimizer.js.map +1 -0
- package/dist/src/backends/GraphBackend.d.ts +8 -8
- package/dist/src/backends/GraphBackend.d.ts.map +1 -1
- package/dist/src/backends/GraphBackend.js +15 -16
- package/dist/src/backends/GraphBackend.js.map +1 -1
- package/dist/src/backends/LearningBackend.d.ts +2 -2
- package/dist/src/backends/LearningBackend.d.ts.map +1 -1
- package/dist/src/backends/LearningBackend.js +10 -11
- package/dist/src/backends/LearningBackend.js.map +1 -1
- package/dist/src/backends/VectorBackend.d.ts +6 -31
- package/dist/src/backends/VectorBackend.d.ts.map +1 -1
- package/dist/src/backends/detector.d.ts +3 -25
- package/dist/src/backends/detector.d.ts.map +1 -1
- package/dist/src/backends/detector.js +15 -119
- package/dist/src/backends/detector.js.map +1 -1
- package/dist/src/backends/factory.d.ts +32 -16
- package/dist/src/backends/factory.d.ts.map +1 -1
- package/dist/src/backends/factory.js +70 -133
- package/dist/src/backends/factory.js.map +1 -1
- package/dist/src/backends/graph/GraphDatabaseAdapter.d.ts +1 -1
- package/dist/src/backends/graph/GraphDatabaseAdapter.d.ts.map +1 -1
- package/dist/src/backends/graph/GraphDatabaseAdapter.js +1 -5
- package/dist/src/backends/graph/GraphDatabaseAdapter.js.map +1 -1
- package/dist/src/backends/hnswlib/HNSWLibBackend.d.ts +2 -2
- package/dist/src/backends/hnswlib/HNSWLibBackend.d.ts.map +1 -1
- package/dist/src/backends/hnswlib/HNSWLibBackend.js +13 -49
- package/dist/src/backends/hnswlib/HNSWLibBackend.js.map +1 -1
- package/dist/src/backends/index.d.ts +3 -25
- package/dist/src/backends/index.d.ts.map +1 -1
- package/dist/src/backends/index.js +1 -23
- package/dist/src/backends/index.js.map +1 -1
- package/dist/src/backends/ruvector/GuardedVectorBackend.d.ts +93 -0
- package/dist/src/backends/ruvector/GuardedVectorBackend.d.ts.map +1 -0
- package/dist/src/backends/ruvector/GuardedVectorBackend.js +182 -0
- package/dist/src/backends/ruvector/GuardedVectorBackend.js.map +1 -0
- package/dist/src/backends/ruvector/RuVectorBackend.d.ts +16 -187
- package/dist/src/backends/ruvector/RuVectorBackend.d.ts.map +1 -1
- package/dist/src/backends/ruvector/RuVectorBackend.js +94 -576
- package/dist/src/backends/ruvector/RuVectorBackend.js.map +1 -1
- package/dist/src/backends/ruvector/RuVectorLearning.d.ts +4 -0
- package/dist/src/backends/ruvector/RuVectorLearning.d.ts.map +1 -1
- package/dist/src/backends/ruvector/RuVectorLearning.js +11 -10
- package/dist/src/backends/ruvector/RuVectorLearning.js.map +1 -1
- package/dist/src/benchmarks/wasm-vector-benchmark.d.ts +10 -0
- package/dist/src/benchmarks/wasm-vector-benchmark.d.ts.map +1 -0
- package/dist/src/benchmarks/wasm-vector-benchmark.js +196 -0
- package/dist/src/benchmarks/wasm-vector-benchmark.js.map +1 -0
- package/dist/src/browser/AdvancedFeatures.d.ts.map +1 -1
- package/dist/src/browser/AdvancedFeatures.js +10 -3
- package/dist/src/browser/AdvancedFeatures.js.map +1 -1
- package/dist/src/browser/AttentionBrowser.d.ts.map +1 -1
- package/dist/src/browser/AttentionBrowser.js +12 -5
- package/dist/src/browser/AttentionBrowser.js.map +1 -1
- package/dist/src/browser/HNSWIndex.d.ts +1 -31
- package/dist/src/browser/HNSWIndex.d.ts.map +1 -1
- package/dist/src/browser/HNSWIndex.js +18 -136
- package/dist/src/browser/HNSWIndex.js.map +1 -1
- package/dist/src/browser/ProductQuantization.d.ts.map +1 -1
- package/dist/src/browser/ProductQuantization.js +1 -0
- package/dist/src/browser/ProductQuantization.js.map +1 -1
- package/dist/src/browser/index.d.ts +3 -3
- package/dist/src/browser/index.d.ts.map +1 -1
- package/dist/src/browser/index.js +1 -2
- package/dist/src/browser/index.js.map +1 -1
- package/dist/src/cli/agentdb-cli.d.ts +2 -16
- package/dist/src/cli/agentdb-cli.d.ts.map +1 -1
- package/dist/src/cli/agentdb-cli.js +216 -853
- package/dist/src/cli/agentdb-cli.js.map +1 -1
- package/dist/src/cli/commands/attention.js +3 -3
- package/dist/src/cli/commands/attention.js.map +1 -1
- package/dist/src/cli/commands/doctor.d.ts +0 -2
- package/dist/src/cli/commands/doctor.d.ts.map +1 -1
- package/dist/src/cli/commands/doctor.js +1 -106
- package/dist/src/cli/commands/doctor.js.map +1 -1
- package/dist/src/cli/commands/init.d.ts +1 -2
- package/dist/src/cli/commands/init.d.ts.map +1 -1
- package/dist/src/cli/commands/init.js +7 -30
- package/dist/src/cli/commands/init.js.map +1 -1
- package/dist/src/cli/commands/install-embeddings.d.ts.map +1 -1
- package/dist/src/cli/commands/install-embeddings.js.map +1 -1
- package/dist/src/cli/commands/migrate.d.ts +0 -15
- package/dist/src/cli/commands/migrate.d.ts.map +1 -1
- package/dist/src/cli/commands/migrate.js +5 -164
- package/dist/src/cli/commands/migrate.js.map +1 -1
- package/dist/src/cli/commands/simulate-report.js.map +1 -1
- package/dist/src/cli/commands/simulate-wizard.js.map +1 -1
- package/dist/src/cli/commands/simulate.d.ts +7 -0
- package/dist/src/cli/commands/simulate.d.ts.map +1 -0
- package/dist/src/cli/commands/simulate.js +100 -0
- package/dist/src/cli/commands/simulate.js.map +1 -0
- package/dist/src/cli/commands/status.js +1 -5
- package/dist/src/cli/commands/status.js.map +1 -1
- package/dist/src/cli/lib/attention-config.d.ts +2 -2
- package/dist/src/cli/lib/attention-config.d.ts.map +1 -1
- package/dist/src/cli/lib/attention-config.js +1 -2
- package/dist/src/cli/lib/attention-config.js.map +1 -1
- package/dist/src/cli/lib/config-manager.d.ts +110 -0
- package/dist/src/cli/lib/config-manager.d.ts.map +1 -0
- package/dist/src/cli/lib/config-manager.js +512 -0
- package/dist/src/cli/lib/config-manager.js.map +1 -0
- package/dist/src/cli/lib/config-validator.d.ts +1 -1
- package/dist/src/cli/lib/config-validator.d.ts.map +1 -1
- package/dist/src/cli/lib/health-monitor.d.ts +149 -0
- package/dist/src/cli/lib/health-monitor.d.ts.map +1 -0
- package/dist/src/cli/lib/health-monitor.js +380 -0
- package/dist/src/cli/lib/health-monitor.js.map +1 -0
- package/dist/src/cli/lib/history-tracker.d.ts +103 -0
- package/dist/src/cli/lib/history-tracker.d.ts.map +1 -0
- package/dist/src/cli/lib/history-tracker.js +352 -0
- package/dist/src/cli/lib/history-tracker.js.map +1 -0
- package/dist/src/cli/lib/report-store.d.ts +1 -2
- package/dist/src/cli/lib/report-store.d.ts.map +1 -1
- package/dist/src/cli/lib/report-store.js +65 -87
- package/dist/src/cli/lib/report-store.js.map +1 -1
- package/dist/src/cli/lib/simulation-registry.d.ts +1 -1
- package/dist/src/cli/lib/simulation-registry.d.ts.map +1 -1
- package/dist/src/cli/lib/simulation-registry.js +0 -1
- package/dist/src/cli/lib/simulation-registry.js.map +1 -1
- package/dist/src/cli/lib/simulation-runner.d.ts +4 -41
- package/dist/src/cli/lib/simulation-runner.d.ts.map +1 -1
- package/dist/src/cli/lib/simulation-runner.js +6 -251
- package/dist/src/cli/lib/simulation-runner.js.map +1 -1
- package/dist/src/controllers/AttentionService.d.ts.map +1 -1
- package/dist/src/controllers/AttentionService.js +5 -3
- package/dist/src/controllers/AttentionService.js.map +1 -1
- package/dist/src/controllers/CausalMemoryGraph.d.ts +8 -33
- package/dist/src/controllers/CausalMemoryGraph.d.ts.map +1 -1
- package/dist/src/controllers/CausalMemoryGraph.js +16 -93
- package/dist/src/controllers/CausalMemoryGraph.js.map +1 -1
- package/dist/src/controllers/CausalRecall.d.ts +3 -6
- package/dist/src/controllers/CausalRecall.d.ts.map +1 -1
- package/dist/src/controllers/CausalRecall.js +8 -14
- package/dist/src/controllers/CausalRecall.js.map +1 -1
- package/dist/src/controllers/ContextSynthesizer.d.ts +1 -1
- package/dist/src/controllers/ContextSynthesizer.d.ts.map +1 -1
- package/dist/src/controllers/EmbeddingService.d.ts.map +1 -1
- package/dist/src/controllers/EmbeddingService.js +3 -10
- package/dist/src/controllers/EmbeddingService.js.map +1 -1
- package/dist/src/controllers/EnhancedEmbeddingService.d.ts +0 -4
- package/dist/src/controllers/EnhancedEmbeddingService.d.ts.map +1 -1
- package/dist/src/controllers/EnhancedEmbeddingService.js +3 -10
- package/dist/src/controllers/EnhancedEmbeddingService.js.map +1 -1
- package/dist/src/controllers/ExplainableRecall.d.ts +6 -5
- package/dist/src/controllers/ExplainableRecall.d.ts.map +1 -1
- package/dist/src/controllers/ExplainableRecall.js +13 -21
- package/dist/src/controllers/ExplainableRecall.js.map +1 -1
- package/dist/src/controllers/HNSWIndex.d.ts +7 -24
- package/dist/src/controllers/HNSWIndex.d.ts.map +1 -1
- package/dist/src/controllers/HNSWIndex.js +10 -89
- package/dist/src/controllers/HNSWIndex.js.map +1 -1
- package/dist/src/controllers/LearningSystem.d.ts +10 -106
- package/dist/src/controllers/LearningSystem.d.ts.map +1 -1
- package/dist/src/controllers/LearningSystem.js +14 -39
- package/dist/src/controllers/LearningSystem.js.map +1 -1
- package/dist/src/controllers/MMRDiversityRanker.d.ts +1 -1
- package/dist/src/controllers/MMRDiversityRanker.d.ts.map +1 -1
- package/dist/src/controllers/MetadataFilter.d.ts +3 -3
- package/dist/src/controllers/MetadataFilter.d.ts.map +1 -1
- package/dist/src/controllers/MetadataFilter.js +6 -9
- package/dist/src/controllers/MetadataFilter.js.map +1 -1
- package/dist/src/controllers/NightlyLearner.d.ts +4 -9
- package/dist/src/controllers/NightlyLearner.d.ts.map +1 -1
- package/dist/src/controllers/NightlyLearner.js +9 -28
- package/dist/src/controllers/NightlyLearner.js.map +1 -1
- package/dist/src/controllers/QUICClient.d.ts +2 -50
- package/dist/src/controllers/QUICClient.d.ts.map +1 -1
- package/dist/src/controllers/QUICClient.js +3 -193
- package/dist/src/controllers/QUICClient.js.map +1 -1
- package/dist/src/controllers/QUICServer.d.ts +4 -4
- package/dist/src/controllers/QUICServer.d.ts.map +1 -1
- package/dist/src/controllers/QUICServer.js +14 -22
- package/dist/src/controllers/QUICServer.js.map +1 -1
- package/dist/src/controllers/ReasoningBank.d.ts +4 -14
- package/dist/src/controllers/ReasoningBank.d.ts.map +1 -1
- package/dist/src/controllers/ReasoningBank.js +46 -59
- package/dist/src/controllers/ReasoningBank.js.map +1 -1
- package/dist/src/controllers/ReflexionMemory.d.ts +7 -80
- package/dist/src/controllers/ReflexionMemory.d.ts.map +1 -1
- package/dist/src/controllers/ReflexionMemory.js +214 -372
- package/dist/src/controllers/ReflexionMemory.js.map +1 -1
- package/dist/src/controllers/SkillLibrary.d.ts +7 -37
- package/dist/src/controllers/SkillLibrary.d.ts.map +1 -1
- package/dist/src/controllers/SkillLibrary.js +96 -212
- package/dist/src/controllers/SkillLibrary.js.map +1 -1
- package/dist/src/controllers/SyncCoordinator.d.ts +3 -2
- package/dist/src/controllers/SyncCoordinator.d.ts.map +1 -1
- package/dist/src/controllers/SyncCoordinator.js +5 -117
- package/dist/src/controllers/SyncCoordinator.js.map +1 -1
- package/dist/src/controllers/WASMVectorSearch.d.ts +9 -20
- package/dist/src/controllers/WASMVectorSearch.d.ts.map +1 -1
- package/dist/src/controllers/WASMVectorSearch.js +29 -154
- package/dist/src/controllers/WASMVectorSearch.js.map +1 -1
- package/dist/src/controllers/frontier-index.d.ts +14 -0
- package/dist/src/controllers/frontier-index.d.ts.map +1 -0
- package/dist/src/controllers/frontier-index.js +10 -0
- package/dist/src/controllers/frontier-index.js.map +1 -0
- package/dist/src/controllers/index.d.ts +17 -8
- package/dist/src/controllers/index.d.ts.map +1 -1
- package/dist/src/controllers/index.js +12 -6
- package/dist/src/controllers/index.js.map +1 -1
- package/dist/src/core/AgentDB.d.ts +25 -57
- package/dist/src/core/AgentDB.d.ts.map +1 -1
- package/dist/src/core/AgentDB.js +115 -137
- package/dist/src/core/AgentDB.js.map +1 -1
- package/dist/src/db-fallback.d.ts +1 -10
- package/dist/src/db-fallback.d.ts.map +1 -1
- package/dist/src/db-fallback.js +4 -171
- package/dist/src/db-fallback.js.map +1 -1
- package/dist/src/db-test.d.ts +13 -0
- package/dist/src/db-test.d.ts.map +1 -0
- package/dist/src/db-test.js +55 -0
- package/dist/src/db-test.js.map +1 -0
- package/dist/src/db-unified.d.ts +76 -0
- package/dist/src/db-unified.d.ts.map +1 -0
- package/dist/src/db-unified.js +279 -0
- package/dist/src/db-unified.js.map +1 -0
- package/dist/src/examples/quic-sync-example.d.ts +9 -0
- package/dist/src/examples/quic-sync-example.d.ts.map +1 -0
- package/dist/src/examples/quic-sync-example.js +169 -0
- package/dist/src/examples/quic-sync-example.js.map +1 -0
- package/dist/src/examples/wasm-vector-usage.d.ts +12 -0
- package/dist/src/examples/wasm-vector-usage.d.ts.map +1 -0
- package/dist/src/examples/wasm-vector-usage.js +190 -0
- package/dist/src/examples/wasm-vector-usage.js.map +1 -0
- package/dist/src/index.d.ts +12 -38
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +11 -46
- package/dist/src/index.js.map +1 -1
- package/dist/src/mcp/agentdb-mcp-server.js +63 -219
- package/dist/src/mcp/agentdb-mcp-server.js.map +1 -1
- package/dist/src/mcp/learning-tools-handlers.d.ts +16 -0
- package/dist/src/mcp/learning-tools-handlers.d.ts.map +1 -0
- package/dist/src/mcp/learning-tools-handlers.js +105 -0
- package/dist/src/mcp/learning-tools-handlers.js.map +1 -0
- package/dist/src/optimizations/BatchOperations.d.ts +5 -52
- package/dist/src/optimizations/BatchOperations.d.ts.map +1 -1
- package/dist/src/optimizations/BatchOperations.js +33 -186
- package/dist/src/optimizations/BatchOperations.js.map +1 -1
- package/dist/src/optimizations/QueryOptimizer.d.ts +4 -4
- package/dist/src/optimizations/QueryOptimizer.d.ts.map +1 -1
- package/dist/src/optimizations/QueryOptimizer.js +1 -3
- package/dist/src/optimizations/QueryOptimizer.js.map +1 -1
- package/dist/src/optimizations/ToolCache.d.ts +4 -4
- package/dist/src/optimizations/ToolCache.d.ts.map +1 -1
- package/dist/src/optimizations/ToolCache.js.map +1 -1
- package/dist/src/optimizations/index.d.ts +1 -1
- package/dist/src/optimizations/index.d.ts.map +1 -1
- package/dist/src/security/AttestationLog.d.ts +70 -0
- package/dist/src/security/AttestationLog.d.ts.map +1 -0
- package/dist/src/security/AttestationLog.js +174 -0
- package/dist/src/security/AttestationLog.js.map +1 -0
- package/dist/src/security/MutationGuard.d.ts +83 -0
- package/dist/src/security/MutationGuard.d.ts.map +1 -0
- package/dist/src/security/MutationGuard.js +379 -0
- package/dist/src/security/MutationGuard.js.map +1 -0
- package/dist/src/security/index.d.ts +15 -0
- package/dist/src/security/index.d.ts.map +1 -0
- package/dist/src/security/index.js +18 -0
- package/dist/src/security/index.js.map +1 -0
- package/dist/src/security/input-validation.d.ts +12 -12
- package/dist/src/security/input-validation.d.ts.map +1 -1
- package/dist/src/security/input-validation.js +0 -1
- package/dist/src/security/input-validation.js.map +1 -1
- package/dist/src/security/limits.d.ts +150 -0
- package/dist/src/security/limits.d.ts.map +1 -0
- package/dist/src/security/limits.js +288 -0
- package/dist/src/security/limits.js.map +1 -0
- package/dist/src/security/path-security.d.ts +100 -0
- package/dist/src/security/path-security.d.ts.map +1 -0
- package/dist/src/security/path-security.js +337 -0
- package/dist/src/security/path-security.js.map +1 -0
- package/dist/src/security/validation.d.ts +95 -0
- package/dist/src/security/validation.d.ts.map +1 -0
- package/dist/src/security/validation.js +315 -0
- package/dist/src/security/validation.js.map +1 -0
- package/dist/src/services/GraphTransformerService.d.ts +79 -0
- package/dist/src/services/GraphTransformerService.d.ts.map +1 -0
- package/dist/src/services/GraphTransformerService.js +331 -0
- package/dist/src/services/GraphTransformerService.js.map +1 -0
- package/dist/src/services/LLMRouter.d.ts +7 -61
- package/dist/src/services/LLMRouter.d.ts.map +1 -1
- package/dist/src/services/LLMRouter.js +25 -295
- package/dist/src/services/LLMRouter.js.map +1 -1
- package/dist/src/services/SemanticRouter.d.ts +78 -0
- package/dist/src/services/SemanticRouter.d.ts.map +1 -0
- package/dist/src/services/SemanticRouter.js +149 -0
- package/dist/src/services/SemanticRouter.js.map +1 -0
- package/dist/src/services/SonaTrajectoryService.d.ts +100 -0
- package/dist/src/services/SonaTrajectoryService.d.ts.map +1 -0
- package/dist/src/services/SonaTrajectoryService.js +231 -0
- package/dist/src/services/SonaTrajectoryService.js.map +1 -0
- package/dist/src/types/attention.d.ts +249 -0
- package/dist/src/types/attention.d.ts.map +1 -0
- package/dist/src/types/attention.js +43 -0
- package/dist/src/types/attention.js.map +1 -0
- package/dist/src/types/quic.d.ts +518 -0
- package/dist/src/types/quic.d.ts.map +1 -0
- package/dist/src/types/quic.js +272 -0
- package/dist/src/types/quic.js.map +1 -0
- package/dist/src/utils/LegacyAttentionAdapter.d.ts +93 -0
- package/dist/src/utils/LegacyAttentionAdapter.d.ts.map +1 -0
- package/dist/src/utils/LegacyAttentionAdapter.js +241 -0
- package/dist/src/utils/LegacyAttentionAdapter.js.map +1 -0
- package/dist/src/utils/attention-metrics.d.ts +76 -0
- package/dist/src/utils/attention-metrics.d.ts.map +1 -0
- package/dist/src/utils/attention-metrics.js +178 -0
- package/dist/src/utils/attention-metrics.js.map +1 -0
- package/dist/src/utils/vector-math.d.ts +29 -0
- package/dist/src/utils/vector-math.d.ts.map +1 -0
- package/dist/src/utils/vector-math.js +66 -0
- package/dist/src/utils/vector-math.js.map +1 -0
- package/examples/README.md +105 -0
- package/examples/browser/attention-demo.html +499 -0
- package/examples/browser/flash-consolidation.html +598 -0
- package/examples/browser/hyperbolic-hierarchy.html +497 -0
- package/examples/quickstart.js +43 -0
- package/package.json +53 -56
- package/simulation/.claude-flow/metrics/agent-metrics.json +1 -0
- package/simulation/.claude-flow/metrics/performance.json +87 -0
- package/simulation/.claude-flow/metrics/task-metrics.json +10 -0
- package/simulation/COMPLETION-STATUS.md +139 -0
- package/simulation/FINAL-RESULTS.md +414 -0
- package/simulation/FINAL-STATUS.md +281 -0
- package/simulation/INTEGRATION-COMPLETE.md +452 -0
- package/simulation/MIGRATION-STATUS.md +231 -0
- package/simulation/OPTIMIZATION-RESULTS.md +397 -0
- package/simulation/PHASE1-COMPLETE.md +163 -0
- package/simulation/README.md +848 -0
- package/simulation/SIMULATION-RESULTS.md +239 -0
- package/simulation/cli.ts +78 -0
- package/simulation/configs/default.json +37 -0
- package/simulation/data/advanced/aidefence.graph +0 -0
- package/simulation/data/advanced/bmssp.graph +0 -0
- package/simulation/data/advanced/consciousness.graph +0 -0
- package/simulation/data/advanced/goalie.graph +0 -0
- package/simulation/data/advanced/psycho-symbolic.graph +0 -0
- package/simulation/data/advanced/research-swarm.graph +0 -0
- package/simulation/data/advanced/sublinear.graph +0 -0
- package/simulation/data/advanced/temporal.graph +0 -0
- package/simulation/data/causal.graph +0 -0
- package/simulation/data/graph-traversal.graph +0 -0
- package/simulation/data/lean-agentic.graph +0 -0
- package/simulation/data/reflexion.graph +0 -0
- package/simulation/data/skills.graph +0 -0
- package/simulation/data/stock-market.graph +0 -0
- package/simulation/data/strange-loops.graph +0 -0
- package/simulation/data/swarm.graph +0 -0
- package/simulation/data/voting-consensus.graph +0 -0
- package/simulation/docs/CLI-INTEGRATION-PLAN.md +1038 -0
- package/simulation/docs/COMPREHENSIVE-LATENT-SPACE-COMPLETION.md +354 -0
- package/simulation/docs/DOCUMENTATION-INDEX.md +226 -0
- package/simulation/docs/IMPLEMENTATION-COMPLETE.md +521 -0
- package/simulation/docs/OPTIMIZATION-SUMMARY.md +279 -0
- package/simulation/docs/README.md +229 -0
- package/simulation/docs/SWARM-5-INTEGRATION-SUMMARY.md +528 -0
- package/simulation/docs/TESTING-SUMMARY.md +304 -0
- package/simulation/docs/architecture/EXTENSION-API.md +868 -0
- package/simulation/docs/architecture/INTEGRATION-ARCHITECTURE.md +1138 -0
- package/simulation/docs/architecture/OPTIMIZATION-STRATEGY.md +778 -0
- package/simulation/docs/architecture/SIMULATION-ARCHITECTURE.md +892 -0
- package/simulation/docs/guides/CLI-REFERENCE.md +896 -0
- package/simulation/docs/guides/CUSTOM-SIMULATIONS.md +931 -0
- package/simulation/docs/guides/DEPLOYMENT.md +832 -0
- package/simulation/docs/guides/IMPLEMENTATION-SUMMARY.md +544 -0
- package/simulation/docs/guides/MIGRATION-GUIDE.md +591 -0
- package/simulation/docs/guides/QUICK-START.md +361 -0
- package/simulation/docs/guides/README.md +736 -0
- package/simulation/docs/guides/TROUBLESHOOTING.md +817 -0
- package/simulation/docs/guides/WIZARD-GUIDE.md +869 -0
- package/simulation/docs/reports/latent-space/MASTER-SYNTHESIS.md +345 -0
- package/simulation/docs/reports/latent-space/README.md +132 -0
- package/simulation/docs/reports/latent-space/attention-analysis-RESULTS.md +238 -0
- package/simulation/docs/reports/latent-space/clustering-analysis-RESULTS.md +210 -0
- package/simulation/docs/reports/latent-space/hnsw-exploration-RESULTS.md +332 -0
- package/simulation/docs/reports/latent-space/hypergraph-exploration-RESULTS.md +37 -0
- package/simulation/docs/reports/latent-space/neural-augmentation-RESULTS.md +69 -0
- package/simulation/docs/reports/latent-space/quantum-hybrid-RESULTS.md +91 -0
- package/simulation/docs/reports/latent-space/self-organizing-hnsw-RESULTS.md +51 -0
- package/simulation/docs/reports/latent-space/traversal-optimization-RESULTS.md +238 -0
- package/simulation/reports/README.md +397 -0
- package/simulation/reports/advanced-simulations-performance.md +1241 -0
- package/simulation/reports/aidefence-integration-2025-11-30T01-36-53-486Z.json +30 -0
- package/simulation/reports/architecture-analysis.md +1396 -0
- package/simulation/reports/basic-scenarios-performance.md +1840 -0
- package/simulation/reports/bmssp-integration-2025-11-30T01-36-27-193Z.json +30 -0
- package/simulation/reports/bmssp-integration-2025-11-30T03-38-12-887Z.json +30 -0
- package/simulation/reports/causal-reasoning-2025-11-29T23-35-21-795Z.json +36 -0
- package/simulation/reports/causal-reasoning-2025-11-30T00-58-42-862Z.json +30 -0
- package/simulation/reports/causal-reasoning-2025-11-30T00-59-12-546Z.json +40 -0
- package/simulation/reports/consciousness-explorer-2025-11-30T01-36-51-269Z.json +31 -0
- package/simulation/reports/core-benchmarks.md +727 -0
- package/simulation/reports/goalie-integration-2025-11-30T01-36-52-377Z.json +30 -0
- package/simulation/reports/graph-traversal-2025-11-29T23-35-35-279Z.json +78 -0
- package/simulation/reports/graph-traversal-2025-11-29T23-37-36-697Z.json +30 -0
- package/simulation/reports/graph-traversal-2025-11-30T01-03-59-716Z.json +30 -0
- package/simulation/reports/graph-traversal-2025-11-30T01-05-10-984Z.json +30 -0
- package/simulation/reports/graph-traversal-2025-11-30T01-06-16-334Z.json +30 -0
- package/simulation/reports/graph-traversal-2025-11-30T01-06-53-312Z.json +30 -0
- package/simulation/reports/graph-traversal-2025-11-30T01-07-51-075Z.json +24 -0
- package/simulation/reports/graph-traversal-2025-11-30T01-08-22-179Z.json +42 -0
- package/simulation/reports/lean-agentic-swarm-2025-11-29T23-37-23-804Z.json +148 -0
- package/simulation/reports/lean-agentic-swarm-2025-11-30T01-31-24-401Z.json +31 -0
- package/simulation/reports/lean-agentic-swarm-2025-11-30T03-38-01-470Z.json +31 -0
- package/simulation/reports/multi-agent-swarm-2025-11-29T23-35-28-093Z.json +78 -0
- package/simulation/reports/multi-agent-swarm-2025-11-30T01-03-54-062Z.json +42 -0
- package/simulation/reports/multi-agent-swarm-2025-11-30T01-05-06-092Z.json +42 -0
- package/simulation/reports/psycho-symbolic-reasoner-2025-11-30T01-36-50-180Z.json +30 -0
- package/simulation/reports/quality-metrics.md +727 -0
- package/simulation/reports/reflexion-learning-2025-11-29T23-35-09-774Z.json +48 -0
- package/simulation/reports/reflexion-learning-2025-11-29T23-37-16-934Z.json +36 -0
- package/simulation/reports/reflexion-learning-2025-11-30T00-07-49-259Z.json +30 -0
- package/simulation/reports/reflexion-learning-2025-11-30T00-09-29-319Z.json +51 -0
- package/simulation/reports/reflexion-learning-2025-11-30T00-28-37-659Z.json +51 -0
- package/simulation/reports/reflexion-learning-2025-11-30T01-31-30-690Z.json +29 -0
- package/simulation/reports/reflexion-learning-2025-11-30T03-38-06-937Z.json +29 -0
- package/simulation/reports/research-foundations.md +2004 -0
- package/simulation/reports/research-swarm-2025-11-30T01-36-54-647Z.json +30 -0
- package/simulation/reports/scalability-deployment.md +2404 -0
- package/simulation/reports/skill-evolution-2025-11-29T23-35-15-945Z.json +36 -0
- package/simulation/reports/skill-evolution-2025-11-30T01-03-17-995Z.json +30 -0
- package/simulation/reports/skill-evolution-2025-11-30T01-03-48-441Z.json +30 -0
- package/simulation/reports/skill-evolution-2025-11-30T01-05-00-554Z.json +30 -0
- package/simulation/reports/skill-evolution-2025-11-30T01-06-11-436Z.json +30 -0
- package/simulation/reports/skill-evolution-2025-11-30T01-06-51-979Z.json +30 -0
- package/simulation/reports/skill-evolution-2025-11-30T01-07-32-695Z.json +40 -0
- package/simulation/reports/stock-market-emergence-2025-11-30T00-11-43-865Z.json +56 -0
- package/simulation/reports/stock-market-emergence-2025-11-30T00-28-57-495Z.json +56 -0
- package/simulation/reports/strange-loops-2025-11-29T23-37-30-621Z.json +78 -0
- package/simulation/reports/strange-loops-2025-11-30T00-07-55-415Z.json +30 -0
- package/simulation/reports/strange-loops-2025-11-30T00-09-35-133Z.json +30 -0
- package/simulation/reports/strange-loops-2025-11-30T00-48-50-744Z.json +24 -0
- package/simulation/reports/strange-loops-2025-11-30T00-54-48-044Z.json +24 -0
- package/simulation/reports/strange-loops-2025-11-30T00-57-27-633Z.json +24 -0
- package/simulation/reports/strange-loops-2025-11-30T00-57-59-135Z.json +42 -0
- package/simulation/reports/sublinear-solver-2025-11-30T01-36-33-134Z.json +30 -0
- package/simulation/reports/temporal-lead-solver-2025-11-30T01-36-38-628Z.json +30 -0
- package/simulation/reports/use-cases-applications.md +2212 -0
- package/simulation/reports/voting-system-consensus-2025-11-30T00-11-37-199Z.json +58 -0
- package/simulation/reports/voting-system-consensus-2025-11-30T00-28-47-735Z.json +58 -0
- package/simulation/runner.ts +300 -0
- package/simulation/scenarios/README-advanced/aidefence-integration.md +63 -0
- package/simulation/scenarios/README-advanced/bmssp-integration.md +58 -0
- package/simulation/scenarios/README-advanced/consciousness-explorer.md +53 -0
- package/simulation/scenarios/README-advanced/goalie-integration.md +61 -0
- package/simulation/scenarios/README-advanced/psycho-symbolic-reasoner.md +55 -0
- package/simulation/scenarios/README-advanced/research-swarm.md +63 -0
- package/simulation/scenarios/README-advanced/sublinear-solver.md +58 -0
- package/simulation/scenarios/README-advanced/temporal-lead-solver.md +55 -0
- package/simulation/scenarios/README-basic/causal-reasoning.md +39 -0
- package/simulation/scenarios/README-basic/graph-traversal.md +41 -0
- package/simulation/scenarios/README-basic/lean-agentic-swarm.md +122 -0
- package/simulation/scenarios/README-basic/multi-agent-swarm.md +34 -0
- package/simulation/scenarios/README-basic/reflexion-learning.md +41 -0
- package/simulation/scenarios/README-basic/skill-evolution.md +38 -0
- package/simulation/scenarios/README-basic/stock-market-emergence.md +28 -0
- package/simulation/scenarios/README-basic/strange-loops.md +36 -0
- package/simulation/scenarios/README-basic/voting-system-consensus.md +28 -0
- package/simulation/scenarios/README.md +438 -0
- package/simulation/scenarios/aidefence-integration.ts +165 -0
- package/simulation/scenarios/bmssp-integration.ts +137 -0
- package/simulation/scenarios/causal-reasoning.ts +143 -0
- package/simulation/scenarios/consciousness-explorer.ts +139 -0
- package/simulation/scenarios/domain-examples/.claude-flow/metrics/agent-metrics.json +1 -0
- package/simulation/scenarios/domain-examples/.claude-flow/metrics/performance.json +87 -0
- package/simulation/scenarios/domain-examples/.claude-flow/metrics/task-metrics.json +10 -0
- package/simulation/scenarios/domain-examples/README.md +525 -0
- package/simulation/scenarios/domain-examples/e-commerce-recommendations.ts +220 -0
- package/simulation/scenarios/domain-examples/index.ts +81 -0
- package/simulation/scenarios/domain-examples/iot-sensor-networks.ts +290 -0
- package/simulation/scenarios/domain-examples/medical-imaging.ts +181 -0
- package/simulation/scenarios/domain-examples/robotics-navigation.ts +214 -0
- package/simulation/scenarios/domain-examples/scientific-research.ts +250 -0
- package/simulation/scenarios/domain-examples/trading-systems.ts +138 -0
- package/simulation/scenarios/goalie-integration.ts +161 -0
- package/simulation/scenarios/graph-traversal.ts +129 -0
- package/simulation/scenarios/latent-space/OPTIMIZATION-COMPLETE.md +287 -0
- package/simulation/scenarios/latent-space/README-attention-analysis.md +170 -0
- package/simulation/scenarios/latent-space/README-clustering-analysis.md +239 -0
- package/simulation/scenarios/latent-space/README-hnsw-exploration.md +199 -0
- package/simulation/scenarios/latent-space/README-hypergraph-exploration.md +279 -0
- package/simulation/scenarios/latent-space/README-neural-augmentation.md +267 -0
- package/simulation/scenarios/latent-space/README-quantum-hybrid.md +276 -0
- package/simulation/scenarios/latent-space/README-self-organizing-hnsw.md +244 -0
- package/simulation/scenarios/latent-space/README-traversal-optimization.md +212 -0
- package/simulation/scenarios/latent-space/attention-analysis.ts +598 -0
- package/simulation/scenarios/latent-space/clustering-analysis.ts +796 -0
- package/simulation/scenarios/latent-space/hnsw-exploration.ts +526 -0
- package/simulation/scenarios/latent-space/hypergraph-exploration.ts +706 -0
- package/simulation/scenarios/latent-space/index.ts +47 -0
- package/simulation/scenarios/latent-space/neural-augmentation.ts +604 -0
- package/simulation/scenarios/latent-space/quantum-hybrid.ts +508 -0
- package/simulation/scenarios/latent-space/self-organizing-hnsw.ts +680 -0
- package/simulation/scenarios/latent-space/traversal-optimization.ts +782 -0
- package/simulation/scenarios/lean-agentic-swarm.ts +182 -0
- package/simulation/scenarios/multi-agent-swarm.ts +146 -0
- package/simulation/scenarios/psycho-symbolic-reasoner.ts +136 -0
- package/simulation/scenarios/reflexion-learning.ts +132 -0
- package/simulation/scenarios/research-swarm.ts +187 -0
- package/simulation/scenarios/skill-evolution.ts +135 -0
- package/simulation/scenarios/stock-market-emergence.ts +323 -0
- package/simulation/scenarios/strange-loops.ts +175 -0
- package/simulation/scenarios/sublinear-solver.ts +108 -0
- package/simulation/scenarios/temporal-lead-solver.ts +121 -0
- package/simulation/scenarios/voting-system-consensus.ts +251 -0
- package/simulation/tests/latent-space/attention-analysis.test.ts +204 -0
- package/simulation/tests/latent-space/clustering-analysis.test.ts +281 -0
- package/simulation/tests/latent-space/hnsw-exploration.test.ts +253 -0
- package/simulation/tests/latent-space/hypergraph-exploration.test.ts +295 -0
- package/simulation/tests/latent-space/neural-augmentation.test.ts +326 -0
- package/simulation/tests/latent-space/quantum-hybrid.test.ts +307 -0
- package/simulation/tests/latent-space/self-organizing-hnsw.test.ts +291 -0
- package/simulation/tests/latent-space/traversal-optimization.test.ts +261 -0
- package/simulation/types.ts +177 -0
- package/simulation/utils/PerformanceOptimizer.ts +269 -0
- package/src/backends/GraphBackend.ts +290 -0
- package/src/backends/LearningBackend.ts +210 -0
- package/src/backends/README.md +389 -0
- package/src/backends/VectorBackend.ts +147 -0
- package/src/backends/detector.ts +283 -0
- package/src/backends/factory.ts +279 -0
- package/src/backends/graph/GraphDatabaseAdapter.ts +334 -0
- package/src/backends/hnswlib/HNSWLibBackend.ts +419 -0
- package/src/backends/hnswlib/index.ts +7 -0
- package/src/backends/index.ts +32 -0
- package/src/backends/ruvector/GuardedVectorBackend.ts +219 -0
- package/src/backends/ruvector/RuVectorBackend.ts +343 -0
- package/src/backends/ruvector/RuVectorLearning.ts +254 -0
- package/src/backends/ruvector/index.ts +9 -0
- package/src/benchmarks/wasm-vector-benchmark.ts +250 -0
- package/src/browser/AdvancedFeatures.ts +565 -0
- package/src/browser/AttentionBrowser.ts +387 -0
- package/src/browser/HNSWIndex.ts +494 -0
- package/src/browser/ProductQuantization.ts +419 -0
- package/src/browser/index.ts +317 -0
- package/src/cli/agentdb-cli.ts +2712 -0
- package/src/cli/attention-cli-integration.ts +91 -0
- package/src/cli/commands/attention.ts +656 -0
- package/src/cli/commands/doctor.ts +322 -0
- package/src/cli/commands/init.ts +176 -0
- package/src/cli/commands/install-embeddings.ts +81 -0
- package/src/cli/commands/migrate.ts +545 -0
- package/src/cli/commands/simulate-custom.ts +232 -0
- package/src/cli/commands/simulate-report.ts +171 -0
- package/src/cli/commands/simulate-wizard.ts +379 -0
- package/src/cli/commands/simulate.ts +115 -0
- package/src/cli/commands/status.ts +156 -0
- package/src/cli/examples.sh +83 -0
- package/src/cli/lib/attention-config.ts +326 -0
- package/src/cli/lib/config-manager.ts +627 -0
- package/src/cli/lib/config-validator.ts +261 -0
- package/src/cli/lib/health-monitor.ts +513 -0
- package/src/cli/lib/help-formatter.ts +406 -0
- package/src/cli/lib/history-tracker.ts +503 -0
- package/src/cli/lib/report-generator.ts +455 -0
- package/src/cli/lib/report-store.ts +582 -0
- package/src/cli/lib/simulation-registry.ts +503 -0
- package/src/cli/lib/simulation-runner.ts +291 -0
- package/src/cli/tests/agentdb-cli.test.ts +58 -0
- package/src/cli/tests/attention-cli.test.ts +335 -0
- package/src/controllers/AttentionService.ts +770 -0
- package/src/controllers/CausalMemoryGraph.ts +773 -0
- package/src/controllers/CausalRecall.ts +484 -0
- package/src/controllers/ContextSynthesizer.ts +285 -0
- package/src/controllers/EmbeddingService.ts +161 -0
- package/src/controllers/EnhancedEmbeddingService.ts +143 -0
- package/src/controllers/ExplainableRecall.ts +746 -0
- package/src/controllers/HNSWIndex.ts +495 -0
- package/src/controllers/LearningSystem.ts +1270 -0
- package/src/controllers/MMRDiversityRanker.ts +187 -0
- package/src/controllers/MetadataFilter.ts +280 -0
- package/src/controllers/NightlyLearner.ts +647 -0
- package/src/controllers/QUICClient.ts +413 -0
- package/src/controllers/QUICServer.ts +498 -0
- package/src/controllers/ReasoningBank.ts +665 -0
- package/src/controllers/ReflexionMemory.ts +872 -0
- package/src/controllers/SkillLibrary.ts +795 -0
- package/src/controllers/SyncCoordinator.ts +597 -0
- package/src/controllers/WASMVectorSearch.ts +292 -0
- package/src/controllers/frontier-index.ts +35 -0
- package/src/controllers/index.ts +57 -0
- package/src/coordination/MultiDatabaseCoordinator.ts +1107 -0
- package/src/coordination/index.ts +24 -0
- package/src/core/AgentDB.ts +211 -0
- package/src/db-fallback.ts +296 -0
- package/src/db-test.ts +59 -0
- package/src/db-unified.ts +327 -0
- package/src/examples/quic-sync-example.ts +198 -0
- package/src/examples/wasm-vector-usage.ts +245 -0
- package/src/index.ts +69 -0
- package/src/mcp/agentdb-mcp-server.ts +2318 -0
- package/src/mcp/attention-mcp-integration.ts +145 -0
- package/src/mcp/attention-tools-handlers.ts +586 -0
- package/src/mcp/learning-tools-handlers.ts +106 -0
- package/src/optimizations/BatchOperations.ts +594 -0
- package/src/optimizations/QueryOptimizer.ts +297 -0
- package/src/optimizations/ToolCache.ts +355 -0
- package/src/optimizations/index.ts +11 -0
- package/src/schemas/frontier-schema.sql +378 -0
- package/src/schemas/schema.sql +382 -0
- package/src/security/AttestationLog.ts +252 -0
- package/src/security/MutationGuard.ts +420 -0
- package/src/security/index.ts +52 -0
- package/src/security/input-validation.ts +543 -0
- package/src/security/limits.ts +375 -0
- package/src/security/path-security.ts +436 -0
- package/src/security/validation.ts +556 -0
- package/src/services/GraphTransformerService.ts +389 -0
- package/src/services/LLMRouter.ts +380 -0
- package/src/services/SemanticRouter.ts +169 -0
- package/src/services/SonaTrajectoryService.ts +264 -0
- package/src/tests/attention-service.test.ts +492 -0
- package/src/tests/wasm-vector-search.test.ts +240 -0
- package/src/types/attention.ts +392 -0
- package/src/types/quic.ts +772 -0
- package/src/utils/LegacyAttentionAdapter.ts +393 -0
- package/src/utils/NodeIdMapper.ts +64 -0
- package/src/utils/attention-metrics.ts +253 -0
- package/src/utils/vector-math.ts +71 -0
- package/LICENSE +0 -21
- package/dist/src/backends/rvf/AdaptiveIndexTuner.d.ts +0 -175
- package/dist/src/backends/rvf/AdaptiveIndexTuner.d.ts.map +0 -1
- package/dist/src/backends/rvf/AdaptiveIndexTuner.js +0 -559
- package/dist/src/backends/rvf/AdaptiveIndexTuner.js.map +0 -1
- package/dist/src/backends/rvf/ContrastiveTrainer.d.ts +0 -148
- package/dist/src/backends/rvf/ContrastiveTrainer.d.ts.map +0 -1
- package/dist/src/backends/rvf/ContrastiveTrainer.js +0 -438
- package/dist/src/backends/rvf/ContrastiveTrainer.js.map +0 -1
- package/dist/src/backends/rvf/FederatedSessionManager.d.ts +0 -211
- package/dist/src/backends/rvf/FederatedSessionManager.d.ts.map +0 -1
- package/dist/src/backends/rvf/FederatedSessionManager.js +0 -389
- package/dist/src/backends/rvf/FederatedSessionManager.js.map +0 -1
- package/dist/src/backends/rvf/FilterBuilder.d.ts +0 -136
- package/dist/src/backends/rvf/FilterBuilder.d.ts.map +0 -1
- package/dist/src/backends/rvf/FilterBuilder.js +0 -157
- package/dist/src/backends/rvf/FilterBuilder.js.map +0 -1
- package/dist/src/backends/rvf/NativeAccelerator.d.ts +0 -140
- package/dist/src/backends/rvf/NativeAccelerator.d.ts.map +0 -1
- package/dist/src/backends/rvf/NativeAccelerator.js +0 -630
- package/dist/src/backends/rvf/NativeAccelerator.js.map +0 -1
- package/dist/src/backends/rvf/RvfBackend.d.ts +0 -194
- package/dist/src/backends/rvf/RvfBackend.d.ts.map +0 -1
- package/dist/src/backends/rvf/RvfBackend.js +0 -607
- package/dist/src/backends/rvf/RvfBackend.js.map +0 -1
- package/dist/src/backends/rvf/RvfSolver.d.ts +0 -175
- package/dist/src/backends/rvf/RvfSolver.d.ts.map +0 -1
- package/dist/src/backends/rvf/RvfSolver.js +0 -176
- package/dist/src/backends/rvf/RvfSolver.js.map +0 -1
- package/dist/src/backends/rvf/SelfLearningRvfBackend.d.ts +0 -143
- package/dist/src/backends/rvf/SelfLearningRvfBackend.d.ts.map +0 -1
- package/dist/src/backends/rvf/SelfLearningRvfBackend.js +0 -569
- package/dist/src/backends/rvf/SelfLearningRvfBackend.js.map +0 -1
- package/dist/src/backends/rvf/SemanticQueryRouter.d.ts +0 -128
- package/dist/src/backends/rvf/SemanticQueryRouter.d.ts.map +0 -1
- package/dist/src/backends/rvf/SemanticQueryRouter.js +0 -415
- package/dist/src/backends/rvf/SemanticQueryRouter.js.map +0 -1
- package/dist/src/backends/rvf/SimdFallbacks.d.ts +0 -25
- package/dist/src/backends/rvf/SimdFallbacks.d.ts.map +0 -1
- package/dist/src/backends/rvf/SimdFallbacks.js +0 -287
- package/dist/src/backends/rvf/SimdFallbacks.js.map +0 -1
- package/dist/src/backends/rvf/SolverBandit.d.ts +0 -100
- package/dist/src/backends/rvf/SolverBandit.d.ts.map +0 -1
- package/dist/src/backends/rvf/SolverBandit.js +0 -216
- package/dist/src/backends/rvf/SolverBandit.js.map +0 -1
- package/dist/src/backends/rvf/SonaLearningBackend.d.ts +0 -157
- package/dist/src/backends/rvf/SonaLearningBackend.d.ts.map +0 -1
- package/dist/src/backends/rvf/SonaLearningBackend.js +0 -283
- package/dist/src/backends/rvf/SonaLearningBackend.js.map +0 -1
- package/dist/src/backends/rvf/SqlJsRvfBackend.d.ts +0 -77
- package/dist/src/backends/rvf/SqlJsRvfBackend.d.ts.map +0 -1
- package/dist/src/backends/rvf/SqlJsRvfBackend.js +0 -382
- package/dist/src/backends/rvf/SqlJsRvfBackend.js.map +0 -1
- package/dist/src/backends/rvf/WasmStoreBridge.d.ts +0 -27
- package/dist/src/backends/rvf/WasmStoreBridge.d.ts.map +0 -1
- package/dist/src/backends/rvf/WasmStoreBridge.js +0 -87
- package/dist/src/backends/rvf/WasmStoreBridge.js.map +0 -1
- package/dist/src/backends/rvf/validation.d.ts +0 -20
- package/dist/src/backends/rvf/validation.d.ts.map +0 -1
- package/dist/src/backends/rvf/validation.js +0 -78
- package/dist/src/backends/rvf/validation.js.map +0 -1
- package/dist/src/benchmark/BenchmarkSuite.d.ts +0 -318
- package/dist/src/benchmark/BenchmarkSuite.d.ts.map +0 -1
- package/dist/src/benchmark/BenchmarkSuite.js +0 -986
- package/dist/src/benchmark/BenchmarkSuite.js.map +0 -1
- package/dist/src/benchmark/index.d.ts +0 -29
- package/dist/src/benchmark/index.d.ts.map +0 -1
- package/dist/src/benchmark/index.js +0 -39
- package/dist/src/benchmark/index.js.map +0 -1
- package/dist/src/cli/commands/hyperbolic.d.ts +0 -11
- package/dist/src/cli/commands/hyperbolic.d.ts.map +0 -1
- package/dist/src/cli/commands/hyperbolic.js +0 -428
- package/dist/src/cli/commands/hyperbolic.js.map +0 -1
- package/dist/src/cli/commands/learn.d.ts +0 -11
- package/dist/src/cli/commands/learn.d.ts.map +0 -1
- package/dist/src/cli/commands/learn.js +0 -404
- package/dist/src/cli/commands/learn.js.map +0 -1
- package/dist/src/cli/commands/route.d.ts +0 -11
- package/dist/src/cli/commands/route.d.ts.map +0 -1
- package/dist/src/cli/commands/route.js +0 -414
- package/dist/src/cli/commands/route.js.map +0 -1
- package/dist/src/cli/commands/rvf.d.ts +0 -21
- package/dist/src/cli/commands/rvf.d.ts.map +0 -1
- package/dist/src/cli/commands/rvf.js +0 -448
- package/dist/src/cli/commands/rvf.js.map +0 -1
- package/dist/src/cli/tests/agentdb-cli.test.d.ts +0 -8
- package/dist/src/cli/tests/agentdb-cli.test.d.ts.map +0 -1
- package/dist/src/cli/tests/agentdb-cli.test.js +0 -50
- package/dist/src/cli/tests/agentdb-cli.test.js.map +0 -1
- package/dist/src/cli/tests/attention-cli.test.d.ts +0 -5
- package/dist/src/cli/tests/attention-cli.test.d.ts.map +0 -1
- package/dist/src/cli/tests/attention-cli.test.js +0 -257
- package/dist/src/cli/tests/attention-cli.test.js.map +0 -1
- package/dist/src/compatibility/DeprecationWarnings.d.ts +0 -54
- package/dist/src/compatibility/DeprecationWarnings.d.ts.map +0 -1
- package/dist/src/compatibility/DeprecationWarnings.js +0 -131
- package/dist/src/compatibility/DeprecationWarnings.js.map +0 -1
- package/dist/src/compatibility/MigrationUtilities.d.ts +0 -30
- package/dist/src/compatibility/MigrationUtilities.d.ts.map +0 -1
- package/dist/src/compatibility/MigrationUtilities.js +0 -184
- package/dist/src/compatibility/MigrationUtilities.js.map +0 -1
- package/dist/src/compatibility/V1toV2Adapter.d.ts +0 -76
- package/dist/src/compatibility/V1toV2Adapter.d.ts.map +0 -1
- package/dist/src/compatibility/V1toV2Adapter.js +0 -198
- package/dist/src/compatibility/V1toV2Adapter.js.map +0 -1
- package/dist/src/compatibility/VersionDetector.d.ts +0 -32
- package/dist/src/compatibility/VersionDetector.d.ts.map +0 -1
- package/dist/src/compatibility/VersionDetector.js +0 -144
- package/dist/src/compatibility/VersionDetector.js.map +0 -1
- package/dist/src/compatibility/index.d.ts +0 -11
- package/dist/src/compatibility/index.d.ts.map +0 -1
- package/dist/src/compatibility/index.js +0 -10
- package/dist/src/compatibility/index.js.map +0 -1
- package/dist/src/compatibility/types.d.ts +0 -103
- package/dist/src/compatibility/types.d.ts.map +0 -1
- package/dist/src/compatibility/types.js +0 -5
- package/dist/src/compatibility/types.js.map +0 -1
- package/dist/src/controllers/MemoryController.d.ts +0 -161
- package/dist/src/controllers/MemoryController.d.ts.map +0 -1
- package/dist/src/controllers/MemoryController.js +0 -290
- package/dist/src/controllers/MemoryController.js.map +0 -1
- package/dist/src/controllers/attention/CrossAttentionController.d.ts +0 -141
- package/dist/src/controllers/attention/CrossAttentionController.d.ts.map +0 -1
- package/dist/src/controllers/attention/CrossAttentionController.js +0 -325
- package/dist/src/controllers/attention/CrossAttentionController.js.map +0 -1
- package/dist/src/controllers/attention/MultiHeadAttentionController.d.ts +0 -137
- package/dist/src/controllers/attention/MultiHeadAttentionController.d.ts.map +0 -1
- package/dist/src/controllers/attention/MultiHeadAttentionController.js +0 -339
- package/dist/src/controllers/attention/MultiHeadAttentionController.js.map +0 -1
- package/dist/src/controllers/attention/SelfAttentionController.d.ts +0 -117
- package/dist/src/controllers/attention/SelfAttentionController.d.ts.map +0 -1
- package/dist/src/controllers/attention/SelfAttentionController.js +0 -205
- package/dist/src/controllers/attention/SelfAttentionController.js.map +0 -1
- package/dist/src/controllers/attention/index.d.ts +0 -15
- package/dist/src/controllers/attention/index.d.ts.map +0 -1
- package/dist/src/controllers/attention/index.js +0 -12
- package/dist/src/controllers/attention/index.js.map +0 -1
- package/dist/src/core/QueryCache.d.ts +0 -138
- package/dist/src/core/QueryCache.d.ts.map +0 -1
- package/dist/src/core/QueryCache.js +0 -313
- package/dist/src/core/QueryCache.js.map +0 -1
- package/dist/src/observability/index.d.ts +0 -8
- package/dist/src/observability/index.d.ts.map +0 -1
- package/dist/src/observability/index.js +0 -8
- package/dist/src/observability/index.js.map +0 -1
- package/dist/src/observability/integration.d.ts +0 -32
- package/dist/src/observability/integration.d.ts.map +0 -1
- package/dist/src/observability/integration.js +0 -157
- package/dist/src/observability/integration.js.map +0 -1
- package/dist/src/observability/telemetry.d.ts +0 -137
- package/dist/src/observability/telemetry.d.ts.map +0 -1
- package/dist/src/observability/telemetry.js +0 -420
- package/dist/src/observability/telemetry.js.map +0 -1
- package/dist/src/quantization/index.d.ts +0 -7
- package/dist/src/quantization/index.d.ts.map +0 -1
- package/dist/src/quantization/index.js +0 -15
- package/dist/src/quantization/index.js.map +0 -1
- package/dist/src/quantization/vector-quantization.d.ts +0 -388
- package/dist/src/quantization/vector-quantization.d.ts.map +0 -1
- package/dist/src/quantization/vector-quantization.js +0 -1136
- package/dist/src/quantization/vector-quantization.js.map +0 -1
- package/dist/src/search/HybridSearch.d.ts +0 -311
- package/dist/src/search/HybridSearch.d.ts.map +0 -1
- package/dist/src/search/HybridSearch.js +0 -712
- package/dist/src/search/HybridSearch.js.map +0 -1
- package/dist/src/search/index.d.ts +0 -12
- package/dist/src/search/index.d.ts.map +0 -1
- package/dist/src/search/index.js +0 -16
- package/dist/src/search/index.js.map +0 -1
- package/dist/src/services/AttentionService.d.ts +0 -303
- package/dist/src/services/AttentionService.d.ts.map +0 -1
- package/dist/src/services/AttentionService.js +0 -1167
- package/dist/src/services/AttentionService.js.map +0 -1
- package/dist/src/simd/index.d.ts +0 -9
- package/dist/src/simd/index.d.ts.map +0 -1
- package/dist/src/simd/index.js +0 -27
- package/dist/src/simd/index.js.map +0 -1
- package/dist/src/simd/simd-vector-ops.d.ts +0 -332
- package/dist/src/simd/simd-vector-ops.d.ts.map +0 -1
- package/dist/src/simd/simd-vector-ops.js +0 -947
- package/dist/src/simd/simd-vector-ops.js.map +0 -1
- package/dist/src/tests/attention-service.test.d.ts +0 -7
- package/dist/src/tests/attention-service.test.d.ts.map +0 -1
- package/dist/src/tests/attention-service.test.js +0 -401
- package/dist/src/tests/attention-service.test.js.map +0 -1
- package/dist/src/tests/integration/compatibility/backwards-compat.integration.test.d.ts +0 -7
- package/dist/src/tests/integration/compatibility/backwards-compat.integration.test.d.ts.map +0 -1
- package/dist/src/tests/integration/compatibility/backwards-compat.integration.test.js +0 -283
- package/dist/src/tests/integration/compatibility/backwards-compat.integration.test.js.map +0 -1
- package/dist/src/tests/query-cache.test.d.ts +0 -7
- package/dist/src/tests/query-cache.test.d.ts.map +0 -1
- package/dist/src/tests/query-cache.test.js +0 -343
- package/dist/src/tests/query-cache.test.js.map +0 -1
- package/dist/src/tests/ruvector-integration.test.d.ts +0 -14
- package/dist/src/tests/ruvector-integration.test.d.ts.map +0 -1
- package/dist/src/tests/ruvector-integration.test.js +0 -1156
- package/dist/src/tests/ruvector-integration.test.js.map +0 -1
- package/dist/src/tests/unit/auth/crypto.utils.test.d.ts +0 -6
- package/dist/src/tests/unit/auth/crypto.utils.test.d.ts.map +0 -1
- package/dist/src/tests/unit/auth/crypto.utils.test.js +0 -310
- package/dist/src/tests/unit/auth/crypto.utils.test.js.map +0 -1
- package/dist/src/tests/unit/compatibility/deprecation-warnings.test.d.ts +0 -5
- package/dist/src/tests/unit/compatibility/deprecation-warnings.test.d.ts.map +0 -1
- package/dist/src/tests/unit/compatibility/deprecation-warnings.test.js +0 -207
- package/dist/src/tests/unit/compatibility/deprecation-warnings.test.js.map +0 -1
- package/dist/src/tests/unit/compatibility/migration-utils.test.d.ts +0 -5
- package/dist/src/tests/unit/compatibility/migration-utils.test.d.ts.map +0 -1
- package/dist/src/tests/unit/compatibility/migration-utils.test.js +0 -264
- package/dist/src/tests/unit/compatibility/migration-utils.test.js.map +0 -1
- package/dist/src/tests/unit/compatibility/v1-adapter.test.d.ts +0 -7
- package/dist/src/tests/unit/compatibility/v1-adapter.test.d.ts.map +0 -1
- package/dist/src/tests/unit/compatibility/v1-adapter.test.js +0 -228
- package/dist/src/tests/unit/compatibility/v1-adapter.test.js.map +0 -1
- package/dist/src/tests/unit/compatibility/version-detector.test.d.ts +0 -10
- package/dist/src/tests/unit/compatibility/version-detector.test.d.ts.map +0 -1
- package/dist/src/tests/unit/compatibility/version-detector.test.js +0 -162
- package/dist/src/tests/unit/compatibility/version-detector.test.js.map +0 -1
- package/dist/src/tests/vector-quantization.test.d.ts +0 -5
- package/dist/src/tests/vector-quantization.test.d.ts.map +0 -1
- package/dist/src/tests/vector-quantization.test.js +0 -338
- package/dist/src/tests/vector-quantization.test.js.map +0 -1
- package/dist/src/tests/wasm-vector-search.test.d.ts +0 -7
- package/dist/src/tests/wasm-vector-search.test.d.ts.map +0 -1
- package/dist/src/tests/wasm-vector-search.test.js +0 -193
- package/dist/src/tests/wasm-vector-search.test.js.map +0 -1
- package/dist/src/types/database.types.d.ts +0 -275
- package/dist/src/types/database.types.d.ts.map +0 -1
- package/dist/src/types/database.types.js +0 -57
- package/dist/src/types/database.types.js.map +0 -1
- package/dist/src/utils/chalk-fallback.d.ts +0 -3
- package/dist/src/utils/chalk-fallback.d.ts.map +0 -1
- package/dist/src/utils/chalk-fallback.js +0 -20
- package/dist/src/utils/chalk-fallback.js.map +0 -1
- package/dist/src/utils/crypto.utils.d.ts +0 -122
- package/dist/src/utils/crypto.utils.d.ts.map +0 -1
- package/dist/src/utils/crypto.utils.js +0 -296
- package/dist/src/utils/crypto.utils.js.map +0 -1
- package/dist/src/utils/similarity.d.ts +0 -11
- package/dist/src/utils/similarity.d.ts.map +0 -1
- package/dist/src/utils/similarity.js +0 -25
- package/dist/src/utils/similarity.js.map +0 -1
- package/dist/src/wasm-loader.d.ts +0 -67
- package/dist/src/wasm-loader.d.ts.map +0 -1
- package/dist/src/wasm-loader.js +0 -78
- package/dist/src/wasm-loader.js.map +0 -1
- package/dist/src/wrappers/agentdb-fast.d.ts +0 -139
- package/dist/src/wrappers/agentdb-fast.d.ts.map +0 -1
- package/dist/src/wrappers/agentdb-fast.js +0 -316
- package/dist/src/wrappers/agentdb-fast.js.map +0 -1
- package/dist/src/wrappers/attention-fallbacks.d.ts +0 -351
- package/dist/src/wrappers/attention-fallbacks.d.ts.map +0 -1
- package/dist/src/wrappers/attention-fallbacks.js +0 -1487
- package/dist/src/wrappers/attention-fallbacks.js.map +0 -1
- package/dist/src/wrappers/embedding-service.d.ts +0 -117
- package/dist/src/wrappers/embedding-service.d.ts.map +0 -1
- package/dist/src/wrappers/embedding-service.js +0 -376
- package/dist/src/wrappers/embedding-service.js.map +0 -1
- package/dist/src/wrappers/gnn-wrapper.d.ts +0 -71
- package/dist/src/wrappers/gnn-wrapper.d.ts.map +0 -1
- package/dist/src/wrappers/gnn-wrapper.js +0 -240
- package/dist/src/wrappers/gnn-wrapper.js.map +0 -1
- package/dist/src/wrappers/index.d.ts +0 -48
- package/dist/src/wrappers/index.d.ts.map +0 -1
- package/dist/src/wrappers/index.js +0 -83
- package/dist/src/wrappers/index.js.map +0 -1
|
@@ -1,1487 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Attention Module Fallbacks
|
|
3
|
-
*
|
|
4
|
-
* Since @ruvector/attention is completely broken, provide JavaScript fallbacks
|
|
5
|
-
* Performance will be slower but functionality will work
|
|
6
|
-
*
|
|
7
|
-
* Optimized version includes:
|
|
8
|
-
* - SIMD-style loop unrolling (8x with separate accumulators)
|
|
9
|
-
* - Pre-allocated buffer pools for intermediate results
|
|
10
|
-
* - Numerically stable fused softmax operations
|
|
11
|
-
* - TypedArray optimizations (Float32Array)
|
|
12
|
-
* - Batch processing capabilities
|
|
13
|
-
* - Flash attention with improved tiling strategy
|
|
14
|
-
*/
|
|
15
|
-
// ============================================================================
|
|
16
|
-
// Security Constants
|
|
17
|
-
// ============================================================================
|
|
18
|
-
/** Maximum hidden dimension to prevent memory exhaustion */
|
|
19
|
-
const MAX_HIDDEN_DIM = 16384;
|
|
20
|
-
/** Maximum sequence length for attention */
|
|
21
|
-
const MAX_SEQ_LENGTH = 32768;
|
|
22
|
-
/** Maximum buffer pool size per dimension */
|
|
23
|
-
const MAX_BUFFER_POOL_SIZE = 64;
|
|
24
|
-
/** Maximum total memory for buffer pools (64MB) */
|
|
25
|
-
const MAX_BUFFER_POOL_MEMORY = 64 * 1024 * 1024;
|
|
26
|
-
/** Small epsilon for numerical stability */
|
|
27
|
-
const EPSILON = 1e-8;
|
|
28
|
-
// ============================================================================
|
|
29
|
-
// Validation Helpers
|
|
30
|
-
// ============================================================================
|
|
31
|
-
/**
|
|
32
|
-
* Validate dimension is within safe limits
|
|
33
|
-
*/
|
|
34
|
-
function validateDimension(dim, name) {
|
|
35
|
-
if (!Number.isFinite(dim) || dim < 1 || dim > MAX_HIDDEN_DIM) {
|
|
36
|
-
throw new Error(`${name} must be between 1 and ${MAX_HIDDEN_DIM}`);
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
/**
|
|
40
|
-
* Validate sequence length is within safe limits
|
|
41
|
-
*/
|
|
42
|
-
function validateSeqLength(len, name) {
|
|
43
|
-
if (!Number.isFinite(len) || len < 1 || len > MAX_SEQ_LENGTH) {
|
|
44
|
-
throw new Error(`${name} must be between 1 and ${MAX_SEQ_LENGTH}`);
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
/**
|
|
48
|
-
* Validate Float32Array input
|
|
49
|
-
*/
|
|
50
|
-
function validateFloat32Array(arr, name) {
|
|
51
|
-
if (!(arr instanceof Float32Array)) {
|
|
52
|
-
throw new Error(`${name} must be a Float32Array`);
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
// ============================================================================
|
|
56
|
-
// Buffer Pool Management - Pre-allocated buffers for hot paths
|
|
57
|
-
// ============================================================================
|
|
58
|
-
/**
|
|
59
|
-
* Buffer pool for reusing Float32Arrays to avoid GC pressure
|
|
60
|
-
*/
|
|
61
|
-
class BufferPool {
|
|
62
|
-
pools = new Map();
|
|
63
|
-
maxPoolSize = MAX_BUFFER_POOL_SIZE;
|
|
64
|
-
totalMemory = 0;
|
|
65
|
-
acquire(size) {
|
|
66
|
-
// Validate size to prevent DoS
|
|
67
|
-
if (!Number.isFinite(size) || size < 0 || size > MAX_HIDDEN_DIM * MAX_SEQ_LENGTH) {
|
|
68
|
-
throw new Error(`Invalid buffer size: ${size}`);
|
|
69
|
-
}
|
|
70
|
-
const pool = this.pools.get(size);
|
|
71
|
-
if (pool && pool.length > 0) {
|
|
72
|
-
return pool.pop();
|
|
73
|
-
}
|
|
74
|
-
return new Float32Array(size);
|
|
75
|
-
}
|
|
76
|
-
release(buffer) {
|
|
77
|
-
const size = buffer.length;
|
|
78
|
-
const bufferBytes = size * 4; // Float32 = 4 bytes
|
|
79
|
-
// Check total memory limit before adding to pool
|
|
80
|
-
if (this.totalMemory + bufferBytes > MAX_BUFFER_POOL_MEMORY) {
|
|
81
|
-
return; // Don't pool, let GC handle it
|
|
82
|
-
}
|
|
83
|
-
let pool = this.pools.get(size);
|
|
84
|
-
if (!pool) {
|
|
85
|
-
pool = [];
|
|
86
|
-
this.pools.set(size, pool);
|
|
87
|
-
}
|
|
88
|
-
if (pool.length < this.maxPoolSize) {
|
|
89
|
-
buffer.fill(0); // Clear for reuse
|
|
90
|
-
pool.push(buffer);
|
|
91
|
-
this.totalMemory += bufferBytes;
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
clear() {
|
|
95
|
-
this.pools.clear();
|
|
96
|
-
this.totalMemory = 0;
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
// Global buffer pool instance
|
|
100
|
-
const globalBufferPool = new BufferPool();
|
|
101
|
-
// ============================================================================
|
|
102
|
-
// SIMD-Style Optimized Operations
|
|
103
|
-
// ============================================================================
|
|
104
|
-
/**
|
|
105
|
-
* 8x unrolled dot product with separate accumulators
|
|
106
|
-
* Mimics SIMD behavior for better CPU pipelining
|
|
107
|
-
*/
|
|
108
|
-
function dotProduct8x(a, b, length) {
|
|
109
|
-
let sum0 = 0, sum1 = 0, sum2 = 0, sum3 = 0;
|
|
110
|
-
let sum4 = 0, sum5 = 0, sum6 = 0, sum7 = 0;
|
|
111
|
-
const unrolledLen = length - (length % 8);
|
|
112
|
-
// Main 8x unrolled loop
|
|
113
|
-
for (let i = 0; i < unrolledLen; i += 8) {
|
|
114
|
-
sum0 += a[i] * b[i];
|
|
115
|
-
sum1 += a[i + 1] * b[i + 1];
|
|
116
|
-
sum2 += a[i + 2] * b[i + 2];
|
|
117
|
-
sum3 += a[i + 3] * b[i + 3];
|
|
118
|
-
sum4 += a[i + 4] * b[i + 4];
|
|
119
|
-
sum5 += a[i + 5] * b[i + 5];
|
|
120
|
-
sum6 += a[i + 6] * b[i + 6];
|
|
121
|
-
sum7 += a[i + 7] * b[i + 7];
|
|
122
|
-
}
|
|
123
|
-
// Handle remainder
|
|
124
|
-
for (let i = unrolledLen; i < length; i++) {
|
|
125
|
-
sum0 += a[i] * b[i];
|
|
126
|
-
}
|
|
127
|
-
// Combine accumulators (in pairs to maintain precision)
|
|
128
|
-
return (sum0 + sum1) + (sum2 + sum3) + (sum4 + sum5) + (sum6 + sum7);
|
|
129
|
-
}
|
|
130
|
-
/**
|
|
131
|
-
* 8x unrolled matrix-vector multiplication
|
|
132
|
-
* output[i] = sum_j(matrix[i][j] * vector[j])
|
|
133
|
-
*/
|
|
134
|
-
function matVecMul8x(matrix, vector, output, rows, cols) {
|
|
135
|
-
const unrolledCols = cols - (cols % 8);
|
|
136
|
-
for (let i = 0; i < rows; i++) {
|
|
137
|
-
let sum0 = 0, sum1 = 0, sum2 = 0, sum3 = 0;
|
|
138
|
-
let sum4 = 0, sum5 = 0, sum6 = 0, sum7 = 0;
|
|
139
|
-
const rowOffset = i * cols;
|
|
140
|
-
// 8x unrolled inner loop
|
|
141
|
-
for (let j = 0; j < unrolledCols; j += 8) {
|
|
142
|
-
const idx = rowOffset + j;
|
|
143
|
-
sum0 += matrix[idx] * vector[j];
|
|
144
|
-
sum1 += matrix[idx + 1] * vector[j + 1];
|
|
145
|
-
sum2 += matrix[idx + 2] * vector[j + 2];
|
|
146
|
-
sum3 += matrix[idx + 3] * vector[j + 3];
|
|
147
|
-
sum4 += matrix[idx + 4] * vector[j + 4];
|
|
148
|
-
sum5 += matrix[idx + 5] * vector[j + 5];
|
|
149
|
-
sum6 += matrix[idx + 6] * vector[j + 6];
|
|
150
|
-
sum7 += matrix[idx + 7] * vector[j + 7];
|
|
151
|
-
}
|
|
152
|
-
// Handle remainder
|
|
153
|
-
for (let j = unrolledCols; j < cols; j++) {
|
|
154
|
-
sum0 += matrix[rowOffset + j] * vector[j];
|
|
155
|
-
}
|
|
156
|
-
output[i] = (sum0 + sum1) + (sum2 + sum3) + (sum4 + sum5) + (sum6 + sum7);
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
/**
|
|
160
|
-
* 8x unrolled scaled add: output[i] = a[i] + scale * b[i]
|
|
161
|
-
*/
|
|
162
|
-
// exported for use in attention kernel pipeline
|
|
163
|
-
export function scaledAdd8x(output, a, b, scale, length) {
|
|
164
|
-
const unrolledLen = length - (length % 8);
|
|
165
|
-
for (let i = 0; i < unrolledLen; i += 8) {
|
|
166
|
-
output[i] = a[i] + scale * b[i];
|
|
167
|
-
output[i + 1] = a[i + 1] + scale * b[i + 1];
|
|
168
|
-
output[i + 2] = a[i + 2] + scale * b[i + 2];
|
|
169
|
-
output[i + 3] = a[i + 3] + scale * b[i + 3];
|
|
170
|
-
output[i + 4] = a[i + 4] + scale * b[i + 4];
|
|
171
|
-
output[i + 5] = a[i + 5] + scale * b[i + 5];
|
|
172
|
-
output[i + 6] = a[i + 6] + scale * b[i + 6];
|
|
173
|
-
output[i + 7] = a[i + 7] + scale * b[i + 7];
|
|
174
|
-
}
|
|
175
|
-
for (let i = unrolledLen; i < length; i++) {
|
|
176
|
-
output[i] = a[i] + scale * b[i];
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
// ============================================================================
|
|
180
|
-
// Optimized Softmax Operations
|
|
181
|
-
// ============================================================================
|
|
182
|
-
/**
|
|
183
|
-
* Numerically stable softmax with fused max-subtract-exp-sum operation
|
|
184
|
-
* Single pass for max finding, second pass for exp and sum
|
|
185
|
-
*/
|
|
186
|
-
function softmaxInPlace(scores, length) {
|
|
187
|
-
// Validate length
|
|
188
|
-
if (length <= 0 || length > scores.length) {
|
|
189
|
-
throw new Error(`Invalid length: ${length}`);
|
|
190
|
-
}
|
|
191
|
-
// Find max (8x unrolled)
|
|
192
|
-
let max0 = -Infinity, max1 = -Infinity, max2 = -Infinity, max3 = -Infinity;
|
|
193
|
-
const unrolledLen = length - (length % 4);
|
|
194
|
-
for (let i = 0; i < unrolledLen; i += 4) {
|
|
195
|
-
if (scores[i] > max0)
|
|
196
|
-
max0 = scores[i];
|
|
197
|
-
if (scores[i + 1] > max1)
|
|
198
|
-
max1 = scores[i + 1];
|
|
199
|
-
if (scores[i + 2] > max2)
|
|
200
|
-
max2 = scores[i + 2];
|
|
201
|
-
if (scores[i + 3] > max3)
|
|
202
|
-
max3 = scores[i + 3];
|
|
203
|
-
}
|
|
204
|
-
let maxVal = Math.max(max0, max1, max2, max3);
|
|
205
|
-
for (let i = unrolledLen; i < length; i++) {
|
|
206
|
-
if (scores[i] > maxVal)
|
|
207
|
-
maxVal = scores[i];
|
|
208
|
-
}
|
|
209
|
-
// Handle edge case: all -Infinity scores
|
|
210
|
-
if (!Number.isFinite(maxVal)) {
|
|
211
|
-
// Uniform distribution when all scores are -Infinity
|
|
212
|
-
const uniformVal = 1.0 / length;
|
|
213
|
-
for (let i = 0; i < length; i++) {
|
|
214
|
-
scores[i] = uniformVal;
|
|
215
|
-
}
|
|
216
|
-
return;
|
|
217
|
-
}
|
|
218
|
-
// Fused subtract-exp-sum (4x unrolled for better cache usage)
|
|
219
|
-
let sum0 = 0, sum1 = 0, sum2 = 0, sum3 = 0;
|
|
220
|
-
for (let i = 0; i < unrolledLen; i += 4) {
|
|
221
|
-
const e0 = Math.exp(scores[i] - maxVal);
|
|
222
|
-
const e1 = Math.exp(scores[i + 1] - maxVal);
|
|
223
|
-
const e2 = Math.exp(scores[i + 2] - maxVal);
|
|
224
|
-
const e3 = Math.exp(scores[i + 3] - maxVal);
|
|
225
|
-
scores[i] = e0;
|
|
226
|
-
scores[i + 1] = e1;
|
|
227
|
-
scores[i + 2] = e2;
|
|
228
|
-
scores[i + 3] = e3;
|
|
229
|
-
sum0 += e0;
|
|
230
|
-
sum1 += e1;
|
|
231
|
-
sum2 += e2;
|
|
232
|
-
sum3 += e3;
|
|
233
|
-
}
|
|
234
|
-
for (let i = unrolledLen; i < length; i++) {
|
|
235
|
-
const e = Math.exp(scores[i] - maxVal);
|
|
236
|
-
scores[i] = e;
|
|
237
|
-
sum0 += e;
|
|
238
|
-
}
|
|
239
|
-
const sumTotal = sum0 + sum1 + sum2 + sum3;
|
|
240
|
-
// Guard against division by zero
|
|
241
|
-
if (sumTotal < EPSILON) {
|
|
242
|
-
// Uniform distribution when sum is effectively zero
|
|
243
|
-
const uniformVal = 1.0 / length;
|
|
244
|
-
for (let i = 0; i < length; i++) {
|
|
245
|
-
scores[i] = uniformVal;
|
|
246
|
-
}
|
|
247
|
-
return;
|
|
248
|
-
}
|
|
249
|
-
const invSum = 1.0 / sumTotal;
|
|
250
|
-
// Normalize (4x unrolled)
|
|
251
|
-
for (let i = 0; i < unrolledLen; i += 4) {
|
|
252
|
-
scores[i] *= invSum;
|
|
253
|
-
scores[i + 1] *= invSum;
|
|
254
|
-
scores[i + 2] *= invSum;
|
|
255
|
-
scores[i + 3] *= invSum;
|
|
256
|
-
}
|
|
257
|
-
for (let i = unrolledLen; i < length; i++) {
|
|
258
|
-
scores[i] *= invSum;
|
|
259
|
-
}
|
|
260
|
-
}
|
|
261
|
-
/**
|
|
262
|
-
* Softmax returning new array (when in-place not desired)
|
|
263
|
-
*/
|
|
264
|
-
// exported for use in attention kernel pipeline
|
|
265
|
-
export function softmaxOptimized(input) {
|
|
266
|
-
const output = globalBufferPool.acquire(input.length);
|
|
267
|
-
output.set(input);
|
|
268
|
-
softmaxInPlace(output, input.length);
|
|
269
|
-
return output;
|
|
270
|
-
}
|
|
271
|
-
// ============================================================================
|
|
272
|
-
// Original Scaled Dot-Product Attention (backward compatible)
|
|
273
|
-
// ============================================================================
|
|
274
|
-
/**
|
|
275
|
-
* Scaled Dot-Product Attention
|
|
276
|
-
* The core attention mechanism
|
|
277
|
-
*/
|
|
278
|
-
export function scaledDotProductAttention(query, key, value, mask) {
|
|
279
|
-
const dk = query.length;
|
|
280
|
-
// Compute attention scores: Q · K^T / sqrt(dk)
|
|
281
|
-
let score = 0;
|
|
282
|
-
for (let i = 0; i < dk; i++) {
|
|
283
|
-
score += query[i] * key[i];
|
|
284
|
-
}
|
|
285
|
-
score /= Math.sqrt(dk);
|
|
286
|
-
// Apply mask if provided
|
|
287
|
-
if (mask && mask[0] === 0) {
|
|
288
|
-
score = -Infinity;
|
|
289
|
-
}
|
|
290
|
-
// Softmax (single score version)
|
|
291
|
-
const expScore = Math.exp(score);
|
|
292
|
-
const weight = expScore; // Simplified for single K,V pair
|
|
293
|
-
// Weighted value
|
|
294
|
-
const output = value.map(v => v * weight);
|
|
295
|
-
return { output, weights: [weight] };
|
|
296
|
-
}
|
|
297
|
-
// ============================================================================
|
|
298
|
-
// Optimized Scaled Dot-Product Attention with TypedArrays
|
|
299
|
-
// ============================================================================
|
|
300
|
-
/**
|
|
301
|
-
* Optimized scaled dot-product attention using TypedArrays and SIMD-style ops
|
|
302
|
-
*/
|
|
303
|
-
export function scaledDotProductAttentionOptimized(query, key, value, mask) {
|
|
304
|
-
const dk = query.length;
|
|
305
|
-
const scale = 1.0 / Math.sqrt(dk);
|
|
306
|
-
// Compute attention score using 8x unrolled dot product
|
|
307
|
-
let score = dotProduct8x(query, key, dk) * scale;
|
|
308
|
-
// Apply mask if provided
|
|
309
|
-
if (mask && mask[0] === 0) {
|
|
310
|
-
score = -Infinity;
|
|
311
|
-
}
|
|
312
|
-
// Softmax (single score version)
|
|
313
|
-
const expScore = Math.exp(score);
|
|
314
|
-
const weight = expScore;
|
|
315
|
-
// Weighted value (using buffer pool)
|
|
316
|
-
const output = globalBufferPool.acquire(value.length);
|
|
317
|
-
const unrolledLen = value.length - (value.length % 8);
|
|
318
|
-
for (let i = 0; i < unrolledLen; i += 8) {
|
|
319
|
-
output[i] = value[i] * weight;
|
|
320
|
-
output[i + 1] = value[i + 1] * weight;
|
|
321
|
-
output[i + 2] = value[i + 2] * weight;
|
|
322
|
-
output[i + 3] = value[i + 3] * weight;
|
|
323
|
-
output[i + 4] = value[i + 4] * weight;
|
|
324
|
-
output[i + 5] = value[i + 5] * weight;
|
|
325
|
-
output[i + 6] = value[i + 6] * weight;
|
|
326
|
-
output[i + 7] = value[i + 7] * weight;
|
|
327
|
-
}
|
|
328
|
-
for (let i = unrolledLen; i < value.length; i++) {
|
|
329
|
-
output[i] = value[i] * weight;
|
|
330
|
-
}
|
|
331
|
-
return { output, weights: new Float32Array([weight]) };
|
|
332
|
-
}
|
|
333
|
-
/**
|
|
334
|
-
* Batch scaled dot-product attention for processing multiple queries at once
|
|
335
|
-
* Processes multiple Q-K-V triplets efficiently
|
|
336
|
-
*/
|
|
337
|
-
export function batchScaledDotProductAttention(queries, keys, values, masks) {
|
|
338
|
-
const batchSize = queries.length;
|
|
339
|
-
const outputs = [];
|
|
340
|
-
const allWeights = [];
|
|
341
|
-
// Process in batches of 4 for cache efficiency
|
|
342
|
-
const batchOf4 = batchSize - (batchSize % 4);
|
|
343
|
-
for (let b = 0; b < batchOf4; b += 4) {
|
|
344
|
-
// Process 4 attention computations
|
|
345
|
-
for (let i = 0; i < 4; i++) {
|
|
346
|
-
const idx = b + i;
|
|
347
|
-
const mask = masks ? masks[idx] : null;
|
|
348
|
-
const { output, weights } = scaledDotProductAttentionOptimized(queries[idx], keys[idx], values[idx], mask);
|
|
349
|
-
outputs.push(output);
|
|
350
|
-
allWeights.push(weights);
|
|
351
|
-
}
|
|
352
|
-
}
|
|
353
|
-
// Handle remainder
|
|
354
|
-
for (let b = batchOf4; b < batchSize; b++) {
|
|
355
|
-
const mask = masks ? masks[b] : null;
|
|
356
|
-
const { output, weights } = scaledDotProductAttentionOptimized(queries[b], keys[b], values[b], mask);
|
|
357
|
-
outputs.push(output);
|
|
358
|
-
allWeights.push(weights);
|
|
359
|
-
}
|
|
360
|
-
return { outputs, weights: allWeights };
|
|
361
|
-
}
|
|
362
|
-
/**
|
|
363
|
-
* Full attention computation over sequences (Q, K, V matrices)
|
|
364
|
-
* Returns attention output and weights for all query positions
|
|
365
|
-
*/
|
|
366
|
-
export function batchSequenceAttention(queries, // [seqLen * dim] flattened
|
|
367
|
-
keys, // [seqLen * dim] flattened
|
|
368
|
-
values, // [seqLen * dim] flattened
|
|
369
|
-
seqLen, dim, mask // [seqLen * seqLen] attention mask
|
|
370
|
-
) {
|
|
371
|
-
const scale = 1.0 / Math.sqrt(dim);
|
|
372
|
-
const output = globalBufferPool.acquire(seqLen * dim);
|
|
373
|
-
const weights = globalBufferPool.acquire(seqLen * seqLen);
|
|
374
|
-
// Compute attention scores for each query position
|
|
375
|
-
for (let qi = 0; qi < seqLen; qi++) {
|
|
376
|
-
const qOffset = qi * dim;
|
|
377
|
-
const scoresOffset = qi * seqLen;
|
|
378
|
-
// Compute Q[qi] * K^T for all key positions
|
|
379
|
-
for (let ki = 0; ki < seqLen; ki++) {
|
|
380
|
-
const kOffset = ki * dim;
|
|
381
|
-
let score = 0;
|
|
382
|
-
// 8x unrolled dot product
|
|
383
|
-
const unrolledDim = dim - (dim % 8);
|
|
384
|
-
let sum0 = 0, sum1 = 0, sum2 = 0, sum3 = 0;
|
|
385
|
-
let sum4 = 0, sum5 = 0, sum6 = 0, sum7 = 0;
|
|
386
|
-
for (let d = 0; d < unrolledDim; d += 8) {
|
|
387
|
-
sum0 += queries[qOffset + d] * keys[kOffset + d];
|
|
388
|
-
sum1 += queries[qOffset + d + 1] * keys[kOffset + d + 1];
|
|
389
|
-
sum2 += queries[qOffset + d + 2] * keys[kOffset + d + 2];
|
|
390
|
-
sum3 += queries[qOffset + d + 3] * keys[kOffset + d + 3];
|
|
391
|
-
sum4 += queries[qOffset + d + 4] * keys[kOffset + d + 4];
|
|
392
|
-
sum5 += queries[qOffset + d + 5] * keys[kOffset + d + 5];
|
|
393
|
-
sum6 += queries[qOffset + d + 6] * keys[kOffset + d + 6];
|
|
394
|
-
sum7 += queries[qOffset + d + 7] * keys[kOffset + d + 7];
|
|
395
|
-
}
|
|
396
|
-
for (let d = unrolledDim; d < dim; d++) {
|
|
397
|
-
sum0 += queries[qOffset + d] * keys[kOffset + d];
|
|
398
|
-
}
|
|
399
|
-
score = ((sum0 + sum1) + (sum2 + sum3) + (sum4 + sum5) + (sum6 + sum7)) * scale;
|
|
400
|
-
// Apply mask if provided
|
|
401
|
-
if (mask && mask[scoresOffset + ki] === 0) {
|
|
402
|
-
score = -1e9; // Large negative instead of -Infinity for numerical stability
|
|
403
|
-
}
|
|
404
|
-
weights[scoresOffset + ki] = score;
|
|
405
|
-
}
|
|
406
|
-
// Softmax over the row
|
|
407
|
-
softmaxInPlace(new Float32Array(weights.buffer, scoresOffset * 4, seqLen), seqLen);
|
|
408
|
-
// Weighted sum of values
|
|
409
|
-
const outOffset = qi * dim;
|
|
410
|
-
for (let d = 0; d < dim; d++) {
|
|
411
|
-
output[outOffset + d] = 0;
|
|
412
|
-
}
|
|
413
|
-
for (let vi = 0; vi < seqLen; vi++) {
|
|
414
|
-
const vOffset = vi * dim;
|
|
415
|
-
const w = weights[scoresOffset + vi];
|
|
416
|
-
// 8x unrolled weighted add
|
|
417
|
-
const unrolledDim = dim - (dim % 8);
|
|
418
|
-
for (let d = 0; d < unrolledDim; d += 8) {
|
|
419
|
-
output[outOffset + d] += w * values[vOffset + d];
|
|
420
|
-
output[outOffset + d + 1] += w * values[vOffset + d + 1];
|
|
421
|
-
output[outOffset + d + 2] += w * values[vOffset + d + 2];
|
|
422
|
-
output[outOffset + d + 3] += w * values[vOffset + d + 3];
|
|
423
|
-
output[outOffset + d + 4] += w * values[vOffset + d + 4];
|
|
424
|
-
output[outOffset + d + 5] += w * values[vOffset + d + 5];
|
|
425
|
-
output[outOffset + d + 6] += w * values[vOffset + d + 6];
|
|
426
|
-
output[outOffset + d + 7] += w * values[vOffset + d + 7];
|
|
427
|
-
}
|
|
428
|
-
for (let d = unrolledDim; d < dim; d++) {
|
|
429
|
-
output[outOffset + d] += w * values[vOffset + d];
|
|
430
|
-
}
|
|
431
|
-
}
|
|
432
|
-
}
|
|
433
|
-
return { output, weights };
|
|
434
|
-
}
|
|
435
|
-
/**
|
|
436
|
-
* Multi-Head Attention (JavaScript fallback)
|
|
437
|
-
*
|
|
438
|
-
* Replaces broken @ruvector/attention.multiHeadAttention
|
|
439
|
-
*/
|
|
440
|
-
export class MultiHeadAttention {
|
|
441
|
-
numHeads;
|
|
442
|
-
hiddenDim;
|
|
443
|
-
headDim;
|
|
444
|
-
queryWeights;
|
|
445
|
-
keyWeights;
|
|
446
|
-
valueWeights;
|
|
447
|
-
outputWeights;
|
|
448
|
-
constructor(config) {
|
|
449
|
-
// Validate config for security
|
|
450
|
-
validateDimension(config.hiddenDim, 'hiddenDim');
|
|
451
|
-
this.numHeads = Math.min(Math.max(1, config.numHeads || 8), 256);
|
|
452
|
-
this.hiddenDim = config.hiddenDim;
|
|
453
|
-
this.headDim = Math.floor(this.hiddenDim / this.numHeads);
|
|
454
|
-
if (this.headDim < 1) {
|
|
455
|
-
throw new Error('headDim must be at least 1 (hiddenDim / numHeads)');
|
|
456
|
-
}
|
|
457
|
-
// Initialize weights (random)
|
|
458
|
-
this.queryWeights = this.initializeWeights();
|
|
459
|
-
this.keyWeights = this.initializeWeights();
|
|
460
|
-
this.valueWeights = this.initializeWeights();
|
|
461
|
-
this.outputWeights = this.initializeOutputWeights();
|
|
462
|
-
}
|
|
463
|
-
initializeWeights() {
|
|
464
|
-
const weights = [];
|
|
465
|
-
for (let h = 0; h < this.numHeads; h++) {
|
|
466
|
-
const headWeights = [];
|
|
467
|
-
for (let i = 0; i < this.headDim; i++) {
|
|
468
|
-
const row = [];
|
|
469
|
-
for (let j = 0; j < this.hiddenDim; j++) {
|
|
470
|
-
row.push((Math.random() - 0.5) * 0.1);
|
|
471
|
-
}
|
|
472
|
-
headWeights.push(row);
|
|
473
|
-
}
|
|
474
|
-
weights.push(headWeights);
|
|
475
|
-
}
|
|
476
|
-
return weights;
|
|
477
|
-
}
|
|
478
|
-
initializeOutputWeights() {
|
|
479
|
-
const weights = [];
|
|
480
|
-
for (let i = 0; i < this.hiddenDim; i++) {
|
|
481
|
-
const row = [];
|
|
482
|
-
for (let j = 0; j < this.hiddenDim; j++) {
|
|
483
|
-
row.push((Math.random() - 0.5) * 0.1);
|
|
484
|
-
}
|
|
485
|
-
weights.push(row);
|
|
486
|
-
}
|
|
487
|
-
return weights;
|
|
488
|
-
}
|
|
489
|
-
forward(query, key, value, mask) {
|
|
490
|
-
const headOutputs = [];
|
|
491
|
-
const allWeights = [];
|
|
492
|
-
// Process each head
|
|
493
|
-
for (let h = 0; h < this.numHeads; h++) {
|
|
494
|
-
// Project to head dimension
|
|
495
|
-
const q = this.project(query, this.queryWeights[h]);
|
|
496
|
-
const k = this.project(key, this.keyWeights[h]);
|
|
497
|
-
const v = this.project(value, this.valueWeights[h]);
|
|
498
|
-
// Attention for this head
|
|
499
|
-
const { output, weights } = scaledDotProductAttention(q, k, v, mask);
|
|
500
|
-
headOutputs.push(output);
|
|
501
|
-
allWeights.push(weights);
|
|
502
|
-
}
|
|
503
|
-
// Concatenate heads
|
|
504
|
-
const concatenated = headOutputs.flat();
|
|
505
|
-
// Output projection
|
|
506
|
-
const output = this.project(concatenated, this.outputWeights);
|
|
507
|
-
return { output, attentionWeights: allWeights };
|
|
508
|
-
}
|
|
509
|
-
project(input, weights) {
|
|
510
|
-
const output = [];
|
|
511
|
-
for (let i = 0; i < weights.length; i++) {
|
|
512
|
-
let sum = 0;
|
|
513
|
-
for (let j = 0; j < input.length; j++) {
|
|
514
|
-
sum += input[j] * weights[i][j];
|
|
515
|
-
}
|
|
516
|
-
output.push(sum);
|
|
517
|
-
}
|
|
518
|
-
return output;
|
|
519
|
-
}
|
|
520
|
-
}
|
|
521
|
-
// ============================================================================
|
|
522
|
-
// Optimized Multi-Head Attention with TypedArrays and SIMD-style operations
|
|
523
|
-
// ============================================================================
|
|
524
|
-
/**
|
|
525
|
-
* Optimized Multi-Head Attention using TypedArrays and pre-allocated buffers
|
|
526
|
-
*
|
|
527
|
-
* Improvements over original:
|
|
528
|
-
* - Float32Array instead of number[]
|
|
529
|
-
* - Pre-allocated weight matrices in contiguous memory
|
|
530
|
-
* - 8x loop unrolling for projections
|
|
531
|
-
* - Buffer pool for intermediate results
|
|
532
|
-
* - Batch processing support
|
|
533
|
-
*/
|
|
534
|
-
export class MultiHeadAttentionOptimized {
|
|
535
|
-
numHeads;
|
|
536
|
-
hiddenDim;
|
|
537
|
-
headDim;
|
|
538
|
-
// Contiguous weight storage for cache efficiency
|
|
539
|
-
// Shape: [numHeads * headDim * hiddenDim]
|
|
540
|
-
queryWeights;
|
|
541
|
-
keyWeights;
|
|
542
|
-
valueWeights;
|
|
543
|
-
// Shape: [hiddenDim * hiddenDim]
|
|
544
|
-
outputWeights;
|
|
545
|
-
// Pre-allocated buffers for intermediate results
|
|
546
|
-
headBuffer;
|
|
547
|
-
projBuffer;
|
|
548
|
-
concatBuffer;
|
|
549
|
-
constructor(config) {
|
|
550
|
-
// Validate config
|
|
551
|
-
validateDimension(config.hiddenDim, 'hiddenDim');
|
|
552
|
-
this.numHeads = Math.min(Math.max(1, config.numHeads || 8), 256);
|
|
553
|
-
this.hiddenDim = config.hiddenDim;
|
|
554
|
-
this.headDim = Math.floor(this.hiddenDim / this.numHeads);
|
|
555
|
-
if (this.headDim < 1) {
|
|
556
|
-
throw new Error('headDim must be at least 1 (hiddenDim / numHeads)');
|
|
557
|
-
}
|
|
558
|
-
const projSize = this.numHeads * this.headDim * this.hiddenDim;
|
|
559
|
-
// Initialize contiguous weight arrays
|
|
560
|
-
this.queryWeights = this.initializeProjectionWeights(projSize);
|
|
561
|
-
this.keyWeights = this.initializeProjectionWeights(projSize);
|
|
562
|
-
this.valueWeights = this.initializeProjectionWeights(projSize);
|
|
563
|
-
this.outputWeights = this.initializeOutputWeights();
|
|
564
|
-
// Pre-allocate buffers
|
|
565
|
-
this.headBuffer = new Float32Array(this.headDim);
|
|
566
|
-
this.projBuffer = new Float32Array(this.headDim * 3); // Q, K, V for one head
|
|
567
|
-
this.concatBuffer = new Float32Array(this.numHeads * this.headDim);
|
|
568
|
-
}
|
|
569
|
-
initializeProjectionWeights(size) {
|
|
570
|
-
const weights = new Float32Array(size);
|
|
571
|
-
const scale = 0.1;
|
|
572
|
-
for (let i = 0; i < size; i++) {
|
|
573
|
-
weights[i] = (Math.random() - 0.5) * scale;
|
|
574
|
-
}
|
|
575
|
-
return weights;
|
|
576
|
-
}
|
|
577
|
-
initializeOutputWeights() {
|
|
578
|
-
const size = this.hiddenDim * this.hiddenDim;
|
|
579
|
-
const weights = new Float32Array(size);
|
|
580
|
-
const scale = 0.1;
|
|
581
|
-
for (let i = 0; i < size; i++) {
|
|
582
|
-
weights[i] = (Math.random() - 0.5) * scale;
|
|
583
|
-
}
|
|
584
|
-
return weights;
|
|
585
|
-
}
|
|
586
|
-
/**
|
|
587
|
-
* Forward pass with optimized TypedArray operations
|
|
588
|
-
*/
|
|
589
|
-
forward(query, key, value, mask) {
|
|
590
|
-
const allWeights = [];
|
|
591
|
-
const headOutputs = [];
|
|
592
|
-
// Process each head with optimized projections
|
|
593
|
-
for (let h = 0; h < this.numHeads; h++) {
|
|
594
|
-
const weightOffset = h * this.headDim * this.hiddenDim;
|
|
595
|
-
// Project Q, K, V for this head using 8x unrolled matmul
|
|
596
|
-
const q = this.projectOptimized(query, this.queryWeights, weightOffset);
|
|
597
|
-
const k = this.projectOptimized(key, this.keyWeights, weightOffset);
|
|
598
|
-
const v = this.projectOptimized(value, this.valueWeights, weightOffset);
|
|
599
|
-
// Scaled dot-product attention
|
|
600
|
-
const { output, weights } = scaledDotProductAttentionOptimized(q, k, v, mask);
|
|
601
|
-
headOutputs.push(output);
|
|
602
|
-
allWeights.push(weights);
|
|
603
|
-
}
|
|
604
|
-
// Concatenate heads into pre-allocated buffer
|
|
605
|
-
let offset = 0;
|
|
606
|
-
for (let h = 0; h < this.numHeads; h++) {
|
|
607
|
-
this.concatBuffer.set(headOutputs[h], offset);
|
|
608
|
-
offset += headOutputs[h].length;
|
|
609
|
-
}
|
|
610
|
-
// Output projection
|
|
611
|
-
const output = globalBufferPool.acquire(this.hiddenDim);
|
|
612
|
-
matVecMul8x(this.outputWeights, this.concatBuffer, output, this.hiddenDim, this.hiddenDim);
|
|
613
|
-
return { output, attentionWeights: allWeights };
|
|
614
|
-
}
|
|
615
|
-
/**
|
|
616
|
-
* Batch forward pass for multiple inputs
|
|
617
|
-
*/
|
|
618
|
-
batchForward(queries, keys, values, masks) {
|
|
619
|
-
const outputs = [];
|
|
620
|
-
const allWeights = [];
|
|
621
|
-
for (let i = 0; i < queries.length; i++) {
|
|
622
|
-
const mask = masks ? masks[i] : null;
|
|
623
|
-
const { output, attentionWeights } = this.forward(queries[i], keys[i], values[i], mask);
|
|
624
|
-
outputs.push(output);
|
|
625
|
-
allWeights.push(attentionWeights);
|
|
626
|
-
}
|
|
627
|
-
return { outputs, attentionWeights: allWeights };
|
|
628
|
-
}
|
|
629
|
-
/**
|
|
630
|
-
* Optimized projection using contiguous weight storage and 8x unrolling
|
|
631
|
-
*/
|
|
632
|
-
projectOptimized(input, weights, weightOffset) {
|
|
633
|
-
const output = globalBufferPool.acquire(this.headDim);
|
|
634
|
-
const inputLen = input.length;
|
|
635
|
-
const unrolledLen = inputLen - (inputLen % 8);
|
|
636
|
-
for (let i = 0; i < this.headDim; i++) {
|
|
637
|
-
let sum0 = 0, sum1 = 0, sum2 = 0, sum3 = 0;
|
|
638
|
-
let sum4 = 0, sum5 = 0, sum6 = 0, sum7 = 0;
|
|
639
|
-
const rowOffset = weightOffset + i * inputLen;
|
|
640
|
-
// 8x unrolled inner loop
|
|
641
|
-
for (let j = 0; j < unrolledLen; j += 8) {
|
|
642
|
-
sum0 += input[j] * weights[rowOffset + j];
|
|
643
|
-
sum1 += input[j + 1] * weights[rowOffset + j + 1];
|
|
644
|
-
sum2 += input[j + 2] * weights[rowOffset + j + 2];
|
|
645
|
-
sum3 += input[j + 3] * weights[rowOffset + j + 3];
|
|
646
|
-
sum4 += input[j + 4] * weights[rowOffset + j + 4];
|
|
647
|
-
sum5 += input[j + 5] * weights[rowOffset + j + 5];
|
|
648
|
-
sum6 += input[j + 6] * weights[rowOffset + j + 6];
|
|
649
|
-
sum7 += input[j + 7] * weights[rowOffset + j + 7];
|
|
650
|
-
}
|
|
651
|
-
// Handle remainder
|
|
652
|
-
for (let j = unrolledLen; j < inputLen; j++) {
|
|
653
|
-
sum0 += input[j] * weights[rowOffset + j];
|
|
654
|
-
}
|
|
655
|
-
output[i] = (sum0 + sum1) + (sum2 + sum3) + (sum4 + sum5) + (sum6 + sum7);
|
|
656
|
-
}
|
|
657
|
-
return output;
|
|
658
|
-
}
|
|
659
|
-
/**
|
|
660
|
-
* Release buffers back to pool (call when done with outputs)
|
|
661
|
-
*/
|
|
662
|
-
releaseBuffer(buffer) {
|
|
663
|
-
globalBufferPool.release(buffer);
|
|
664
|
-
}
|
|
665
|
-
/**
|
|
666
|
-
* Get weight matrices (for serialization/loading)
|
|
667
|
-
*/
|
|
668
|
-
getWeights() {
|
|
669
|
-
return {
|
|
670
|
-
query: this.queryWeights,
|
|
671
|
-
key: this.keyWeights,
|
|
672
|
-
value: this.valueWeights,
|
|
673
|
-
output: this.outputWeights,
|
|
674
|
-
};
|
|
675
|
-
}
|
|
676
|
-
/**
|
|
677
|
-
* Set weight matrices (for loading pre-trained weights)
|
|
678
|
-
*/
|
|
679
|
-
setWeights(weights) {
|
|
680
|
-
this.queryWeights.set(weights.query);
|
|
681
|
-
this.keyWeights.set(weights.key);
|
|
682
|
-
this.valueWeights.set(weights.value);
|
|
683
|
-
this.outputWeights.set(weights.output);
|
|
684
|
-
}
|
|
685
|
-
}
|
|
686
|
-
/**
|
|
687
|
-
* Flash Attention (optimized fallback)
|
|
688
|
-
*
|
|
689
|
-
* Replaces broken @ruvector/attention.flashAttention
|
|
690
|
-
* Uses tiling/chunking for better memory efficiency
|
|
691
|
-
*/
|
|
692
|
-
export class FlashAttention {
|
|
693
|
-
hiddenDim;
|
|
694
|
-
blockSize;
|
|
695
|
-
constructor(config) {
|
|
696
|
-
this.hiddenDim = config.hiddenDim;
|
|
697
|
-
this.blockSize = Math.min(64, this.hiddenDim); // Tile size
|
|
698
|
-
}
|
|
699
|
-
forward(query, key, value, numHeads = 8) {
|
|
700
|
-
const seqLen = query.length;
|
|
701
|
-
const headDim = this.hiddenDim / numHeads;
|
|
702
|
-
const output = [];
|
|
703
|
-
const attentionScores = [];
|
|
704
|
-
// Process in blocks for memory efficiency
|
|
705
|
-
for (let i = 0; i < seqLen; i += this.blockSize) {
|
|
706
|
-
const blockEnd = Math.min(i + this.blockSize, seqLen);
|
|
707
|
-
for (let qi = i; qi < blockEnd; qi++) {
|
|
708
|
-
const scores = [];
|
|
709
|
-
let maxScore = -Infinity;
|
|
710
|
-
// Compute attention scores for this query
|
|
711
|
-
for (let ki = 0; ki < seqLen; ki++) {
|
|
712
|
-
let score = 0;
|
|
713
|
-
for (let d = 0; d < query[qi].length; d++) {
|
|
714
|
-
score += query[qi][d] * key[ki][d];
|
|
715
|
-
}
|
|
716
|
-
score /= Math.sqrt(headDim);
|
|
717
|
-
scores.push(score);
|
|
718
|
-
maxScore = Math.max(maxScore, score);
|
|
719
|
-
}
|
|
720
|
-
// Numerically stable softmax
|
|
721
|
-
const expScores = scores.map(s => Math.exp(s - maxScore));
|
|
722
|
-
const sumExp = expScores.reduce((a, b) => a + b, 0);
|
|
723
|
-
const weights = expScores.map(e => e / sumExp);
|
|
724
|
-
// Weighted sum of values
|
|
725
|
-
const outputRow = new Array(value[0].length).fill(0);
|
|
726
|
-
for (let vi = 0; vi < seqLen; vi++) {
|
|
727
|
-
for (let d = 0; d < value[vi].length; d++) {
|
|
728
|
-
outputRow[d] += weights[vi] * value[vi][d];
|
|
729
|
-
}
|
|
730
|
-
}
|
|
731
|
-
output.push(outputRow);
|
|
732
|
-
attentionScores.push(weights);
|
|
733
|
-
}
|
|
734
|
-
}
|
|
735
|
-
return { output, attentionScores };
|
|
736
|
-
}
|
|
737
|
-
}
|
|
738
|
-
/**
|
|
739
|
-
* Optimized Flash Attention using TypedArrays and improved tiling strategy
|
|
740
|
-
*
|
|
741
|
-
* Improvements over original:
|
|
742
|
-
* - Separate Q and KV block sizes for better memory usage
|
|
743
|
-
* - Online softmax computation (memory efficient)
|
|
744
|
-
* - Pre-allocated buffers for all intermediate results
|
|
745
|
-
* - 8x loop unrolling for score computation
|
|
746
|
-
* - Causal masking support
|
|
747
|
-
* - Backward pass placeholder for gradient computation
|
|
748
|
-
*/
|
|
749
|
-
export class FlashAttentionOptimized {
|
|
750
|
-
hiddenDim;
|
|
751
|
-
blockSizeQ;
|
|
752
|
-
blockSizeKV;
|
|
753
|
-
causal;
|
|
754
|
-
// Pre-allocated buffers
|
|
755
|
-
scoresBuffer;
|
|
756
|
-
expBuffer;
|
|
757
|
-
outputBuffer;
|
|
758
|
-
maxBuffer;
|
|
759
|
-
sumBuffer;
|
|
760
|
-
constructor(config) {
|
|
761
|
-
// Validate config
|
|
762
|
-
validateDimension(config.hiddenDim, 'hiddenDim');
|
|
763
|
-
this.hiddenDim = config.hiddenDim;
|
|
764
|
-
// Optimal block sizes for L1/L2 cache (typically 32KB-256KB)
|
|
765
|
-
// Bounded for security
|
|
766
|
-
this.blockSizeQ = Math.min(Math.max(8, config.blockSizeQ || 32), 256);
|
|
767
|
-
this.blockSizeKV = Math.min(Math.max(8, config.blockSizeKV || 64), 256);
|
|
768
|
-
this.causal = config.causal || false;
|
|
769
|
-
// Validate that block sizes don't cause excessive memory allocation
|
|
770
|
-
const maxBlockMemory = this.blockSizeQ * this.blockSizeKV * 4 * 2; // scores + exp buffers
|
|
771
|
-
const maxOutputMemory = this.blockSizeQ * this.hiddenDim * 4;
|
|
772
|
-
if (maxBlockMemory + maxOutputMemory > 64 * 1024 * 1024) { // 64MB limit
|
|
773
|
-
throw new Error('Block sizes would require excessive memory allocation');
|
|
774
|
-
}
|
|
775
|
-
// Pre-allocate buffers for maximum expected sizes
|
|
776
|
-
this.scoresBuffer = new Float32Array(this.blockSizeQ * this.blockSizeKV);
|
|
777
|
-
this.expBuffer = new Float32Array(this.blockSizeQ * this.blockSizeKV);
|
|
778
|
-
this.outputBuffer = new Float32Array(this.blockSizeQ * this.hiddenDim);
|
|
779
|
-
this.maxBuffer = new Float32Array(this.blockSizeQ);
|
|
780
|
-
this.sumBuffer = new Float32Array(this.blockSizeQ);
|
|
781
|
-
}
|
|
782
|
-
/**
|
|
783
|
-
* Forward pass with optimized tiling strategy
|
|
784
|
-
* Uses online softmax for memory efficiency
|
|
785
|
-
*/
|
|
786
|
-
forward(query, // [seqLen * dim] flattened
|
|
787
|
-
key, // [seqLen * dim] flattened
|
|
788
|
-
value, // [seqLen * dim] flattened
|
|
789
|
-
seqLen, dim, numHeads = 8) {
|
|
790
|
-
// Validate inputs
|
|
791
|
-
validateFloat32Array(query, 'query');
|
|
792
|
-
validateFloat32Array(key, 'key');
|
|
793
|
-
validateFloat32Array(value, 'value');
|
|
794
|
-
validateSeqLength(seqLen, 'seqLen');
|
|
795
|
-
validateDimension(dim, 'dim');
|
|
796
|
-
// Validate array sizes match expected dimensions
|
|
797
|
-
const expectedSize = seqLen * dim;
|
|
798
|
-
if (query.length < expectedSize || key.length < expectedSize || value.length < expectedSize) {
|
|
799
|
-
throw new Error(`Input arrays too small for seqLen=${seqLen}, dim=${dim}`);
|
|
800
|
-
}
|
|
801
|
-
const headDim = dim / numHeads;
|
|
802
|
-
if (headDim < 1) {
|
|
803
|
-
throw new Error('Invalid numHeads: results in headDim < 1');
|
|
804
|
-
}
|
|
805
|
-
const scale = 1.0 / Math.sqrt(headDim);
|
|
806
|
-
// Allocate output arrays
|
|
807
|
-
const output = globalBufferPool.acquire(seqLen * dim);
|
|
808
|
-
const attentionScores = globalBufferPool.acquire(seqLen * seqLen);
|
|
809
|
-
// Initialize output to zero
|
|
810
|
-
output.fill(0);
|
|
811
|
-
// Process query blocks
|
|
812
|
-
for (let qBlockStart = 0; qBlockStart < seqLen; qBlockStart += this.blockSizeQ) {
|
|
813
|
-
const qBlockEnd = Math.min(qBlockStart + this.blockSizeQ, seqLen);
|
|
814
|
-
const qBlockSize = qBlockEnd - qBlockStart;
|
|
815
|
-
// Initialize running max and sum for online softmax
|
|
816
|
-
this.maxBuffer.fill(-Infinity);
|
|
817
|
-
this.sumBuffer.fill(0);
|
|
818
|
-
this.outputBuffer.fill(0);
|
|
819
|
-
// Process key-value blocks
|
|
820
|
-
const kvEnd = this.causal ? qBlockEnd : seqLen;
|
|
821
|
-
for (let kvBlockStart = 0; kvBlockStart < kvEnd; kvBlockStart += this.blockSizeKV) {
|
|
822
|
-
const kvBlockEnd = Math.min(kvBlockStart + this.blockSizeKV, kvEnd);
|
|
823
|
-
const kvBlockSize = kvBlockEnd - kvBlockStart;
|
|
824
|
-
// Compute attention scores for this block (Q_block @ K_block^T)
|
|
825
|
-
this.computeBlockScores(query, key, qBlockStart, qBlockEnd, kvBlockStart, kvBlockEnd, dim, scale);
|
|
826
|
-
// Apply causal mask if needed
|
|
827
|
-
if (this.causal) {
|
|
828
|
-
for (let qi = 0; qi < qBlockSize; qi++) {
|
|
829
|
-
const globalQi = qBlockStart + qi;
|
|
830
|
-
for (let ki = 0; ki < kvBlockSize; ki++) {
|
|
831
|
-
const globalKi = kvBlockStart + ki;
|
|
832
|
-
if (globalKi > globalQi) {
|
|
833
|
-
this.scoresBuffer[qi * kvBlockSize + ki] = -1e9;
|
|
834
|
-
}
|
|
835
|
-
}
|
|
836
|
-
}
|
|
837
|
-
}
|
|
838
|
-
// Online softmax update and output accumulation
|
|
839
|
-
this.updateOnlineSoftmax(value, qBlockSize, kvBlockSize, kvBlockStart, dim);
|
|
840
|
-
// Store attention scores
|
|
841
|
-
for (let qi = 0; qi < qBlockSize; qi++) {
|
|
842
|
-
const globalQi = qBlockStart + qi;
|
|
843
|
-
for (let ki = 0; ki < kvBlockSize; ki++) {
|
|
844
|
-
const globalKi = kvBlockStart + ki;
|
|
845
|
-
attentionScores[globalQi * seqLen + globalKi] = this.scoresBuffer[qi * kvBlockSize + ki];
|
|
846
|
-
}
|
|
847
|
-
}
|
|
848
|
-
}
|
|
849
|
-
// Normalize output by sum
|
|
850
|
-
for (let qi = 0; qi < qBlockSize; qi++) {
|
|
851
|
-
const globalQi = qBlockStart + qi;
|
|
852
|
-
const invSum = 1.0 / (this.sumBuffer[qi] + 1e-8);
|
|
853
|
-
const outOffset = globalQi * dim;
|
|
854
|
-
const localOffset = qi * dim;
|
|
855
|
-
// 8x unrolled normalization
|
|
856
|
-
const unrolledDim = dim - (dim % 8);
|
|
857
|
-
for (let d = 0; d < unrolledDim; d += 8) {
|
|
858
|
-
output[outOffset + d] = this.outputBuffer[localOffset + d] * invSum;
|
|
859
|
-
output[outOffset + d + 1] = this.outputBuffer[localOffset + d + 1] * invSum;
|
|
860
|
-
output[outOffset + d + 2] = this.outputBuffer[localOffset + d + 2] * invSum;
|
|
861
|
-
output[outOffset + d + 3] = this.outputBuffer[localOffset + d + 3] * invSum;
|
|
862
|
-
output[outOffset + d + 4] = this.outputBuffer[localOffset + d + 4] * invSum;
|
|
863
|
-
output[outOffset + d + 5] = this.outputBuffer[localOffset + d + 5] * invSum;
|
|
864
|
-
output[outOffset + d + 6] = this.outputBuffer[localOffset + d + 6] * invSum;
|
|
865
|
-
output[outOffset + d + 7] = this.outputBuffer[localOffset + d + 7] * invSum;
|
|
866
|
-
}
|
|
867
|
-
for (let d = unrolledDim; d < dim; d++) {
|
|
868
|
-
output[outOffset + d] = this.outputBuffer[localOffset + d] * invSum;
|
|
869
|
-
}
|
|
870
|
-
}
|
|
871
|
-
}
|
|
872
|
-
return { output, attentionScores };
|
|
873
|
-
}
|
|
874
|
-
/**
|
|
875
|
-
* Compute attention scores for a block pair with 8x unrolling
|
|
876
|
-
*/
|
|
877
|
-
computeBlockScores(query, key, qStart, qEnd, kStart, kEnd, dim, scale) {
|
|
878
|
-
const qBlockSize = qEnd - qStart;
|
|
879
|
-
const kBlockSize = kEnd - kStart;
|
|
880
|
-
const unrolledDim = dim - (dim % 8);
|
|
881
|
-
for (let qi = 0; qi < qBlockSize; qi++) {
|
|
882
|
-
const qOffset = (qStart + qi) * dim;
|
|
883
|
-
for (let ki = 0; ki < kBlockSize; ki++) {
|
|
884
|
-
const kOffset = (kStart + ki) * dim;
|
|
885
|
-
// 8x unrolled dot product
|
|
886
|
-
let sum0 = 0, sum1 = 0, sum2 = 0, sum3 = 0;
|
|
887
|
-
let sum4 = 0, sum5 = 0, sum6 = 0, sum7 = 0;
|
|
888
|
-
for (let d = 0; d < unrolledDim; d += 8) {
|
|
889
|
-
sum0 += query[qOffset + d] * key[kOffset + d];
|
|
890
|
-
sum1 += query[qOffset + d + 1] * key[kOffset + d + 1];
|
|
891
|
-
sum2 += query[qOffset + d + 2] * key[kOffset + d + 2];
|
|
892
|
-
sum3 += query[qOffset + d + 3] * key[kOffset + d + 3];
|
|
893
|
-
sum4 += query[qOffset + d + 4] * key[kOffset + d + 4];
|
|
894
|
-
sum5 += query[qOffset + d + 5] * key[kOffset + d + 5];
|
|
895
|
-
sum6 += query[qOffset + d + 6] * key[kOffset + d + 6];
|
|
896
|
-
sum7 += query[qOffset + d + 7] * key[kOffset + d + 7];
|
|
897
|
-
}
|
|
898
|
-
for (let d = unrolledDim; d < dim; d++) {
|
|
899
|
-
sum0 += query[qOffset + d] * key[kOffset + d];
|
|
900
|
-
}
|
|
901
|
-
const score = ((sum0 + sum1) + (sum2 + sum3) + (sum4 + sum5) + (sum6 + sum7)) * scale;
|
|
902
|
-
this.scoresBuffer[qi * kBlockSize + ki] = score;
|
|
903
|
-
}
|
|
904
|
-
}
|
|
905
|
-
}
|
|
906
|
-
/**
|
|
907
|
-
* Online softmax update with output accumulation
|
|
908
|
-
* This is the core of flash attention's memory efficiency
|
|
909
|
-
*/
|
|
910
|
-
updateOnlineSoftmax(value, qBlockSize, kvBlockSize, kvBlockStart, dim) {
|
|
911
|
-
for (let qi = 0; qi < qBlockSize; qi++) {
|
|
912
|
-
// Find new max
|
|
913
|
-
let newMax = this.maxBuffer[qi];
|
|
914
|
-
for (let ki = 0; ki < kvBlockSize; ki++) {
|
|
915
|
-
const score = this.scoresBuffer[qi * kvBlockSize + ki];
|
|
916
|
-
if (score > newMax)
|
|
917
|
-
newMax = score;
|
|
918
|
-
}
|
|
919
|
-
// Compute scaling factor for existing values
|
|
920
|
-
const oldMax = this.maxBuffer[qi];
|
|
921
|
-
const rescale = Math.exp(oldMax - newMax);
|
|
922
|
-
// Update running sum with rescaling
|
|
923
|
-
let newSum = this.sumBuffer[qi] * rescale;
|
|
924
|
-
// Compute exp scores and accumulate
|
|
925
|
-
const localOffset = qi * dim;
|
|
926
|
-
for (let ki = 0; ki < kvBlockSize; ki++) {
|
|
927
|
-
const expScore = Math.exp(this.scoresBuffer[qi * kvBlockSize + ki] - newMax);
|
|
928
|
-
this.expBuffer[qi * kvBlockSize + ki] = expScore;
|
|
929
|
-
newSum += expScore;
|
|
930
|
-
}
|
|
931
|
-
// Rescale existing output
|
|
932
|
-
if (rescale !== 1.0) {
|
|
933
|
-
const unrolledDim = dim - (dim % 8);
|
|
934
|
-
for (let d = 0; d < unrolledDim; d += 8) {
|
|
935
|
-
this.outputBuffer[localOffset + d] *= rescale;
|
|
936
|
-
this.outputBuffer[localOffset + d + 1] *= rescale;
|
|
937
|
-
this.outputBuffer[localOffset + d + 2] *= rescale;
|
|
938
|
-
this.outputBuffer[localOffset + d + 3] *= rescale;
|
|
939
|
-
this.outputBuffer[localOffset + d + 4] *= rescale;
|
|
940
|
-
this.outputBuffer[localOffset + d + 5] *= rescale;
|
|
941
|
-
this.outputBuffer[localOffset + d + 6] *= rescale;
|
|
942
|
-
this.outputBuffer[localOffset + d + 7] *= rescale;
|
|
943
|
-
}
|
|
944
|
-
for (let d = unrolledDim; d < dim; d++) {
|
|
945
|
-
this.outputBuffer[localOffset + d] *= rescale;
|
|
946
|
-
}
|
|
947
|
-
}
|
|
948
|
-
// Add new weighted values
|
|
949
|
-
for (let ki = 0; ki < kvBlockSize; ki++) {
|
|
950
|
-
const weight = this.expBuffer[qi * kvBlockSize + ki];
|
|
951
|
-
const vOffset = (kvBlockStart + ki) * dim;
|
|
952
|
-
// 8x unrolled weighted add
|
|
953
|
-
const unrolledDim = dim - (dim % 8);
|
|
954
|
-
for (let d = 0; d < unrolledDim; d += 8) {
|
|
955
|
-
this.outputBuffer[localOffset + d] += weight * value[vOffset + d];
|
|
956
|
-
this.outputBuffer[localOffset + d + 1] += weight * value[vOffset + d + 1];
|
|
957
|
-
this.outputBuffer[localOffset + d + 2] += weight * value[vOffset + d + 2];
|
|
958
|
-
this.outputBuffer[localOffset + d + 3] += weight * value[vOffset + d + 3];
|
|
959
|
-
this.outputBuffer[localOffset + d + 4] += weight * value[vOffset + d + 4];
|
|
960
|
-
this.outputBuffer[localOffset + d + 5] += weight * value[vOffset + d + 5];
|
|
961
|
-
this.outputBuffer[localOffset + d + 6] += weight * value[vOffset + d + 6];
|
|
962
|
-
this.outputBuffer[localOffset + d + 7] += weight * value[vOffset + d + 7];
|
|
963
|
-
}
|
|
964
|
-
for (let d = unrolledDim; d < dim; d++) {
|
|
965
|
-
this.outputBuffer[localOffset + d] += weight * value[vOffset + d];
|
|
966
|
-
}
|
|
967
|
-
}
|
|
968
|
-
// Update max and sum
|
|
969
|
-
this.maxBuffer[qi] = newMax;
|
|
970
|
-
this.sumBuffer[qi] = newSum;
|
|
971
|
-
}
|
|
972
|
-
}
|
|
973
|
-
/**
|
|
974
|
-
* Batch forward for processing multiple sequences
|
|
975
|
-
*/
|
|
976
|
-
batchForward(queries, keys, values, seqLens, dim, numHeads = 8) {
|
|
977
|
-
const outputs = [];
|
|
978
|
-
const allScores = [];
|
|
979
|
-
for (let i = 0; i < queries.length; i++) {
|
|
980
|
-
const { output, attentionScores } = this.forward(queries[i], keys[i], values[i], seqLens[i], dim, numHeads);
|
|
981
|
-
outputs.push(output);
|
|
982
|
-
allScores.push(attentionScores);
|
|
983
|
-
}
|
|
984
|
-
return { outputs, attentionScores: allScores };
|
|
985
|
-
}
|
|
986
|
-
/**
|
|
987
|
-
* Backward pass for gradient computation
|
|
988
|
-
* Computes dQ, dK, dV from dOutput using the attention scores from forward pass
|
|
989
|
-
*
|
|
990
|
-
* Forward pass recap:
|
|
991
|
-
* S = Q @ K^T / sqrt(d) (scaled dot-product scores)
|
|
992
|
-
* A = softmax(S) (attention weights)
|
|
993
|
-
* O = A @ V (output)
|
|
994
|
-
*
|
|
995
|
-
* Backward pass:
|
|
996
|
-
* dV = A^T @ dO (gradient w.r.t. values)
|
|
997
|
-
* dA = dO @ V^T (gradient through output)
|
|
998
|
-
* dS = A * (dA - sum(dA * A, axis=-1, keepdims=True)) (softmax backward)
|
|
999
|
-
* dS = dS / sqrt(d) (apply scaling)
|
|
1000
|
-
* dQ = dS @ K (gradient w.r.t. queries)
|
|
1001
|
-
* dK = dS^T @ Q (gradient w.r.t. keys)
|
|
1002
|
-
*/
|
|
1003
|
-
backward(dOutput, query, key, value, attentionScores, seqLen, dim) {
|
|
1004
|
-
// Validate inputs
|
|
1005
|
-
validateFloat32Array(dOutput, 'dOutput');
|
|
1006
|
-
validateFloat32Array(query, 'query');
|
|
1007
|
-
validateFloat32Array(key, 'key');
|
|
1008
|
-
validateFloat32Array(value, 'value');
|
|
1009
|
-
validateFloat32Array(attentionScores, 'attentionScores');
|
|
1010
|
-
validateSeqLength(seqLen, 'seqLen');
|
|
1011
|
-
validateDimension(dim, 'dim');
|
|
1012
|
-
const dQuery = globalBufferPool.acquire(seqLen * dim);
|
|
1013
|
-
const dKey = globalBufferPool.acquire(seqLen * dim);
|
|
1014
|
-
const dValue = globalBufferPool.acquire(seqLen * dim);
|
|
1015
|
-
// Initialize gradients to zero
|
|
1016
|
-
dQuery.fill(0);
|
|
1017
|
-
dKey.fill(0);
|
|
1018
|
-
dValue.fill(0);
|
|
1019
|
-
// Scaling factor (must match forward pass)
|
|
1020
|
-
const numHeads = 8; // Default from forward
|
|
1021
|
-
const headDim = dim / numHeads;
|
|
1022
|
-
const scale = 1.0 / Math.sqrt(headDim);
|
|
1023
|
-
// First: Normalize attention scores to get attention weights A
|
|
1024
|
-
// attentionScores contains the raw scores S, we need to apply softmax
|
|
1025
|
-
// In the forward pass, scores were stored after softmax, so use them directly
|
|
1026
|
-
// But the scores buffer may contain raw scores - we recompute softmax for numerical stability
|
|
1027
|
-
// Allocate temporary buffer for attention weights (normalized)
|
|
1028
|
-
const attentionWeights = globalBufferPool.acquire(seqLen * seqLen);
|
|
1029
|
-
// Apply softmax row-wise to get attention weights A
|
|
1030
|
-
for (let i = 0; i < seqLen; i++) {
|
|
1031
|
-
const rowOffset = i * seqLen;
|
|
1032
|
-
// Find max for numerical stability
|
|
1033
|
-
let maxScore = -Infinity;
|
|
1034
|
-
for (let j = 0; j < seqLen; j++) {
|
|
1035
|
-
const score = attentionScores[rowOffset + j];
|
|
1036
|
-
if (score > maxScore)
|
|
1037
|
-
maxScore = score;
|
|
1038
|
-
}
|
|
1039
|
-
// Compute exp and sum
|
|
1040
|
-
let sumExp = 0;
|
|
1041
|
-
for (let j = 0; j < seqLen; j++) {
|
|
1042
|
-
const expVal = Math.exp(attentionScores[rowOffset + j] - maxScore);
|
|
1043
|
-
attentionWeights[rowOffset + j] = expVal;
|
|
1044
|
-
sumExp += expVal;
|
|
1045
|
-
}
|
|
1046
|
-
// Normalize
|
|
1047
|
-
const invSum = 1.0 / (sumExp + EPSILON);
|
|
1048
|
-
for (let j = 0; j < seqLen; j++) {
|
|
1049
|
-
attentionWeights[rowOffset + j] *= invSum;
|
|
1050
|
-
}
|
|
1051
|
-
}
|
|
1052
|
-
// Step 1: Compute dV = A^T @ dO
|
|
1053
|
-
// dV[j, d] = sum_i A[i, j] * dO[i, d]
|
|
1054
|
-
for (let j = 0; j < seqLen; j++) {
|
|
1055
|
-
const dVOffset = j * dim;
|
|
1056
|
-
for (let i = 0; i < seqLen; i++) {
|
|
1057
|
-
const aWeight = attentionWeights[i * seqLen + j]; // A^T[j, i] = A[i, j]
|
|
1058
|
-
const dOOffset = i * dim;
|
|
1059
|
-
// 8x unrolled accumulation
|
|
1060
|
-
const unrolledDim = dim - (dim % 8);
|
|
1061
|
-
for (let d = 0; d < unrolledDim; d += 8) {
|
|
1062
|
-
dValue[dVOffset + d] += aWeight * dOutput[dOOffset + d];
|
|
1063
|
-
dValue[dVOffset + d + 1] += aWeight * dOutput[dOOffset + d + 1];
|
|
1064
|
-
dValue[dVOffset + d + 2] += aWeight * dOutput[dOOffset + d + 2];
|
|
1065
|
-
dValue[dVOffset + d + 3] += aWeight * dOutput[dOOffset + d + 3];
|
|
1066
|
-
dValue[dVOffset + d + 4] += aWeight * dOutput[dOOffset + d + 4];
|
|
1067
|
-
dValue[dVOffset + d + 5] += aWeight * dOutput[dOOffset + d + 5];
|
|
1068
|
-
dValue[dVOffset + d + 6] += aWeight * dOutput[dOOffset + d + 6];
|
|
1069
|
-
dValue[dVOffset + d + 7] += aWeight * dOutput[dOOffset + d + 7];
|
|
1070
|
-
}
|
|
1071
|
-
for (let d = unrolledDim; d < dim; d++) {
|
|
1072
|
-
dValue[dVOffset + d] += aWeight * dOutput[dOOffset + d];
|
|
1073
|
-
}
|
|
1074
|
-
}
|
|
1075
|
-
}
|
|
1076
|
-
// Step 2: Compute dA = dO @ V^T
|
|
1077
|
-
// dA[i, j] = sum_d dO[i, d] * V[j, d]
|
|
1078
|
-
const dAttention = globalBufferPool.acquire(seqLen * seqLen);
|
|
1079
|
-
dAttention.fill(0);
|
|
1080
|
-
for (let i = 0; i < seqLen; i++) {
|
|
1081
|
-
const dOOffset = i * dim;
|
|
1082
|
-
const dARowOffset = i * seqLen;
|
|
1083
|
-
for (let j = 0; j < seqLen; j++) {
|
|
1084
|
-
const vOffset = j * dim;
|
|
1085
|
-
let dotProduct = 0;
|
|
1086
|
-
// 8x unrolled dot product
|
|
1087
|
-
const unrolledDim = dim - (dim % 8);
|
|
1088
|
-
let sum0 = 0, sum1 = 0, sum2 = 0, sum3 = 0;
|
|
1089
|
-
let sum4 = 0, sum5 = 0, sum6 = 0, sum7 = 0;
|
|
1090
|
-
for (let d = 0; d < unrolledDim; d += 8) {
|
|
1091
|
-
sum0 += dOutput[dOOffset + d] * value[vOffset + d];
|
|
1092
|
-
sum1 += dOutput[dOOffset + d + 1] * value[vOffset + d + 1];
|
|
1093
|
-
sum2 += dOutput[dOOffset + d + 2] * value[vOffset + d + 2];
|
|
1094
|
-
sum3 += dOutput[dOOffset + d + 3] * value[vOffset + d + 3];
|
|
1095
|
-
sum4 += dOutput[dOOffset + d + 4] * value[vOffset + d + 4];
|
|
1096
|
-
sum5 += dOutput[dOOffset + d + 5] * value[vOffset + d + 5];
|
|
1097
|
-
sum6 += dOutput[dOOffset + d + 6] * value[vOffset + d + 6];
|
|
1098
|
-
sum7 += dOutput[dOOffset + d + 7] * value[vOffset + d + 7];
|
|
1099
|
-
}
|
|
1100
|
-
dotProduct = (sum0 + sum1) + (sum2 + sum3) + (sum4 + sum5) + (sum6 + sum7);
|
|
1101
|
-
for (let d = unrolledDim; d < dim; d++) {
|
|
1102
|
-
dotProduct += dOutput[dOOffset + d] * value[vOffset + d];
|
|
1103
|
-
}
|
|
1104
|
-
dAttention[dARowOffset + j] = dotProduct;
|
|
1105
|
-
}
|
|
1106
|
-
}
|
|
1107
|
-
// Step 3: Compute dS = softmax_backward(dA, A)
|
|
1108
|
-
// For softmax: dS_ij = A_ij * (dA_ij - sum_k(A_ik * dA_ik))
|
|
1109
|
-
const dScores = globalBufferPool.acquire(seqLen * seqLen);
|
|
1110
|
-
for (let i = 0; i < seqLen; i++) {
|
|
1111
|
-
const rowOffset = i * seqLen;
|
|
1112
|
-
// Compute sum_k(A_ik * dA_ik) for this row
|
|
1113
|
-
let sumAdA = 0;
|
|
1114
|
-
for (let k = 0; k < seqLen; k++) {
|
|
1115
|
-
sumAdA += attentionWeights[rowOffset + k] * dAttention[rowOffset + k];
|
|
1116
|
-
}
|
|
1117
|
-
// Compute dS_ij = A_ij * (dA_ij - sumAdA) * scale
|
|
1118
|
-
for (let j = 0; j < seqLen; j++) {
|
|
1119
|
-
const idx = rowOffset + j;
|
|
1120
|
-
dScores[idx] = attentionWeights[idx] * (dAttention[idx] - sumAdA) * scale;
|
|
1121
|
-
}
|
|
1122
|
-
}
|
|
1123
|
-
// Step 4: Compute dQ = dS @ K
|
|
1124
|
-
// dQ[i, d] = sum_j dS[i, j] * K[j, d]
|
|
1125
|
-
for (let i = 0; i < seqLen; i++) {
|
|
1126
|
-
const dQOffset = i * dim;
|
|
1127
|
-
const dSRowOffset = i * seqLen;
|
|
1128
|
-
for (let j = 0; j < seqLen; j++) {
|
|
1129
|
-
const dSValue = dScores[dSRowOffset + j];
|
|
1130
|
-
const kOffset = j * dim;
|
|
1131
|
-
// 8x unrolled accumulation
|
|
1132
|
-
const unrolledDim = dim - (dim % 8);
|
|
1133
|
-
for (let d = 0; d < unrolledDim; d += 8) {
|
|
1134
|
-
dQuery[dQOffset + d] += dSValue * key[kOffset + d];
|
|
1135
|
-
dQuery[dQOffset + d + 1] += dSValue * key[kOffset + d + 1];
|
|
1136
|
-
dQuery[dQOffset + d + 2] += dSValue * key[kOffset + d + 2];
|
|
1137
|
-
dQuery[dQOffset + d + 3] += dSValue * key[kOffset + d + 3];
|
|
1138
|
-
dQuery[dQOffset + d + 4] += dSValue * key[kOffset + d + 4];
|
|
1139
|
-
dQuery[dQOffset + d + 5] += dSValue * key[kOffset + d + 5];
|
|
1140
|
-
dQuery[dQOffset + d + 6] += dSValue * key[kOffset + d + 6];
|
|
1141
|
-
dQuery[dQOffset + d + 7] += dSValue * key[kOffset + d + 7];
|
|
1142
|
-
}
|
|
1143
|
-
for (let d = unrolledDim; d < dim; d++) {
|
|
1144
|
-
dQuery[dQOffset + d] += dSValue * key[kOffset + d];
|
|
1145
|
-
}
|
|
1146
|
-
}
|
|
1147
|
-
}
|
|
1148
|
-
// Step 5: Compute dK = dS^T @ Q
|
|
1149
|
-
// dK[j, d] = sum_i dS[i, j] * Q[i, d]
|
|
1150
|
-
for (let j = 0; j < seqLen; j++) {
|
|
1151
|
-
const dKOffset = j * dim;
|
|
1152
|
-
for (let i = 0; i < seqLen; i++) {
|
|
1153
|
-
const dSValue = dScores[i * seqLen + j]; // dS^T[j, i] = dS[i, j]
|
|
1154
|
-
const qOffset = i * dim;
|
|
1155
|
-
// 8x unrolled accumulation
|
|
1156
|
-
const unrolledDim = dim - (dim % 8);
|
|
1157
|
-
for (let d = 0; d < unrolledDim; d += 8) {
|
|
1158
|
-
dKey[dKOffset + d] += dSValue * query[qOffset + d];
|
|
1159
|
-
dKey[dKOffset + d + 1] += dSValue * query[qOffset + d + 1];
|
|
1160
|
-
dKey[dKOffset + d + 2] += dSValue * query[qOffset + d + 2];
|
|
1161
|
-
dKey[dKOffset + d + 3] += dSValue * query[qOffset + d + 3];
|
|
1162
|
-
dKey[dKOffset + d + 4] += dSValue * query[qOffset + d + 4];
|
|
1163
|
-
dKey[dKOffset + d + 5] += dSValue * query[qOffset + d + 5];
|
|
1164
|
-
dKey[dKOffset + d + 6] += dSValue * query[qOffset + d + 6];
|
|
1165
|
-
dKey[dKOffset + d + 7] += dSValue * query[qOffset + d + 7];
|
|
1166
|
-
}
|
|
1167
|
-
for (let d = unrolledDim; d < dim; d++) {
|
|
1168
|
-
dKey[dKOffset + d] += dSValue * query[qOffset + d];
|
|
1169
|
-
}
|
|
1170
|
-
}
|
|
1171
|
-
}
|
|
1172
|
-
// Release temporary buffers
|
|
1173
|
-
globalBufferPool.release(attentionWeights);
|
|
1174
|
-
globalBufferPool.release(dAttention);
|
|
1175
|
-
globalBufferPool.release(dScores);
|
|
1176
|
-
return { dQuery, dKey, dValue };
|
|
1177
|
-
}
|
|
1178
|
-
/**
|
|
1179
|
-
* Release buffers back to pool
|
|
1180
|
-
*/
|
|
1181
|
-
releaseBuffer(buffer) {
|
|
1182
|
-
globalBufferPool.release(buffer);
|
|
1183
|
-
}
|
|
1184
|
-
}
|
|
1185
|
-
// ============================================================================
|
|
1186
|
-
// Batch Multi-Head Attention
|
|
1187
|
-
// ============================================================================
|
|
1188
|
-
/**
|
|
1189
|
-
* Batch multi-head attention for processing multiple queries efficiently
|
|
1190
|
-
* Combines optimized MHA with batch processing
|
|
1191
|
-
*/
|
|
1192
|
-
export function batchMultiHeadAttention(attention, queries, keys, values, masks) {
|
|
1193
|
-
return attention.batchForward(queries, keys, values, masks);
|
|
1194
|
-
}
|
|
1195
|
-
/**
|
|
1196
|
-
* Linear Attention (fallback)
|
|
1197
|
-
*
|
|
1198
|
-
* O(n) complexity approximation of attention
|
|
1199
|
-
*/
|
|
1200
|
-
export class LinearAttention {
|
|
1201
|
-
hiddenDim;
|
|
1202
|
-
featureMap;
|
|
1203
|
-
constructor(config) {
|
|
1204
|
-
this.hiddenDim = config.hiddenDim;
|
|
1205
|
-
// ELU feature map
|
|
1206
|
-
this.featureMap = (x) => (x > 0 ? x : Math.exp(x) - 1);
|
|
1207
|
-
}
|
|
1208
|
-
forward(query, key, value) {
|
|
1209
|
-
const seqLen = query.length;
|
|
1210
|
-
const dim = value[0].length;
|
|
1211
|
-
// Apply feature map
|
|
1212
|
-
const queryMapped = query.map(q => q.map(this.featureMap));
|
|
1213
|
-
const keyMapped = key.map(k => k.map(this.featureMap));
|
|
1214
|
-
// Compute K^T V (dimension: [dim, valueDim])
|
|
1215
|
-
const ktv = Array.from({ length: this.hiddenDim }, () => Array(dim).fill(0));
|
|
1216
|
-
for (let i = 0; i < seqLen; i++) {
|
|
1217
|
-
for (let d1 = 0; d1 < this.hiddenDim; d1++) {
|
|
1218
|
-
for (let d2 = 0; d2 < dim; d2++) {
|
|
1219
|
-
ktv[d1][d2] += keyMapped[i][d1] * value[i][d2];
|
|
1220
|
-
}
|
|
1221
|
-
}
|
|
1222
|
-
}
|
|
1223
|
-
// Compute Q (K^T V)
|
|
1224
|
-
const output = [];
|
|
1225
|
-
for (let i = 0; i < seqLen; i++) {
|
|
1226
|
-
const row = [];
|
|
1227
|
-
for (let d2 = 0; d2 < dim; d2++) {
|
|
1228
|
-
let sum = 0;
|
|
1229
|
-
for (let d1 = 0; d1 < this.hiddenDim; d1++) {
|
|
1230
|
-
sum += queryMapped[i][d1] * ktv[d1][d2];
|
|
1231
|
-
}
|
|
1232
|
-
row.push(sum);
|
|
1233
|
-
}
|
|
1234
|
-
// Normalize
|
|
1235
|
-
const normSum = queryMapped[i].reduce((a, b) => a + b, 0);
|
|
1236
|
-
output.push(row.map(v => v / (normSum + 1e-8)));
|
|
1237
|
-
}
|
|
1238
|
-
return { output };
|
|
1239
|
-
}
|
|
1240
|
-
}
|
|
1241
|
-
/**
|
|
1242
|
-
* Hyperbolic Attention (simplified fallback)
|
|
1243
|
-
*
|
|
1244
|
-
* Approximation using hyperbolic geometry
|
|
1245
|
-
*/
|
|
1246
|
-
export class HyperbolicAttention {
|
|
1247
|
-
hiddenDim;
|
|
1248
|
-
curvature;
|
|
1249
|
-
constructor(config) {
|
|
1250
|
-
this.hiddenDim = config.hiddenDim;
|
|
1251
|
-
this.curvature = -1.0; // Poincaré ball curvature
|
|
1252
|
-
}
|
|
1253
|
-
forward(query, key, value) {
|
|
1254
|
-
// Hyperbolic distance (simplified)
|
|
1255
|
-
const distance = this.hyperbolicDistance(query, key);
|
|
1256
|
-
// Attention weight based on hyperbolic distance
|
|
1257
|
-
const weight = Math.exp(-distance);
|
|
1258
|
-
// Weighted value
|
|
1259
|
-
const output = value.map(v => v * weight);
|
|
1260
|
-
return { output, distance };
|
|
1261
|
-
}
|
|
1262
|
-
hyperbolicDistance(a, b) {
|
|
1263
|
-
// Simplified hyperbolic distance in Poincare ball
|
|
1264
|
-
let normDiffSq = 0;
|
|
1265
|
-
for (let i = 0; i < a.length; i++) {
|
|
1266
|
-
const diff = a[i] - b[i];
|
|
1267
|
-
normDiffSq += diff * diff;
|
|
1268
|
-
}
|
|
1269
|
-
const normASq = a.reduce((sum, v) => sum + v * v, 0);
|
|
1270
|
-
const normBSq = b.reduce((sum, v) => sum + v * v, 0);
|
|
1271
|
-
const numerator = normDiffSq;
|
|
1272
|
-
const denominator = (1 - normASq) * (1 - normBSq);
|
|
1273
|
-
// Guard against division by zero and negative values
|
|
1274
|
-
if (denominator <= EPSILON) {
|
|
1275
|
-
return Infinity; // Points are on or outside the boundary
|
|
1276
|
-
}
|
|
1277
|
-
const acoshArg = 1 + (2 * numerator) / denominator;
|
|
1278
|
-
// Guard against invalid acosh argument (must be >= 1)
|
|
1279
|
-
if (!Number.isFinite(acoshArg) || acoshArg < 1) {
|
|
1280
|
-
return 0; // Return 0 for identical points or numerical issues
|
|
1281
|
-
}
|
|
1282
|
-
return Math.acosh(acoshArg);
|
|
1283
|
-
}
|
|
1284
|
-
}
|
|
1285
|
-
/**
|
|
1286
|
-
* MoE (Mixture of Experts) Attention (fallback)
|
|
1287
|
-
*
|
|
1288
|
-
* Routes to different expert attention modules
|
|
1289
|
-
*/
|
|
1290
|
-
export class MoEAttention {
|
|
1291
|
-
experts;
|
|
1292
|
-
numExperts;
|
|
1293
|
-
gatingWeights;
|
|
1294
|
-
constructor(config) {
|
|
1295
|
-
this.numExperts = config.numExperts || 4;
|
|
1296
|
-
this.experts = Array.from({ length: this.numExperts }, () => new MultiHeadAttention(config));
|
|
1297
|
-
// Initialize gating network weights
|
|
1298
|
-
this.gatingWeights = Array.from({ length: this.numExperts }, () => Array.from({ length: config.hiddenDim }, () => (Math.random() - 0.5) * 0.1));
|
|
1299
|
-
}
|
|
1300
|
-
forward(query, key, value, topK = 2) {
|
|
1301
|
-
// Compute gating scores
|
|
1302
|
-
const gatingScores = this.gatingWeights.map(weights => {
|
|
1303
|
-
let score = 0;
|
|
1304
|
-
for (let i = 0; i < query.length; i++) {
|
|
1305
|
-
score += query[i] * weights[i];
|
|
1306
|
-
}
|
|
1307
|
-
return score;
|
|
1308
|
-
});
|
|
1309
|
-
// Softmax over top-K experts
|
|
1310
|
-
const expScores = gatingScores.map(s => Math.exp(s));
|
|
1311
|
-
const sumExp = expScores.reduce((a, b) => a + b, 0);
|
|
1312
|
-
const expertWeights = expScores.map(e => e / sumExp);
|
|
1313
|
-
// Get top-K experts
|
|
1314
|
-
const expertIndices = expertWeights
|
|
1315
|
-
.map((weight, idx) => ({ weight, idx }))
|
|
1316
|
-
.sort((a, b) => b.weight - a.weight)
|
|
1317
|
-
.slice(0, topK);
|
|
1318
|
-
// Weighted combination of expert outputs
|
|
1319
|
-
const output = new Array(query.length).fill(0);
|
|
1320
|
-
for (const { weight, idx } of expertIndices) {
|
|
1321
|
-
const expertOutput = this.experts[idx].forward(query, key, value).output;
|
|
1322
|
-
for (let i = 0; i < output.length; i++) {
|
|
1323
|
-
output[i] += weight * expertOutput[i];
|
|
1324
|
-
}
|
|
1325
|
-
}
|
|
1326
|
-
return { output, expertWeights };
|
|
1327
|
-
}
|
|
1328
|
-
}
|
|
1329
|
-
/**
|
|
1330
|
-
* Check if native attention is available
|
|
1331
|
-
*/
|
|
1332
|
-
export function isNativeAttentionAvailable() {
|
|
1333
|
-
try {
|
|
1334
|
-
// eslint-disable-next-line @typescript-eslint/no-require-imports, @typescript-eslint/no-var-requires -- dynamic native module probe
|
|
1335
|
-
const attention = require('@ruvector/attention');
|
|
1336
|
-
// Try a simple operation
|
|
1337
|
-
attention.flashAttention(new Float32Array([1, 0]), new Float32Array([1, 0]), new Float32Array([1, 0]), 1);
|
|
1338
|
-
return true;
|
|
1339
|
-
}
|
|
1340
|
-
catch {
|
|
1341
|
-
return false;
|
|
1342
|
-
}
|
|
1343
|
-
}
|
|
1344
|
-
/**
|
|
1345
|
-
* Factory function to create appropriate attention module
|
|
1346
|
-
*/
|
|
1347
|
-
export function createAttention(type, config) {
|
|
1348
|
-
switch (type) {
|
|
1349
|
-
case 'multi-head':
|
|
1350
|
-
return new MultiHeadAttention(config);
|
|
1351
|
-
case 'flash':
|
|
1352
|
-
return new FlashAttention(config);
|
|
1353
|
-
case 'linear':
|
|
1354
|
-
return new LinearAttention(config);
|
|
1355
|
-
case 'hyperbolic':
|
|
1356
|
-
return new HyperbolicAttention(config);
|
|
1357
|
-
case 'moe':
|
|
1358
|
-
return new MoEAttention(config);
|
|
1359
|
-
default:
|
|
1360
|
-
return new MultiHeadAttention(config);
|
|
1361
|
-
}
|
|
1362
|
-
}
|
|
1363
|
-
/**
|
|
1364
|
-
* Factory function to create optimized attention modules
|
|
1365
|
-
*/
|
|
1366
|
-
export function createAttentionOptimized(type, config) {
|
|
1367
|
-
switch (type) {
|
|
1368
|
-
case 'multi-head':
|
|
1369
|
-
return new MultiHeadAttentionOptimized(config);
|
|
1370
|
-
case 'flash':
|
|
1371
|
-
return new FlashAttentionOptimized(config);
|
|
1372
|
-
default:
|
|
1373
|
-
return new MultiHeadAttentionOptimized(config);
|
|
1374
|
-
}
|
|
1375
|
-
}
|
|
1376
|
-
// ============================================================================
|
|
1377
|
-
// Utility Functions for TypedArray Conversion
|
|
1378
|
-
// ============================================================================
|
|
1379
|
-
/**
|
|
1380
|
-
* Convert number[] to Float32Array
|
|
1381
|
-
*/
|
|
1382
|
-
export function toFloat32Array(arr) {
|
|
1383
|
-
return new Float32Array(arr);
|
|
1384
|
-
}
|
|
1385
|
-
/**
|
|
1386
|
-
* Convert Float32Array to number[]
|
|
1387
|
-
*/
|
|
1388
|
-
export function toNumberArray(arr) {
|
|
1389
|
-
return Array.from(arr);
|
|
1390
|
-
}
|
|
1391
|
-
/**
|
|
1392
|
-
* Convert 2D number[][] to flattened Float32Array
|
|
1393
|
-
*/
|
|
1394
|
-
export function flatten2D(arr) {
|
|
1395
|
-
const totalLen = arr.reduce((sum, row) => sum + row.length, 0);
|
|
1396
|
-
const result = new Float32Array(totalLen);
|
|
1397
|
-
let offset = 0;
|
|
1398
|
-
for (const row of arr) {
|
|
1399
|
-
result.set(row, offset);
|
|
1400
|
-
offset += row.length;
|
|
1401
|
-
}
|
|
1402
|
-
return result;
|
|
1403
|
-
}
|
|
1404
|
-
/**
|
|
1405
|
-
* Unflatten Float32Array to 2D array
|
|
1406
|
-
*/
|
|
1407
|
-
export function unflatten2D(arr, rows, cols) {
|
|
1408
|
-
const result = [];
|
|
1409
|
-
for (let i = 0; i < rows; i++) {
|
|
1410
|
-
result.push(Array.from(arr.slice(i * cols, (i + 1) * cols)));
|
|
1411
|
-
}
|
|
1412
|
-
return result;
|
|
1413
|
-
}
|
|
1414
|
-
// ============================================================================
|
|
1415
|
-
// Buffer Pool Export for External Memory Management
|
|
1416
|
-
// ============================================================================
|
|
1417
|
-
/**
|
|
1418
|
-
* Get the global buffer pool for external memory management
|
|
1419
|
-
*/
|
|
1420
|
-
export function getBufferPool() {
|
|
1421
|
-
return {
|
|
1422
|
-
acquire: (size) => globalBufferPool.acquire(size),
|
|
1423
|
-
release: (buffer) => globalBufferPool.release(buffer),
|
|
1424
|
-
clear: () => globalBufferPool.clear(),
|
|
1425
|
-
};
|
|
1426
|
-
}
|
|
1427
|
-
// ============================================================================
|
|
1428
|
-
// Performance Benchmarking Utilities
|
|
1429
|
-
// ============================================================================
|
|
1430
|
-
/**
|
|
1431
|
-
* Get high-resolution time (cross-platform)
|
|
1432
|
-
*/
|
|
1433
|
-
function getTime() {
|
|
1434
|
-
if (typeof performance !== 'undefined' && performance.now) {
|
|
1435
|
-
return performance.now();
|
|
1436
|
-
}
|
|
1437
|
-
return Date.now();
|
|
1438
|
-
}
|
|
1439
|
-
/**
|
|
1440
|
-
* Benchmark attention implementation
|
|
1441
|
-
*/
|
|
1442
|
-
export function benchmarkAttention(attention, config) {
|
|
1443
|
-
const { seqLen, dim, iterations, numHeads = 8 } = config;
|
|
1444
|
-
// Create test data
|
|
1445
|
-
const query = new Float32Array(seqLen * dim);
|
|
1446
|
-
const key = new Float32Array(seqLen * dim);
|
|
1447
|
-
const value = new Float32Array(seqLen * dim);
|
|
1448
|
-
// Initialize with random values
|
|
1449
|
-
for (let i = 0; i < query.length; i++) {
|
|
1450
|
-
query[i] = Math.random() - 0.5;
|
|
1451
|
-
key[i] = Math.random() - 0.5;
|
|
1452
|
-
value[i] = Math.random() - 0.5;
|
|
1453
|
-
}
|
|
1454
|
-
// Warmup
|
|
1455
|
-
if (attention instanceof FlashAttentionOptimized) {
|
|
1456
|
-
attention.forward(query, key, value, seqLen, dim, numHeads);
|
|
1457
|
-
}
|
|
1458
|
-
else if (attention instanceof MultiHeadAttentionOptimized) {
|
|
1459
|
-
const q1 = query.slice(0, dim);
|
|
1460
|
-
const k1 = key.slice(0, dim);
|
|
1461
|
-
const v1 = value.slice(0, dim);
|
|
1462
|
-
attention.forward(q1, k1, v1);
|
|
1463
|
-
}
|
|
1464
|
-
// Benchmark
|
|
1465
|
-
const startTime = getTime();
|
|
1466
|
-
for (let i = 0; i < iterations; i++) {
|
|
1467
|
-
if (attention instanceof FlashAttentionOptimized) {
|
|
1468
|
-
const { output } = attention.forward(query, key, value, seqLen, dim, numHeads);
|
|
1469
|
-
attention.releaseBuffer(output);
|
|
1470
|
-
}
|
|
1471
|
-
else if (attention instanceof MultiHeadAttentionOptimized) {
|
|
1472
|
-
const q1 = query.slice(0, dim);
|
|
1473
|
-
const k1 = key.slice(0, dim);
|
|
1474
|
-
const v1 = value.slice(0, dim);
|
|
1475
|
-
const { output } = attention.forward(q1, k1, v1);
|
|
1476
|
-
attention.releaseBuffer(output);
|
|
1477
|
-
}
|
|
1478
|
-
}
|
|
1479
|
-
const endTime = getTime();
|
|
1480
|
-
const totalTimeMs = endTime - startTime;
|
|
1481
|
-
return {
|
|
1482
|
-
avgTimeMs: totalTimeMs / iterations,
|
|
1483
|
-
opsPerSecond: (iterations * 1000) / totalTimeMs,
|
|
1484
|
-
memoryUsed: query.byteLength + key.byteLength + value.byteLength,
|
|
1485
|
-
};
|
|
1486
|
-
}
|
|
1487
|
-
//# sourceMappingURL=attention-fallbacks.js.map
|