@miller-tech/uap 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +888 -0
- package/dist/analyzers/index.d.ts +3 -0
- package/dist/analyzers/index.d.ts.map +1 -0
- package/dist/analyzers/index.js +684 -0
- package/dist/analyzers/index.js.map +1 -0
- package/dist/benchmarks/agents/naive-agent.d.ts +60 -0
- package/dist/benchmarks/agents/naive-agent.d.ts.map +1 -0
- package/dist/benchmarks/agents/naive-agent.js +144 -0
- package/dist/benchmarks/agents/naive-agent.js.map +1 -0
- package/dist/benchmarks/agents/uap-agent.d.ts +167 -0
- package/dist/benchmarks/agents/uap-agent.d.ts.map +1 -0
- package/dist/benchmarks/agents/uap-agent.js +437 -0
- package/dist/benchmarks/agents/uap-agent.js.map +1 -0
- package/dist/benchmarks/benchmark.d.ts +328 -0
- package/dist/benchmarks/benchmark.d.ts.map +1 -0
- package/dist/benchmarks/benchmark.js +112 -0
- package/dist/benchmarks/benchmark.js.map +1 -0
- package/dist/benchmarks/execution-verifier.d.ts +41 -0
- package/dist/benchmarks/execution-verifier.d.ts.map +1 -0
- package/dist/benchmarks/execution-verifier.js +340 -0
- package/dist/benchmarks/execution-verifier.js.map +1 -0
- package/dist/benchmarks/hierarchical-prompting.d.ts +37 -0
- package/dist/benchmarks/hierarchical-prompting.d.ts.map +1 -0
- package/dist/benchmarks/hierarchical-prompting.js +246 -0
- package/dist/benchmarks/hierarchical-prompting.js.map +1 -0
- package/dist/benchmarks/improved-benchmark.d.ts +89 -0
- package/dist/benchmarks/improved-benchmark.d.ts.map +1 -0
- package/dist/benchmarks/improved-benchmark.js +585 -0
- package/dist/benchmarks/improved-benchmark.js.map +1 -0
- package/dist/benchmarks/index.d.ts +11 -0
- package/dist/benchmarks/index.d.ts.map +1 -0
- package/dist/benchmarks/index.js +11 -0
- package/dist/benchmarks/index.js.map +1 -0
- package/dist/benchmarks/model-integration.d.ts +111 -0
- package/dist/benchmarks/model-integration.d.ts.map +1 -0
- package/dist/benchmarks/model-integration.js +904 -0
- package/dist/benchmarks/model-integration.js.map +1 -0
- package/dist/benchmarks/multi-turn-agent.d.ts +44 -0
- package/dist/benchmarks/multi-turn-agent.d.ts.map +1 -0
- package/dist/benchmarks/multi-turn-agent.js +254 -0
- package/dist/benchmarks/multi-turn-agent.js.map +1 -0
- package/dist/benchmarks/multi-turn-loop.d.ts +57 -0
- package/dist/benchmarks/multi-turn-loop.d.ts.map +1 -0
- package/dist/benchmarks/multi-turn-loop.js +167 -0
- package/dist/benchmarks/multi-turn-loop.js.map +1 -0
- package/dist/benchmarks/tasks.d.ts +19 -0
- package/dist/benchmarks/tasks.d.ts.map +1 -0
- package/dist/benchmarks/tasks.js +435 -0
- package/dist/benchmarks/tasks.js.map +1 -0
- package/dist/bin/cli.d.ts +3 -0
- package/dist/bin/cli.d.ts.map +1 -0
- package/dist/bin/cli.js +546 -0
- package/dist/bin/cli.js.map +1 -0
- package/dist/bin/llama-server-optimize.d.ts +18 -0
- package/dist/bin/llama-server-optimize.d.ts.map +1 -0
- package/dist/bin/llama-server-optimize.js +708 -0
- package/dist/bin/llama-server-optimize.js.map +1 -0
- package/dist/bin/policy.d.ts +3 -0
- package/dist/bin/policy.d.ts.map +1 -0
- package/dist/bin/policy.js +143 -0
- package/dist/bin/policy.js.map +1 -0
- package/dist/bin/tool-calls.d.ts +3 -0
- package/dist/bin/tool-calls.d.ts.map +1 -0
- package/dist/bin/tool-calls.js +4 -0
- package/dist/bin/tool-calls.js.map +1 -0
- package/dist/browser/index.d.ts +2 -0
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.js +2 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/web-browser.d.ts +30 -0
- package/dist/browser/web-browser.d.ts.map +1 -0
- package/dist/browser/web-browser.js +93 -0
- package/dist/browser/web-browser.js.map +1 -0
- package/dist/cli/agent.d.ts +20 -0
- package/dist/cli/agent.d.ts.map +1 -0
- package/dist/cli/agent.js +474 -0
- package/dist/cli/agent.js.map +1 -0
- package/dist/cli/analyze.d.ts +7 -0
- package/dist/cli/analyze.d.ts.map +1 -0
- package/dist/cli/analyze.js +103 -0
- package/dist/cli/analyze.js.map +1 -0
- package/dist/cli/completion-gates.d.ts +51 -0
- package/dist/cli/completion-gates.d.ts.map +1 -0
- package/dist/cli/completion-gates.js +201 -0
- package/dist/cli/completion-gates.js.map +1 -0
- package/dist/cli/compliance.d.ts +8 -0
- package/dist/cli/compliance.d.ts.map +1 -0
- package/dist/cli/compliance.js +509 -0
- package/dist/cli/compliance.js.map +1 -0
- package/dist/cli/coord.d.ts +7 -0
- package/dist/cli/coord.d.ts.map +1 -0
- package/dist/cli/coord.js +138 -0
- package/dist/cli/coord.js.map +1 -0
- package/dist/cli/dashboard.d.ts +21 -0
- package/dist/cli/dashboard.d.ts.map +1 -0
- package/dist/cli/dashboard.js +1508 -0
- package/dist/cli/dashboard.js.map +1 -0
- package/dist/cli/deploy.d.ts +19 -0
- package/dist/cli/deploy.d.ts.map +1 -0
- package/dist/cli/deploy.js +387 -0
- package/dist/cli/deploy.js.map +1 -0
- package/dist/cli/droids.d.ts +9 -0
- package/dist/cli/droids.d.ts.map +1 -0
- package/dist/cli/droids.js +227 -0
- package/dist/cli/droids.js.map +1 -0
- package/dist/cli/generate.d.ts +17 -0
- package/dist/cli/generate.d.ts.map +1 -0
- package/dist/cli/generate.js +432 -0
- package/dist/cli/generate.js.map +1 -0
- package/dist/cli/hooks.d.ts +9 -0
- package/dist/cli/hooks.d.ts.map +1 -0
- package/dist/cli/hooks.js +464 -0
- package/dist/cli/hooks.js.map +1 -0
- package/dist/cli/init.d.ts +12 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +364 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/mcp-router.d.ts +16 -0
- package/dist/cli/mcp-router.d.ts.map +1 -0
- package/dist/cli/mcp-router.js +143 -0
- package/dist/cli/mcp-router.js.map +1 -0
- package/dist/cli/memory.d.ts +24 -0
- package/dist/cli/memory.d.ts.map +1 -0
- package/dist/cli/memory.js +885 -0
- package/dist/cli/memory.js.map +1 -0
- package/dist/cli/model.d.ts +15 -0
- package/dist/cli/model.d.ts.map +1 -0
- package/dist/cli/model.js +290 -0
- package/dist/cli/model.js.map +1 -0
- package/dist/cli/patterns.d.ts +26 -0
- package/dist/cli/patterns.d.ts.map +1 -0
- package/dist/cli/patterns.js +862 -0
- package/dist/cli/patterns.js.map +1 -0
- package/dist/cli/rtk-validation.d.ts +9 -0
- package/dist/cli/rtk-validation.d.ts.map +1 -0
- package/dist/cli/rtk-validation.js +9 -0
- package/dist/cli/rtk-validation.js.map +1 -0
- package/dist/cli/rtk.d.ts +34 -0
- package/dist/cli/rtk.d.ts.map +1 -0
- package/dist/cli/rtk.js +401 -0
- package/dist/cli/rtk.js.map +1 -0
- package/dist/cli/schema-diff.d.ts +7 -0
- package/dist/cli/schema-diff.d.ts.map +1 -0
- package/dist/cli/schema-diff.js +11 -0
- package/dist/cli/schema-diff.js.map +1 -0
- package/dist/cli/setup-mcp-router.d.ts +8 -0
- package/dist/cli/setup-mcp-router.d.ts.map +1 -0
- package/dist/cli/setup-mcp-router.js +163 -0
- package/dist/cli/setup-mcp-router.js.map +1 -0
- package/dist/cli/setup-wizard.d.ts +2 -0
- package/dist/cli/setup-wizard.d.ts.map +1 -0
- package/dist/cli/setup-wizard.js +806 -0
- package/dist/cli/setup-wizard.js.map +1 -0
- package/dist/cli/setup.d.ts +15 -0
- package/dist/cli/setup.d.ts.map +1 -0
- package/dist/cli/setup.js +154 -0
- package/dist/cli/setup.js.map +1 -0
- package/dist/cli/sync.d.ts +8 -0
- package/dist/cli/sync.d.ts.map +1 -0
- package/dist/cli/sync.js +395 -0
- package/dist/cli/sync.js.map +1 -0
- package/dist/cli/task.d.ts +33 -0
- package/dist/cli/task.d.ts.map +1 -0
- package/dist/cli/task.js +672 -0
- package/dist/cli/task.js.map +1 -0
- package/dist/cli/tool-calls.d.ts +20 -0
- package/dist/cli/tool-calls.d.ts.map +1 -0
- package/dist/cli/tool-calls.js +605 -0
- package/dist/cli/tool-calls.js.map +1 -0
- package/dist/cli/uap.d.ts +10 -0
- package/dist/cli/uap.d.ts.map +1 -0
- package/dist/cli/uap.js +398 -0
- package/dist/cli/uap.js.map +1 -0
- package/dist/cli/update.d.ts +10 -0
- package/dist/cli/update.d.ts.map +1 -0
- package/dist/cli/update.js +300 -0
- package/dist/cli/update.js.map +1 -0
- package/dist/cli/visualize.d.ts +77 -0
- package/dist/cli/visualize.d.ts.map +1 -0
- package/dist/cli/visualize.js +287 -0
- package/dist/cli/visualize.js.map +1 -0
- package/dist/cli/worktree.d.ts +9 -0
- package/dist/cli/worktree.d.ts.map +1 -0
- package/dist/cli/worktree.js +213 -0
- package/dist/cli/worktree.js.map +1 -0
- package/dist/coordination/adaptive-patterns.d.ts +65 -0
- package/dist/coordination/adaptive-patterns.d.ts.map +1 -0
- package/dist/coordination/adaptive-patterns.js +108 -0
- package/dist/coordination/adaptive-patterns.js.map +1 -0
- package/dist/coordination/auto-agent.d.ts +82 -0
- package/dist/coordination/auto-agent.d.ts.map +1 -0
- package/dist/coordination/auto-agent.js +145 -0
- package/dist/coordination/auto-agent.js.map +1 -0
- package/dist/coordination/capability-router.d.ts +79 -0
- package/dist/coordination/capability-router.d.ts.map +1 -0
- package/dist/coordination/capability-router.js +334 -0
- package/dist/coordination/capability-router.js.map +1 -0
- package/dist/coordination/database.d.ts +13 -0
- package/dist/coordination/database.d.ts.map +1 -0
- package/dist/coordination/database.js +136 -0
- package/dist/coordination/database.js.map +1 -0
- package/dist/coordination/deploy-batcher.d.ts +122 -0
- package/dist/coordination/deploy-batcher.d.ts.map +1 -0
- package/dist/coordination/deploy-batcher.js +718 -0
- package/dist/coordination/deploy-batcher.js.map +1 -0
- package/dist/coordination/droid-validator.d.ts +59 -0
- package/dist/coordination/droid-validator.d.ts.map +1 -0
- package/dist/coordination/droid-validator.js +142 -0
- package/dist/coordination/droid-validator.js.map +1 -0
- package/dist/coordination/index.d.ts +10 -0
- package/dist/coordination/index.d.ts.map +1 -0
- package/dist/coordination/index.js +10 -0
- package/dist/coordination/index.js.map +1 -0
- package/dist/coordination/pattern-router.d.ts +50 -0
- package/dist/coordination/pattern-router.d.ts.map +1 -0
- package/dist/coordination/pattern-router.js +118 -0
- package/dist/coordination/pattern-router.js.map +1 -0
- package/dist/coordination/service.d.ts +81 -0
- package/dist/coordination/service.d.ts.map +1 -0
- package/dist/coordination/service.js +619 -0
- package/dist/coordination/service.js.map +1 -0
- package/dist/coordination/worktree-enforcer.d.ts +22 -0
- package/dist/coordination/worktree-enforcer.d.ts.map +1 -0
- package/dist/coordination/worktree-enforcer.js +71 -0
- package/dist/coordination/worktree-enforcer.js.map +1 -0
- package/dist/generators/claude-md.d.ts +3 -0
- package/dist/generators/claude-md.d.ts.map +1 -0
- package/dist/generators/claude-md.js +1020 -0
- package/dist/generators/claude-md.js.map +1 -0
- package/dist/generators/template-loader.d.ts +105 -0
- package/dist/generators/template-loader.d.ts.map +1 -0
- package/dist/generators/template-loader.js +291 -0
- package/dist/generators/template-loader.js.map +1 -0
- package/dist/index.d.ts +49 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +63 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp-router/config/parser.d.ts +9 -0
- package/dist/mcp-router/config/parser.d.ts.map +1 -0
- package/dist/mcp-router/config/parser.js +174 -0
- package/dist/mcp-router/config/parser.js.map +1 -0
- package/dist/mcp-router/executor/client.d.ts +31 -0
- package/dist/mcp-router/executor/client.d.ts.map +1 -0
- package/dist/mcp-router/executor/client.js +189 -0
- package/dist/mcp-router/executor/client.js.map +1 -0
- package/dist/mcp-router/index.d.ts +22 -0
- package/dist/mcp-router/index.d.ts.map +1 -0
- package/dist/mcp-router/index.js +18 -0
- package/dist/mcp-router/index.js.map +1 -0
- package/dist/mcp-router/output-compressor.d.ts +26 -0
- package/dist/mcp-router/output-compressor.d.ts.map +1 -0
- package/dist/mcp-router/output-compressor.js +236 -0
- package/dist/mcp-router/output-compressor.js.map +1 -0
- package/dist/mcp-router/search/fuzzy.d.ts +26 -0
- package/dist/mcp-router/search/fuzzy.d.ts.map +1 -0
- package/dist/mcp-router/search/fuzzy.js +94 -0
- package/dist/mcp-router/search/fuzzy.js.map +1 -0
- package/dist/mcp-router/server.d.ts +50 -0
- package/dist/mcp-router/server.d.ts.map +1 -0
- package/dist/mcp-router/server.js +229 -0
- package/dist/mcp-router/server.js.map +1 -0
- package/dist/mcp-router/session-stats.d.ts +37 -0
- package/dist/mcp-router/session-stats.d.ts.map +1 -0
- package/dist/mcp-router/session-stats.js +56 -0
- package/dist/mcp-router/session-stats.js.map +1 -0
- package/dist/mcp-router/tools/discover.d.ts +37 -0
- package/dist/mcp-router/tools/discover.d.ts.map +1 -0
- package/dist/mcp-router/tools/discover.js +65 -0
- package/dist/mcp-router/tools/discover.js.map +1 -0
- package/dist/mcp-router/tools/execute.d.ts +43 -0
- package/dist/mcp-router/tools/execute.d.ts.map +1 -0
- package/dist/mcp-router/tools/execute.js +144 -0
- package/dist/mcp-router/tools/execute.js.map +1 -0
- package/dist/mcp-router/types.d.ts +62 -0
- package/dist/mcp-router/types.d.ts.map +1 -0
- package/dist/mcp-router/types.js +6 -0
- package/dist/mcp-router/types.js.map +1 -0
- package/dist/memory/adaptive-context.d.ts +149 -0
- package/dist/memory/adaptive-context.d.ts.map +1 -0
- package/dist/memory/adaptive-context.js +1095 -0
- package/dist/memory/adaptive-context.js.map +1 -0
- package/dist/memory/agent-scoped-memory.d.ts +67 -0
- package/dist/memory/agent-scoped-memory.d.ts.map +1 -0
- package/dist/memory/agent-scoped-memory.js +126 -0
- package/dist/memory/agent-scoped-memory.js.map +1 -0
- package/dist/memory/ambiguity-detector.d.ts +54 -0
- package/dist/memory/ambiguity-detector.d.ts.map +1 -0
- package/dist/memory/ambiguity-detector.js +401 -0
- package/dist/memory/ambiguity-detector.js.map +1 -0
- package/dist/memory/backends/base.d.ts +18 -0
- package/dist/memory/backends/base.d.ts.map +1 -0
- package/dist/memory/backends/base.js +2 -0
- package/dist/memory/backends/base.js.map +1 -0
- package/dist/memory/backends/factory.d.ts +4 -0
- package/dist/memory/backends/factory.d.ts.map +1 -0
- package/dist/memory/backends/factory.js +53 -0
- package/dist/memory/backends/factory.js.map +1 -0
- package/dist/memory/backends/github.d.ts +27 -0
- package/dist/memory/backends/github.d.ts.map +1 -0
- package/dist/memory/backends/github.js +134 -0
- package/dist/memory/backends/github.js.map +1 -0
- package/dist/memory/backends/qdrant-cloud.d.ts +32 -0
- package/dist/memory/backends/qdrant-cloud.d.ts.map +1 -0
- package/dist/memory/backends/qdrant-cloud.js +167 -0
- package/dist/memory/backends/qdrant-cloud.js.map +1 -0
- package/dist/memory/context-compressor.d.ts +116 -0
- package/dist/memory/context-compressor.d.ts.map +1 -0
- package/dist/memory/context-compressor.js +430 -0
- package/dist/memory/context-compressor.js.map +1 -0
- package/dist/memory/context-pruner.d.ts +55 -0
- package/dist/memory/context-pruner.d.ts.map +1 -0
- package/dist/memory/context-pruner.js +85 -0
- package/dist/memory/context-pruner.js.map +1 -0
- package/dist/memory/correction-propagator.d.ts +44 -0
- package/dist/memory/correction-propagator.d.ts.map +1 -0
- package/dist/memory/correction-propagator.js +156 -0
- package/dist/memory/correction-propagator.js.map +1 -0
- package/dist/memory/daily-log.d.ts +67 -0
- package/dist/memory/daily-log.d.ts.map +1 -0
- package/dist/memory/daily-log.js +143 -0
- package/dist/memory/daily-log.js.map +1 -0
- package/dist/memory/dynamic-retrieval.d.ts +112 -0
- package/dist/memory/dynamic-retrieval.d.ts.map +1 -0
- package/dist/memory/dynamic-retrieval.js +908 -0
- package/dist/memory/dynamic-retrieval.js.map +1 -0
- package/dist/memory/embeddings.d.ts +172 -0
- package/dist/memory/embeddings.d.ts.map +1 -0
- package/dist/memory/embeddings.js +780 -0
- package/dist/memory/embeddings.js.map +1 -0
- package/dist/memory/generic-uap-patterns.d.ts +7 -0
- package/dist/memory/generic-uap-patterns.d.ts.map +1 -0
- package/dist/memory/generic-uap-patterns.js +43 -0
- package/dist/memory/generic-uap-patterns.js.map +1 -0
- package/dist/memory/hierarchical-memory.d.ts +141 -0
- package/dist/memory/hierarchical-memory.d.ts.map +1 -0
- package/dist/memory/hierarchical-memory.js +485 -0
- package/dist/memory/hierarchical-memory.js.map +1 -0
- package/dist/memory/knowledge-graph.d.ts +98 -0
- package/dist/memory/knowledge-graph.d.ts.map +1 -0
- package/dist/memory/knowledge-graph.js +275 -0
- package/dist/memory/knowledge-graph.js.map +1 -0
- package/dist/memory/memory-consolidator.d.ts +124 -0
- package/dist/memory/memory-consolidator.d.ts.map +1 -0
- package/dist/memory/memory-consolidator.js +514 -0
- package/dist/memory/memory-consolidator.js.map +1 -0
- package/dist/memory/memory-maintenance.d.ts +39 -0
- package/dist/memory/memory-maintenance.d.ts.map +1 -0
- package/dist/memory/memory-maintenance.js +336 -0
- package/dist/memory/memory-maintenance.js.map +1 -0
- package/dist/memory/model-router.d.ts +105 -0
- package/dist/memory/model-router.d.ts.map +1 -0
- package/dist/memory/model-router.js +474 -0
- package/dist/memory/model-router.js.map +1 -0
- package/dist/memory/multi-view-memory.d.ts +134 -0
- package/dist/memory/multi-view-memory.d.ts.map +1 -0
- package/dist/memory/multi-view-memory.js +430 -0
- package/dist/memory/multi-view-memory.js.map +1 -0
- package/dist/memory/predictive-memory.d.ts +79 -0
- package/dist/memory/predictive-memory.d.ts.map +1 -0
- package/dist/memory/predictive-memory.js +294 -0
- package/dist/memory/predictive-memory.js.map +1 -0
- package/dist/memory/prepopulate.d.ts +76 -0
- package/dist/memory/prepopulate.d.ts.map +1 -0
- package/dist/memory/prepopulate.js +832 -0
- package/dist/memory/prepopulate.js.map +1 -0
- package/dist/memory/semantic-compression.d.ts +77 -0
- package/dist/memory/semantic-compression.d.ts.map +1 -0
- package/dist/memory/semantic-compression.js +359 -0
- package/dist/memory/semantic-compression.js.map +1 -0
- package/dist/memory/serverless-qdrant.d.ts +102 -0
- package/dist/memory/serverless-qdrant.d.ts.map +1 -0
- package/dist/memory/serverless-qdrant.js +369 -0
- package/dist/memory/serverless-qdrant.js.map +1 -0
- package/dist/memory/short-term/factory.d.ts +26 -0
- package/dist/memory/short-term/factory.d.ts.map +1 -0
- package/dist/memory/short-term/factory.js +28 -0
- package/dist/memory/short-term/factory.js.map +1 -0
- package/dist/memory/short-term/indexeddb.d.ts +25 -0
- package/dist/memory/short-term/indexeddb.d.ts.map +1 -0
- package/dist/memory/short-term/indexeddb.js +64 -0
- package/dist/memory/short-term/indexeddb.js.map +1 -0
- package/dist/memory/short-term/schema.d.ts +6 -0
- package/dist/memory/short-term/schema.d.ts.map +1 -0
- package/dist/memory/short-term/schema.js +141 -0
- package/dist/memory/short-term/schema.js.map +1 -0
- package/dist/memory/short-term/sqlite.d.ts +64 -0
- package/dist/memory/short-term/sqlite.d.ts.map +1 -0
- package/dist/memory/short-term/sqlite.js +274 -0
- package/dist/memory/short-term/sqlite.js.map +1 -0
- package/dist/memory/speculative-cache.d.ts +111 -0
- package/dist/memory/speculative-cache.d.ts.map +1 -0
- package/dist/memory/speculative-cache.js +457 -0
- package/dist/memory/speculative-cache.js.map +1 -0
- package/dist/memory/task-classifier.d.ts +40 -0
- package/dist/memory/task-classifier.d.ts.map +1 -0
- package/dist/memory/task-classifier.js +342 -0
- package/dist/memory/task-classifier.js.map +1 -0
- package/dist/memory/terminal-bench-knowledge.d.ts +48 -0
- package/dist/memory/terminal-bench-knowledge.d.ts.map +1 -0
- package/dist/memory/terminal-bench-knowledge.js +622 -0
- package/dist/memory/terminal-bench-knowledge.js.map +1 -0
- package/dist/memory/write-gate.d.ts +39 -0
- package/dist/memory/write-gate.d.ts.map +1 -0
- package/dist/memory/write-gate.js +190 -0
- package/dist/memory/write-gate.js.map +1 -0
- package/dist/models/api-client.d.ts +46 -0
- package/dist/models/api-client.d.ts.map +1 -0
- package/dist/models/api-client.js +182 -0
- package/dist/models/api-client.js.map +1 -0
- package/dist/models/execution-profiles.d.ts +64 -0
- package/dist/models/execution-profiles.d.ts.map +1 -0
- package/dist/models/execution-profiles.js +403 -0
- package/dist/models/execution-profiles.js.map +1 -0
- package/dist/models/executor.d.ts +130 -0
- package/dist/models/executor.d.ts.map +1 -0
- package/dist/models/executor.js +382 -0
- package/dist/models/executor.js.map +1 -0
- package/dist/models/index.d.ts +19 -0
- package/dist/models/index.d.ts.map +1 -0
- package/dist/models/index.js +23 -0
- package/dist/models/index.js.map +1 -0
- package/dist/models/plan-validator.d.ts +37 -0
- package/dist/models/plan-validator.d.ts.map +1 -0
- package/dist/models/plan-validator.js +179 -0
- package/dist/models/plan-validator.js.map +1 -0
- package/dist/models/planner.d.ts +73 -0
- package/dist/models/planner.d.ts.map +1 -0
- package/dist/models/planner.js +375 -0
- package/dist/models/planner.js.map +1 -0
- package/dist/models/router.d.ts +96 -0
- package/dist/models/router.d.ts.map +1 -0
- package/dist/models/router.js +523 -0
- package/dist/models/router.js.map +1 -0
- package/dist/models/types.d.ts +370 -0
- package/dist/models/types.d.ts.map +1 -0
- package/dist/models/types.js +232 -0
- package/dist/models/types.js.map +1 -0
- package/dist/models/unified-router.d.ts +152 -0
- package/dist/models/unified-router.d.ts.map +1 -0
- package/dist/models/unified-router.js +313 -0
- package/dist/models/unified-router.js.map +1 -0
- package/dist/policies/convert-policy-to-claude.d.ts +3 -0
- package/dist/policies/convert-policy-to-claude.d.ts.map +1 -0
- package/dist/policies/convert-policy-to-claude.js +87 -0
- package/dist/policies/convert-policy-to-claude.js.map +1 -0
- package/dist/policies/database-manager.d.ts +27 -0
- package/dist/policies/database-manager.d.ts.map +1 -0
- package/dist/policies/database-manager.js +198 -0
- package/dist/policies/database-manager.js.map +1 -0
- package/dist/policies/enforced-tool-router.d.ts +53 -0
- package/dist/policies/enforced-tool-router.d.ts.map +1 -0
- package/dist/policies/enforced-tool-router.js +80 -0
- package/dist/policies/enforced-tool-router.js.map +1 -0
- package/dist/policies/index.d.ts +10 -0
- package/dist/policies/index.d.ts.map +1 -0
- package/dist/policies/index.js +8 -0
- package/dist/policies/index.js.map +1 -0
- package/dist/policies/policy-gate.d.ts +59 -0
- package/dist/policies/policy-gate.d.ts.map +1 -0
- package/dist/policies/policy-gate.js +171 -0
- package/dist/policies/policy-gate.js.map +1 -0
- package/dist/policies/policy-memory.d.ts +18 -0
- package/dist/policies/policy-memory.d.ts.map +1 -0
- package/dist/policies/policy-memory.js +126 -0
- package/dist/policies/policy-memory.js.map +1 -0
- package/dist/policies/policy-tools.d.ts +11 -0
- package/dist/policies/policy-tools.d.ts.map +1 -0
- package/dist/policies/policy-tools.js +66 -0
- package/dist/policies/policy-tools.js.map +1 -0
- package/dist/policies/schemas/policy.d.ts +69 -0
- package/dist/policies/schemas/policy.d.ts.map +1 -0
- package/dist/policies/schemas/policy.js +31 -0
- package/dist/policies/schemas/policy.js.map +1 -0
- package/dist/tasks/coordination.d.ts +83 -0
- package/dist/tasks/coordination.d.ts.map +1 -0
- package/dist/tasks/coordination.js +291 -0
- package/dist/tasks/coordination.js.map +1 -0
- package/dist/tasks/database.d.ts +19 -0
- package/dist/tasks/database.d.ts.map +1 -0
- package/dist/tasks/database.js +149 -0
- package/dist/tasks/database.js.map +1 -0
- package/dist/tasks/decoder-gate.d.ts +64 -0
- package/dist/tasks/decoder-gate.d.ts.map +1 -0
- package/dist/tasks/decoder-gate.js +268 -0
- package/dist/tasks/decoder-gate.js.map +1 -0
- package/dist/tasks/index.d.ts +6 -0
- package/dist/tasks/index.d.ts.map +1 -0
- package/dist/tasks/index.js +6 -0
- package/dist/tasks/index.js.map +1 -0
- package/dist/tasks/service.d.ts +40 -0
- package/dist/tasks/service.d.ts.map +1 -0
- package/dist/tasks/service.js +671 -0
- package/dist/tasks/service.js.map +1 -0
- package/dist/tasks/types.d.ts +238 -0
- package/dist/tasks/types.d.ts.map +1 -0
- package/dist/tasks/types.js +74 -0
- package/dist/tasks/types.js.map +1 -0
- package/dist/telemetry/index.d.ts +2 -0
- package/dist/telemetry/index.d.ts.map +1 -0
- package/dist/telemetry/index.js +2 -0
- package/dist/telemetry/index.js.map +1 -0
- package/dist/telemetry/session-telemetry.d.ts +56 -0
- package/dist/telemetry/session-telemetry.d.ts.map +1 -0
- package/dist/telemetry/session-telemetry.js +807 -0
- package/dist/telemetry/session-telemetry.js.map +1 -0
- package/dist/types/analysis.d.ts +82 -0
- package/dist/types/analysis.d.ts.map +1 -0
- package/dist/types/analysis.js +2 -0
- package/dist/types/analysis.js.map +1 -0
- package/dist/types/config.d.ts +3324 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +418 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/coordination.d.ts +240 -0
- package/dist/types/coordination.d.ts.map +1 -0
- package/dist/types/coordination.js +43 -0
- package/dist/types/coordination.js.map +1 -0
- package/dist/types/index.d.ts +4 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +4 -0
- package/dist/types/index.js.map +1 -0
- package/dist/uap-droids-strict.d.ts +59 -0
- package/dist/uap-droids-strict.d.ts.map +1 -0
- package/dist/uap-droids-strict.js +200 -0
- package/dist/uap-droids-strict.js.map +1 -0
- package/dist/utils/config-manager.d.ts +30 -0
- package/dist/utils/config-manager.d.ts.map +1 -0
- package/dist/utils/config-manager.js +41 -0
- package/dist/utils/config-manager.js.map +1 -0
- package/dist/utils/fetch-with-retry.d.ts +5 -0
- package/dist/utils/fetch-with-retry.d.ts.map +1 -0
- package/dist/utils/fetch-with-retry.js +61 -0
- package/dist/utils/fetch-with-retry.js.map +1 -0
- package/dist/utils/merge-claude-md.d.ts +28 -0
- package/dist/utils/merge-claude-md.d.ts.map +1 -0
- package/dist/utils/merge-claude-md.js +342 -0
- package/dist/utils/merge-claude-md.js.map +1 -0
- package/dist/utils/rate-limiter.d.ts +58 -0
- package/dist/utils/rate-limiter.d.ts.map +1 -0
- package/dist/utils/rate-limiter.js +100 -0
- package/dist/utils/rate-limiter.js.map +1 -0
- package/dist/utils/string-similarity.d.ts +37 -0
- package/dist/utils/string-similarity.d.ts.map +1 -0
- package/dist/utils/string-similarity.js +114 -0
- package/dist/utils/string-similarity.js.map +1 -0
- package/dist/utils/validate-json.d.ts +51 -0
- package/dist/utils/validate-json.d.ts.map +1 -0
- package/dist/utils/validate-json.js +94 -0
- package/dist/utils/validate-json.js.map +1 -0
- package/docs/INDEX.md +66 -0
- package/docs/architecture/MULTI_MODEL.md +224 -0
- package/docs/architecture/SYSTEM_ANALYSIS.md +1117 -0
- package/docs/architecture/UAP_COMPLIANCE.md +217 -0
- package/docs/architecture/UAP_PROTOCOL.md +339 -0
- package/docs/architecture/UAP_STRICT_DROIDS.md +172 -0
- package/docs/archive/BALLS_MODE_SELF_ANALYSIS.md +260 -0
- package/docs/archive/FAILING_TASKS_SOLUTION_PLAN.md +668 -0
- package/docs/archive/JINJA2-SYSTEM-MESSAGE-FIX.md +209 -0
- package/docs/archive/NPM-PUBLISH-V0.9.1.md +240 -0
- package/docs/archive/OPTIMIZATION_OPTIONS.md +334 -0
- package/docs/archive/SETUP_IMPROVEMENTS.md +213 -0
- package/docs/archive/UAP_GENERIC_OPTIMIZATION_PLAN.md +270 -0
- package/docs/archive/UAP_V103_PATTERN_DESIGN.md +315 -0
- package/docs/archive/UAP_V104_COMPLIANCE_DESIGN.md +223 -0
- package/docs/archive/changelog/2026-03-10_uap-100-compliance.md +77 -0
- package/docs/archive/changelog/2026-03-10_uap-full-system-verification.md +109 -0
- package/docs/benchmarks/ACCURACY_ANALYSIS.md +471 -0
- package/docs/benchmarks/TOKEN_OPTIMIZATION.md +572 -0
- package/docs/benchmarks/VALIDATION_PLAN.md +568 -0
- package/docs/benchmarks/VALIDATION_RESULTS.md +161 -0
- package/docs/deployment/DEPLOYMENT.md +895 -0
- package/docs/deployment/DEPLOYMENT_STRATEGIES.md +518 -0
- package/docs/deployment/DEPLOY_BATCHER_ANALYSIS.md +856 -0
- package/docs/deployment/DEPLOY_BATCHING.md +273 -0
- package/docs/deployment/DEPLOY_BUCKETING_ANALYSIS.md +420 -0
- package/docs/deployment/QWEN35_LLAMA_CPP.md +265 -0
- package/docs/getting-started/INTEGRATION.md +449 -0
- package/docs/getting-started/OVERVIEW.md +344 -0
- package/docs/getting-started/SETUP.md +203 -0
- package/docs/integrations/MCP_ROUTER_SETUP.md +445 -0
- package/docs/integrations/RTK_INTEGRATION.md +468 -0
- package/docs/operations/TROUBLESHOOTING.md +660 -0
- package/docs/reference/API_REFERENCE.md +903 -0
- package/docs/reference/FEATURES.md +472 -0
- package/docs/reference/HARNESS-MATRIX.md +318 -0
- package/docs/reference/UAP_CLI_REFERENCE.md +600 -0
- package/docs/research/BEHAVIORAL_PATTERNS.md +228 -0
- package/docs/research/DOMAIN_STRATEGIES.md +316 -0
- package/docs/research/MEMORY_SYSTEMS_COMPARISON.md +812 -0
- package/docs/research/PATTERN_ANALYSIS_2026-01-18.md +436 -0
- package/docs/research/PERFORMANCE_ANALYSIS_2026-01-18.md +209 -0
- package/docs/research/PERFORMANCE_TEST_PLAN.md +383 -0
- package/docs/research/TERMINAL_BENCH_LEARNINGS.md +217 -0
- package/package.json +113 -0
- package/scripts/README.md +161 -0
- package/templates/CLAUDE.template.md +10 -0
- package/templates/CLAUDE_ARCHITECTURE.template.md +103 -0
- package/templates/CLAUDE_CODING.template.md +127 -0
- package/templates/CLAUDE_DROIDS.template.md +109 -0
- package/templates/CLAUDE_MEMORY.template.md +131 -0
- package/templates/CLAUDE_WORKFLOWS.template.md +139 -0
- package/templates/PROJECT.template.md +209 -0
- package/templates/SCHEMA.md +57 -0
- package/templates/archive/CLAUDE.template.root-v6.md +534 -0
- package/templates/archive/CLAUDE.template.v6.md +534 -0
- package/templates/hooks/forgecode/pre-compact.sh +68 -0
- package/templates/hooks/forgecode/session-start.sh +169 -0
- package/templates/hooks/forgecode.plugin.sh +128 -0
- package/templates/hooks/pre-compact.sh +74 -0
- package/templates/hooks/session-start.sh +366 -0
- package/tools/agents/README.md +224 -0
- package/tools/agents/UAP/README.md +386 -0
- package/tools/agents/UAP/__init__.py +9 -0
- package/tools/agents/UAP/cli.py +901 -0
- package/tools/agents/UAP/compliance_verify.sh +108 -0
- package/tools/agents/UAP/full_verification.sh +126 -0
- package/tools/agents/UAP/version.py +32 -0
- package/tools/agents/benchmarks/benchmark_memory_systems.py +730 -0
- package/tools/agents/benchmarks/results/benchmark_20260106_064817.json +170 -0
- package/tools/agents/benchmarks/results/benchmark_20260106_064817.md +51 -0
- package/tools/agents/config/chat_template.jinja +77 -0
- package/tools/agents/config/tool-call-schema.json +19 -0
- package/tools/agents/config/tool-call.gbnf +58 -0
- package/tools/agents/docker/Dockerfile.python +52 -0
- package/tools/agents/docker/Dockerfile.ubuntu +55 -0
- package/tools/agents/docker-compose.qdrant.yml +24 -0
- package/tools/agents/install-opencode-local.sh.j2 +135 -0
- package/tools/agents/migrations/apply.py +256 -0
- package/tools/agents/opencode_uap_agent.py +1505 -0
- package/tools/agents/plugin/README.md +91 -0
- package/tools/agents/plugin/index.ts +46 -0
- package/tools/agents/plugin/pre-compact.sh +68 -0
- package/tools/agents/plugin/session-start.sh +175 -0
- package/tools/agents/plugin/uap-commands.ts +45 -0
- package/tools/agents/plugin/uap-droids.ts +54 -0
- package/tools/agents/plugin/uap-patterns.ts +54 -0
- package/tools/agents/plugin/uap-skills.ts +52 -0
- package/tools/agents/plugins/uap-enforce.ts +314 -0
- package/tools/agents/scripts/__pycache__/tool_call_wrapper.cpython-313.pyc +0 -0
- package/tools/agents/scripts/chat_template_verifier.py +343 -0
- package/tools/agents/scripts/fix-qwen-template.js +38 -0
- package/tools/agents/scripts/fix_qwen_chat_template.py +316 -0
- package/tools/agents/scripts/generate_lora_training_data.py +412 -0
- package/tools/agents/scripts/init_qdrant.py +151 -0
- package/tools/agents/scripts/memory_migration.py +560 -0
- package/tools/agents/scripts/migrate_memory_to_qdrant.py +110 -0
- package/tools/agents/scripts/prepare_lora.sh +512 -0
- package/tools/agents/scripts/query_memory.py +200 -0
- package/tools/agents/scripts/qwen-tool-call-test.js +38 -0
- package/tools/agents/scripts/qwen-tool-call-wrapper.js +38 -0
- package/tools/agents/scripts/qwen_tool_call_test.py +464 -0
- package/tools/agents/scripts/qwen_tool_call_wrapper.py +686 -0
- package/tools/agents/scripts/start-services.sh +96 -0
- package/tools/agents/scripts/tool-choice-proxy.cjs +296 -0
- package/tools/agents/scripts/tool_call_test.py +656 -0
- package/tools/agents/scripts/tool_call_wrapper.py +799 -0
- package/tools/agents/tests/test_uap_compliance.py +257 -0
- package/tools/agents/uap_agent.py +122 -0
- package/tools/agents/uap_agent_install.sh +12 -0
|
@@ -0,0 +1,780 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Embedding Service for UAP Memory System
|
|
3
|
+
*
|
|
4
|
+
* Provides text embedding generation for semantic memory retrieval.
|
|
5
|
+
* Supports multiple backends: Ollama (local), OpenAI, local transformers, or simple TF-IDF fallback.
|
|
6
|
+
*
|
|
7
|
+
* Priority order:
|
|
8
|
+
* 1. Ollama (if running with nomic-embed-text or similar)
|
|
9
|
+
* 2. OpenAI (if API key available)
|
|
10
|
+
* 3. Local sentence-transformers (if installed)
|
|
11
|
+
* 4. TF-IDF fallback (always available)
|
|
12
|
+
*/
|
|
13
|
+
import { execFileSync } from 'child_process';
|
|
14
|
+
import { createHash } from 'crypto';
|
|
15
|
+
/**
|
|
16
|
+
* llama.cpp Embeddings Provider (LOCAL - NO API COSTS)
|
|
17
|
+
*
|
|
18
|
+
* Uses llama-server with --embeddings flag to serve embedding models.
|
|
19
|
+
* Recommended model: nomic-embed-text-v2-moe (GGUF)
|
|
20
|
+
* - 475M total params, 305M active (MoE: 8 experts, top-2 routing)
|
|
21
|
+
* - 768 dimensions (Matryoshka: can truncate to 256)
|
|
22
|
+
* - SoTA multilingual (100+ languages, MIRACL 65.8, BEIR 52.86)
|
|
23
|
+
* - Q4_K_M quant: ~328MB VRAM — fits alongside Qwen3.5 35B A3B
|
|
24
|
+
*
|
|
25
|
+
* To run alongside Qwen3.5 35B A3B, launch TWO llama-server instances:
|
|
26
|
+
*
|
|
27
|
+
* # Instance 1: Main LLM (Qwen3.5 35B A3B) on port 8080
|
|
28
|
+
* llama-server \
|
|
29
|
+
* --model /path/to/Qwen3.5-35B-A3B-UD-IQ4_XS.gguf \
|
|
30
|
+
* --chat-template-file chat_template.jinja \
|
|
31
|
+
* --port 8080 --host 0.0.0.0 \
|
|
32
|
+
* --ctx-size 131072 --gpu-layers 99 \
|
|
33
|
+
* --cache-type-k q8_0 --cache-type-v q4_0 \
|
|
34
|
+
* -fa on --threads 8 --batch-size 512
|
|
35
|
+
*
|
|
36
|
+
* # Instance 2: Embedding model on port 8081
|
|
37
|
+
* llama-server \
|
|
38
|
+
* --model /path/to/nomic-embed-text-v2-moe.Q4_K_M.gguf \
|
|
39
|
+
* --port 8081 --host 0.0.0.0 \
|
|
40
|
+
* --embeddings --pooling mean \
|
|
41
|
+
* --ctx-size 512 --gpu-layers 99 \
|
|
42
|
+
* --batch-size 2048 --ubatch-size 512 \
|
|
43
|
+
* --threads 4
|
|
44
|
+
*
|
|
45
|
+
* VRAM budget (24GB GPU):
|
|
46
|
+
* Qwen3.5 IQ4_XS: ~17GB model + ~3GB KV cache = ~20GB
|
|
47
|
+
* nomic-embed Q4_K_M: ~328MB model + ~50MB KV = ~380MB
|
|
48
|
+
* Total: ~20.4GB — fits in 24GB with headroom
|
|
49
|
+
*
|
|
50
|
+
* For CPU-only embedding (saves all GPU for LLM):
|
|
51
|
+
* llama-server \
|
|
52
|
+
* --model /path/to/nomic-embed-text-v2-moe.Q4_K_M.gguf \
|
|
53
|
+
* --port 8081 --host 0.0.0.0 \
|
|
54
|
+
* --embeddings --pooling mean \
|
|
55
|
+
* --ctx-size 512 --gpu-layers 0 \
|
|
56
|
+
* --batch-size 2048 --threads 8
|
|
57
|
+
*/
|
|
58
|
+
export class LlamaCppEmbeddingProvider {
|
|
59
|
+
name = 'llama-cpp';
|
|
60
|
+
dimensions = 768; // nomic-embed-text-v2-moe default
|
|
61
|
+
endpoint;
|
|
62
|
+
available = null;
|
|
63
|
+
taskPrefix;
|
|
64
|
+
constructor(endpoint = 'http://localhost:8081', options = {}) {
|
|
65
|
+
// Support env var override
|
|
66
|
+
this.endpoint = process.env.UAP_EMBEDDING_ENDPOINT || endpoint;
|
|
67
|
+
// nomic-embed-text-v2 requires task prefixes for best results
|
|
68
|
+
this.taskPrefix = options.taskPrefix || 'search_document: ';
|
|
69
|
+
}
|
|
70
|
+
async isAvailable() {
|
|
71
|
+
if (this.available !== null)
|
|
72
|
+
return this.available;
|
|
73
|
+
try {
|
|
74
|
+
// llama-server health check
|
|
75
|
+
const response = await fetch(`${this.endpoint}/health`, {
|
|
76
|
+
method: 'GET',
|
|
77
|
+
signal: AbortSignal.timeout(2000),
|
|
78
|
+
});
|
|
79
|
+
if (!response.ok) {
|
|
80
|
+
this.available = false;
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
// Verify it supports embeddings by checking /v1/embeddings
|
|
84
|
+
const testResponse = await fetch(`${this.endpoint}/v1/embeddings`, {
|
|
85
|
+
method: 'POST',
|
|
86
|
+
headers: { 'Content-Type': 'application/json' },
|
|
87
|
+
body: JSON.stringify({ input: 'test' }),
|
|
88
|
+
signal: AbortSignal.timeout(5000),
|
|
89
|
+
});
|
|
90
|
+
this.available = testResponse.ok;
|
|
91
|
+
if (testResponse.ok) {
|
|
92
|
+
// Detect actual dimensions from response
|
|
93
|
+
const data = (await testResponse.json());
|
|
94
|
+
if (data.data?.[0]?.embedding) {
|
|
95
|
+
this.dimensions = data.data[0].embedding.length;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return this.available;
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
this.available = false;
|
|
102
|
+
return false;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
async embed(text) {
|
|
106
|
+
const results = await this.embedBatch([text]);
|
|
107
|
+
return results[0];
|
|
108
|
+
}
|
|
109
|
+
async embedBatch(texts) {
|
|
110
|
+
// Add task prefix for nomic-embed-text-v2 compatibility
|
|
111
|
+
const prefixedTexts = texts.map((t) => t.startsWith('search_query: ') || t.startsWith('search_document: ') ? t : this.taskPrefix + t);
|
|
112
|
+
const response = await fetch(`${this.endpoint}/v1/embeddings`, {
|
|
113
|
+
method: 'POST',
|
|
114
|
+
headers: { 'Content-Type': 'application/json' },
|
|
115
|
+
body: JSON.stringify({ input: prefixedTexts }),
|
|
116
|
+
signal: AbortSignal.timeout(30000),
|
|
117
|
+
});
|
|
118
|
+
if (!response.ok) {
|
|
119
|
+
throw new Error(`llama.cpp embedding API error: ${response.status} ${response.statusText}`);
|
|
120
|
+
}
|
|
121
|
+
const data = (await response.json());
|
|
122
|
+
// Sort by index to maintain order
|
|
123
|
+
const sorted = data.data.sort((a, b) => a.index - b.index);
|
|
124
|
+
const embeddings = sorted.map((d) => d.embedding);
|
|
125
|
+
// Update dimensions from actual response
|
|
126
|
+
if (embeddings[0]) {
|
|
127
|
+
this.dimensions = embeddings[0].length;
|
|
128
|
+
}
|
|
129
|
+
return embeddings;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Ollama Embeddings Provider (LOCAL - NO API COSTS)
|
|
134
|
+
* Uses nomic-embed-text (768 dimensions) or other embedding models
|
|
135
|
+
*/
|
|
136
|
+
export class OllamaEmbeddingProvider {
|
|
137
|
+
name = 'ollama';
|
|
138
|
+
dimensions = 768; // nomic-embed-text default
|
|
139
|
+
endpoint;
|
|
140
|
+
model;
|
|
141
|
+
available = null;
|
|
142
|
+
constructor(endpoint = 'http://localhost:11434', model = 'nomic-embed-text') {
|
|
143
|
+
this.endpoint = endpoint;
|
|
144
|
+
this.model = model;
|
|
145
|
+
}
|
|
146
|
+
async isAvailable() {
|
|
147
|
+
if (this.available !== null)
|
|
148
|
+
return this.available;
|
|
149
|
+
try {
|
|
150
|
+
const response = await fetch(`${this.endpoint}/api/tags`, {
|
|
151
|
+
method: 'GET',
|
|
152
|
+
signal: AbortSignal.timeout(2000),
|
|
153
|
+
});
|
|
154
|
+
if (!response.ok) {
|
|
155
|
+
this.available = false;
|
|
156
|
+
return false;
|
|
157
|
+
}
|
|
158
|
+
const data = (await response.json());
|
|
159
|
+
const hasEmbedModel = data.models?.some((m) => m.name.includes('embed') ||
|
|
160
|
+
m.name.includes('nomic') ||
|
|
161
|
+
m.name === this.model ||
|
|
162
|
+
m.name.startsWith(this.model));
|
|
163
|
+
this.available = hasEmbedModel;
|
|
164
|
+
return hasEmbedModel;
|
|
165
|
+
}
|
|
166
|
+
catch {
|
|
167
|
+
this.available = false;
|
|
168
|
+
return false;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
async embed(text) {
|
|
172
|
+
const response = await fetch(`${this.endpoint}/api/embeddings`, {
|
|
173
|
+
method: 'POST',
|
|
174
|
+
headers: { 'Content-Type': 'application/json' },
|
|
175
|
+
body: JSON.stringify({
|
|
176
|
+
model: this.model,
|
|
177
|
+
prompt: text,
|
|
178
|
+
}),
|
|
179
|
+
});
|
|
180
|
+
if (!response.ok) {
|
|
181
|
+
throw new Error(`Ollama API error: ${response.status} ${response.statusText}`);
|
|
182
|
+
}
|
|
183
|
+
const data = (await response.json());
|
|
184
|
+
this.dimensions = data.embedding.length; // Update dimensions from actual response
|
|
185
|
+
return data.embedding;
|
|
186
|
+
}
|
|
187
|
+
async embedBatch(texts) {
|
|
188
|
+
// Ollama doesn't have native batch, but we can parallelize
|
|
189
|
+
const results = await Promise.all(texts.map((t) => this.embed(t)));
|
|
190
|
+
return results;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* OpenAI Embeddings Provider
|
|
195
|
+
* Uses text-embedding-3-small (1536 dimensions) or text-embedding-ada-002
|
|
196
|
+
*/
|
|
197
|
+
export class OpenAIEmbeddingProvider {
|
|
198
|
+
name = 'openai';
|
|
199
|
+
dimensions = 1536;
|
|
200
|
+
apiKey;
|
|
201
|
+
model;
|
|
202
|
+
constructor(apiKey, model = 'text-embedding-3-small') {
|
|
203
|
+
this.apiKey = apiKey || process.env.OPENAI_API_KEY || '';
|
|
204
|
+
this.model = model;
|
|
205
|
+
}
|
|
206
|
+
async isAvailable() {
|
|
207
|
+
return !!this.apiKey;
|
|
208
|
+
}
|
|
209
|
+
async embed(text) {
|
|
210
|
+
const results = await this.embedBatch([text]);
|
|
211
|
+
return results[0];
|
|
212
|
+
}
|
|
213
|
+
async embedBatch(texts) {
|
|
214
|
+
if (!this.apiKey) {
|
|
215
|
+
throw new Error('OpenAI API key not configured');
|
|
216
|
+
}
|
|
217
|
+
const response = await fetch('https://api.openai.com/v1/embeddings', {
|
|
218
|
+
method: 'POST',
|
|
219
|
+
headers: {
|
|
220
|
+
Authorization: `Bearer ${this.apiKey}`,
|
|
221
|
+
'Content-Type': 'application/json',
|
|
222
|
+
},
|
|
223
|
+
body: JSON.stringify({
|
|
224
|
+
model: this.model,
|
|
225
|
+
input: texts,
|
|
226
|
+
}),
|
|
227
|
+
});
|
|
228
|
+
if (!response.ok) {
|
|
229
|
+
throw new Error(`OpenAI API error: ${response.status} ${response.statusText}`);
|
|
230
|
+
}
|
|
231
|
+
const data = (await response.json());
|
|
232
|
+
return data.data.map((d) => d.embedding);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Local Sentence Transformers Provider
|
|
237
|
+
* Uses Python sentence-transformers library for local embedding generation
|
|
238
|
+
*/
|
|
239
|
+
export class LocalEmbeddingProvider {
|
|
240
|
+
name = 'local';
|
|
241
|
+
dimensions = 384;
|
|
242
|
+
model;
|
|
243
|
+
pythonPath;
|
|
244
|
+
constructor(model = 'all-MiniLM-L6-v2', pythonPath = 'python3') {
|
|
245
|
+
this.model = model;
|
|
246
|
+
this.pythonPath = pythonPath;
|
|
247
|
+
}
|
|
248
|
+
async isAvailable() {
|
|
249
|
+
try {
|
|
250
|
+
execFileSync(this.pythonPath, ['-c', 'from sentence_transformers import SentenceTransformer'], {
|
|
251
|
+
stdio: 'pipe',
|
|
252
|
+
timeout: 10000,
|
|
253
|
+
});
|
|
254
|
+
return true;
|
|
255
|
+
}
|
|
256
|
+
catch {
|
|
257
|
+
return false;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
async embed(text) {
|
|
261
|
+
const results = await this.embedBatch([text]);
|
|
262
|
+
return results[0];
|
|
263
|
+
}
|
|
264
|
+
async embedBatch(texts) {
|
|
265
|
+
// Pass texts via stdin to avoid shell injection and Python code injection.
|
|
266
|
+
// The model name is validated to contain only safe characters.
|
|
267
|
+
const safeModel = this.model.replace(/[^a-zA-Z0-9_\-./]/g, '');
|
|
268
|
+
const script = `
|
|
269
|
+
import json
|
|
270
|
+
import sys
|
|
271
|
+
from sentence_transformers import SentenceTransformer
|
|
272
|
+
|
|
273
|
+
model = SentenceTransformer(sys.argv[1], device="cpu")
|
|
274
|
+
texts = json.loads(sys.stdin.read())
|
|
275
|
+
embeddings = model.encode(texts, convert_to_numpy=True)
|
|
276
|
+
print(json.dumps(embeddings.tolist()))
|
|
277
|
+
`;
|
|
278
|
+
try {
|
|
279
|
+
const result = execFileSync(this.pythonPath, ['-c', script, safeModel], {
|
|
280
|
+
encoding: 'utf-8',
|
|
281
|
+
timeout: 60000,
|
|
282
|
+
maxBuffer: 50 * 1024 * 1024,
|
|
283
|
+
input: JSON.stringify(texts),
|
|
284
|
+
});
|
|
285
|
+
return JSON.parse(result.trim());
|
|
286
|
+
}
|
|
287
|
+
catch (error) {
|
|
288
|
+
throw new Error(`Local embedding generation failed: ${error}`);
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
293
|
+
* Enhanced TF-IDF Fallback Provider with Word Vectors
|
|
294
|
+
* Improved keyword-based embeddings with semantic awareness
|
|
295
|
+
*/
|
|
296
|
+
export class TFIDFEmbeddingProvider {
|
|
297
|
+
name = 'tfidf-enhanced';
|
|
298
|
+
dimensions = 384;
|
|
299
|
+
vocabulary = new Map();
|
|
300
|
+
idfScores = new Map();
|
|
301
|
+
documents = [];
|
|
302
|
+
wordVectors = new Map();
|
|
303
|
+
constructor() {
|
|
304
|
+
// Initialize semantic word clusters for better similarity
|
|
305
|
+
this.initializeSemanticClusters();
|
|
306
|
+
}
|
|
307
|
+
async isAvailable() {
|
|
308
|
+
return true; // Always available as fallback
|
|
309
|
+
}
|
|
310
|
+
async embed(text) {
|
|
311
|
+
const tokens = this.tokenize(text);
|
|
312
|
+
const vector = new Array(this.dimensions).fill(0);
|
|
313
|
+
// Combine TF-IDF with semantic clustering
|
|
314
|
+
for (const token of tokens) {
|
|
315
|
+
const idx = this.getTokenIndex(token);
|
|
316
|
+
const tf = tokens.filter((t) => t === token).length / tokens.length;
|
|
317
|
+
const idf = this.idfScores.get(token) || Math.log(this.documents.length + 2);
|
|
318
|
+
// Base TF-IDF contribution
|
|
319
|
+
vector[idx % this.dimensions] += tf * idf;
|
|
320
|
+
// Add semantic cluster contribution
|
|
321
|
+
const wordVec = this.wordVectors.get(token);
|
|
322
|
+
if (wordVec) {
|
|
323
|
+
for (let i = 0; i < wordVec.length; i++) {
|
|
324
|
+
vector[i] += wordVec[i] * tf * 0.3; // Weighted semantic contribution
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
// Add n-gram features for better phrase matching
|
|
329
|
+
const bigrams = this.getBigrams(tokens);
|
|
330
|
+
for (const bigram of bigrams) {
|
|
331
|
+
const idx = this.hashString(bigram) % this.dimensions;
|
|
332
|
+
vector[idx] += 0.5;
|
|
333
|
+
}
|
|
334
|
+
return this.normalize(vector);
|
|
335
|
+
}
|
|
336
|
+
async embedBatch(texts) {
|
|
337
|
+
// Update IDF scores with new documents
|
|
338
|
+
this.updateIDF(texts);
|
|
339
|
+
return Promise.all(texts.map((t) => this.embed(t)));
|
|
340
|
+
}
|
|
341
|
+
addDocument(text) {
|
|
342
|
+
this.documents.push(text);
|
|
343
|
+
this.updateIDF([text]);
|
|
344
|
+
}
|
|
345
|
+
tokenize(text) {
|
|
346
|
+
// Enhanced tokenization that handles code better
|
|
347
|
+
return text
|
|
348
|
+
.toLowerCase()
|
|
349
|
+
.replace(/([a-z])([A-Z])/g, '$1 $2') // Split camelCase
|
|
350
|
+
.replace(/_/g, ' ') // Split snake_case
|
|
351
|
+
.replace(/[^\w\s-]/g, ' ')
|
|
352
|
+
.split(/\s+/)
|
|
353
|
+
.filter((t) => t.length > 1 && !this.isStopWord(t));
|
|
354
|
+
}
|
|
355
|
+
isStopWord(token) {
|
|
356
|
+
const stopWords = new Set([
|
|
357
|
+
'the',
|
|
358
|
+
'a',
|
|
359
|
+
'an',
|
|
360
|
+
'is',
|
|
361
|
+
'are',
|
|
362
|
+
'was',
|
|
363
|
+
'were',
|
|
364
|
+
'be',
|
|
365
|
+
'been',
|
|
366
|
+
'being',
|
|
367
|
+
'have',
|
|
368
|
+
'has',
|
|
369
|
+
'had',
|
|
370
|
+
'do',
|
|
371
|
+
'does',
|
|
372
|
+
'did',
|
|
373
|
+
'will',
|
|
374
|
+
'would',
|
|
375
|
+
'could',
|
|
376
|
+
'should',
|
|
377
|
+
'may',
|
|
378
|
+
'might',
|
|
379
|
+
'must',
|
|
380
|
+
'shall',
|
|
381
|
+
'can',
|
|
382
|
+
'need',
|
|
383
|
+
'dare',
|
|
384
|
+
'ought',
|
|
385
|
+
'used',
|
|
386
|
+
'to',
|
|
387
|
+
'of',
|
|
388
|
+
'in',
|
|
389
|
+
'for',
|
|
390
|
+
'on',
|
|
391
|
+
'with',
|
|
392
|
+
'at',
|
|
393
|
+
'by',
|
|
394
|
+
'from',
|
|
395
|
+
'as',
|
|
396
|
+
'into',
|
|
397
|
+
'through',
|
|
398
|
+
'during',
|
|
399
|
+
'before',
|
|
400
|
+
'after',
|
|
401
|
+
'above',
|
|
402
|
+
'below',
|
|
403
|
+
'between',
|
|
404
|
+
'under',
|
|
405
|
+
'again',
|
|
406
|
+
'further',
|
|
407
|
+
'then',
|
|
408
|
+
'once',
|
|
409
|
+
'here',
|
|
410
|
+
'there',
|
|
411
|
+
'when',
|
|
412
|
+
'where',
|
|
413
|
+
'why',
|
|
414
|
+
'how',
|
|
415
|
+
'all',
|
|
416
|
+
'each',
|
|
417
|
+
'few',
|
|
418
|
+
'more',
|
|
419
|
+
'most',
|
|
420
|
+
'other',
|
|
421
|
+
'some',
|
|
422
|
+
'such',
|
|
423
|
+
'no',
|
|
424
|
+
'nor',
|
|
425
|
+
'not',
|
|
426
|
+
'only',
|
|
427
|
+
'own',
|
|
428
|
+
'same',
|
|
429
|
+
'so',
|
|
430
|
+
'than',
|
|
431
|
+
'too',
|
|
432
|
+
'very',
|
|
433
|
+
'just',
|
|
434
|
+
'and',
|
|
435
|
+
'but',
|
|
436
|
+
'if',
|
|
437
|
+
'or',
|
|
438
|
+
'because',
|
|
439
|
+
'until',
|
|
440
|
+
'while',
|
|
441
|
+
'this',
|
|
442
|
+
'that',
|
|
443
|
+
'these',
|
|
444
|
+
'those',
|
|
445
|
+
'it',
|
|
446
|
+
]);
|
|
447
|
+
return stopWords.has(token);
|
|
448
|
+
}
|
|
449
|
+
getBigrams(tokens) {
|
|
450
|
+
const bigrams = [];
|
|
451
|
+
for (let i = 0; i < tokens.length - 1; i++) {
|
|
452
|
+
bigrams.push(`${tokens[i]}_${tokens[i + 1]}`);
|
|
453
|
+
}
|
|
454
|
+
return bigrams;
|
|
455
|
+
}
|
|
456
|
+
hashString(str) {
|
|
457
|
+
let hash = 0;
|
|
458
|
+
for (let i = 0; i < str.length; i++) {
|
|
459
|
+
const char = str.charCodeAt(i);
|
|
460
|
+
hash = (hash << 5) - hash + char;
|
|
461
|
+
hash = hash & hash;
|
|
462
|
+
}
|
|
463
|
+
return Math.abs(hash);
|
|
464
|
+
}
|
|
465
|
+
getTokenIndex(token) {
|
|
466
|
+
if (!this.vocabulary.has(token)) {
|
|
467
|
+
this.vocabulary.set(token, this.vocabulary.size);
|
|
468
|
+
}
|
|
469
|
+
return this.vocabulary.get(token);
|
|
470
|
+
}
|
|
471
|
+
updateIDF(_newDocs) {
|
|
472
|
+
const tokenDocs = new Map();
|
|
473
|
+
for (let i = 0; i < this.documents.length; i++) {
|
|
474
|
+
const tokens = new Set(this.tokenize(this.documents[i]));
|
|
475
|
+
for (const token of tokens) {
|
|
476
|
+
if (!tokenDocs.has(token)) {
|
|
477
|
+
tokenDocs.set(token, new Set());
|
|
478
|
+
}
|
|
479
|
+
tokenDocs.get(token).add(i);
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
for (const [token, docs] of tokenDocs) {
|
|
483
|
+
this.idfScores.set(token, Math.log((this.documents.length + 1) / (docs.size + 1)) + 1);
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
normalize(vector) {
|
|
487
|
+
const magnitude = Math.sqrt(vector.reduce((sum, v) => sum + v * v, 0));
|
|
488
|
+
if (magnitude === 0)
|
|
489
|
+
return vector;
|
|
490
|
+
return vector.map((v) => v / magnitude);
|
|
491
|
+
}
|
|
492
|
+
/**
|
|
493
|
+
* Initialize semantic word clusters for domain-specific terms
|
|
494
|
+
* Words in the same cluster get similar vector contributions
|
|
495
|
+
*/
|
|
496
|
+
initializeSemanticClusters() {
|
|
497
|
+
const clusters = {
|
|
498
|
+
// Programming concepts
|
|
499
|
+
programming: [
|
|
500
|
+
'code',
|
|
501
|
+
'function',
|
|
502
|
+
'class',
|
|
503
|
+
'method',
|
|
504
|
+
'variable',
|
|
505
|
+
'const',
|
|
506
|
+
'let',
|
|
507
|
+
'var',
|
|
508
|
+
'import',
|
|
509
|
+
'export',
|
|
510
|
+
'async',
|
|
511
|
+
'await',
|
|
512
|
+
'promise',
|
|
513
|
+
'callback',
|
|
514
|
+
],
|
|
515
|
+
types: [
|
|
516
|
+
'type',
|
|
517
|
+
'interface',
|
|
518
|
+
'enum',
|
|
519
|
+
'string',
|
|
520
|
+
'number',
|
|
521
|
+
'boolean',
|
|
522
|
+
'array',
|
|
523
|
+
'object',
|
|
524
|
+
'null',
|
|
525
|
+
'undefined',
|
|
526
|
+
],
|
|
527
|
+
errors: [
|
|
528
|
+
'error',
|
|
529
|
+
'exception',
|
|
530
|
+
'throw',
|
|
531
|
+
'catch',
|
|
532
|
+
'try',
|
|
533
|
+
'finally',
|
|
534
|
+
'bug',
|
|
535
|
+
'fix',
|
|
536
|
+
'debug',
|
|
537
|
+
'trace',
|
|
538
|
+
'stack',
|
|
539
|
+
],
|
|
540
|
+
testing: [
|
|
541
|
+
'test',
|
|
542
|
+
'spec',
|
|
543
|
+
'describe',
|
|
544
|
+
'it',
|
|
545
|
+
'expect',
|
|
546
|
+
'assert',
|
|
547
|
+
'mock',
|
|
548
|
+
'stub',
|
|
549
|
+
'spy',
|
|
550
|
+
'coverage',
|
|
551
|
+
],
|
|
552
|
+
git: [
|
|
553
|
+
'git',
|
|
554
|
+
'commit',
|
|
555
|
+
'push',
|
|
556
|
+
'pull',
|
|
557
|
+
'merge',
|
|
558
|
+
'branch',
|
|
559
|
+
'checkout',
|
|
560
|
+
'rebase',
|
|
561
|
+
'stash',
|
|
562
|
+
'diff',
|
|
563
|
+
],
|
|
564
|
+
memory: [
|
|
565
|
+
'memory',
|
|
566
|
+
'cache',
|
|
567
|
+
'store',
|
|
568
|
+
'retrieve',
|
|
569
|
+
'query',
|
|
570
|
+
'embed',
|
|
571
|
+
'vector',
|
|
572
|
+
'semantic',
|
|
573
|
+
'context',
|
|
574
|
+
],
|
|
575
|
+
security: [
|
|
576
|
+
'security',
|
|
577
|
+
'auth',
|
|
578
|
+
'token',
|
|
579
|
+
'secret',
|
|
580
|
+
'password',
|
|
581
|
+
'encrypt',
|
|
582
|
+
'decrypt',
|
|
583
|
+
'hash',
|
|
584
|
+
'salt',
|
|
585
|
+
],
|
|
586
|
+
performance: [
|
|
587
|
+
'performance',
|
|
588
|
+
'optimize',
|
|
589
|
+
'fast',
|
|
590
|
+
'slow',
|
|
591
|
+
'latency',
|
|
592
|
+
'throughput',
|
|
593
|
+
'cache',
|
|
594
|
+
'batch',
|
|
595
|
+
],
|
|
596
|
+
database: [
|
|
597
|
+
'database',
|
|
598
|
+
'sql',
|
|
599
|
+
'query',
|
|
600
|
+
'table',
|
|
601
|
+
'index',
|
|
602
|
+
'schema',
|
|
603
|
+
'migration',
|
|
604
|
+
'insert',
|
|
605
|
+
'update',
|
|
606
|
+
'delete',
|
|
607
|
+
],
|
|
608
|
+
network: [
|
|
609
|
+
'network',
|
|
610
|
+
'http',
|
|
611
|
+
'api',
|
|
612
|
+
'request',
|
|
613
|
+
'response',
|
|
614
|
+
'endpoint',
|
|
615
|
+
'url',
|
|
616
|
+
'fetch',
|
|
617
|
+
'axios',
|
|
618
|
+
],
|
|
619
|
+
};
|
|
620
|
+
// Generate pseudo-random but consistent vectors for each cluster
|
|
621
|
+
for (const [clusterName, words] of Object.entries(clusters)) {
|
|
622
|
+
const clusterVector = this.generateClusterVector(clusterName);
|
|
623
|
+
for (const word of words) {
|
|
624
|
+
// Add slight variation for each word
|
|
625
|
+
const wordVector = clusterVector.map((v, i) => v + ((this.hashString(word + i.toString()) % 100) - 50) / 500);
|
|
626
|
+
this.wordVectors.set(word, wordVector);
|
|
627
|
+
}
|
|
628
|
+
}
|
|
629
|
+
}
|
|
630
|
+
generateClusterVector(seed) {
|
|
631
|
+
const vector = new Array(this.dimensions).fill(0);
|
|
632
|
+
const hash = this.hashString(seed);
|
|
633
|
+
// Create sparse activation pattern for this cluster
|
|
634
|
+
for (let i = 0; i < 20; i++) {
|
|
635
|
+
const idx = (hash + i * 17) % this.dimensions;
|
|
636
|
+
vector[idx] = ((hash + i) % 100) / 100;
|
|
637
|
+
}
|
|
638
|
+
return vector;
|
|
639
|
+
}
|
|
640
|
+
}
|
|
641
|
+
/**
|
|
642
|
+
* Embedding Service - Main interface for UAP memory system
|
|
643
|
+
* Automatically selects best available provider
|
|
644
|
+
*
|
|
645
|
+
* Priority: Ollama (local, free) > OpenAI > Local transformers > TF-IDF fallback
|
|
646
|
+
*/
|
|
647
|
+
export class EmbeddingService {
|
|
648
|
+
provider = null;
|
|
649
|
+
providers;
|
|
650
|
+
cache = new Map();
|
|
651
|
+
cacheMaxSize = 10000;
|
|
652
|
+
constructor(ollamaEndpoint, ollamaModel, llamaCppEndpoint) {
|
|
653
|
+
this.providers = [
|
|
654
|
+
new LlamaCppEmbeddingProvider(llamaCppEndpoint), // First priority - llama.cpp local server
|
|
655
|
+
new OllamaEmbeddingProvider(ollamaEndpoint, ollamaModel), // Second priority - Ollama local
|
|
656
|
+
new OpenAIEmbeddingProvider(),
|
|
657
|
+
new LocalEmbeddingProvider(),
|
|
658
|
+
new TFIDFEmbeddingProvider(),
|
|
659
|
+
];
|
|
660
|
+
}
|
|
661
|
+
async initialize() {
|
|
662
|
+
for (const provider of this.providers) {
|
|
663
|
+
if (await provider.isAvailable()) {
|
|
664
|
+
this.provider = provider;
|
|
665
|
+
console.log(`[EmbeddingService] Using provider: ${provider.name} (${provider.dimensions} dims)`);
|
|
666
|
+
return;
|
|
667
|
+
}
|
|
668
|
+
}
|
|
669
|
+
// Fallback to TF-IDF which is always available
|
|
670
|
+
this.provider = this.providers[this.providers.length - 1];
|
|
671
|
+
console.log(`[EmbeddingService] Fallback to TF-IDF provider`);
|
|
672
|
+
}
|
|
673
|
+
async embed(text) {
|
|
674
|
+
if (!this.provider) {
|
|
675
|
+
await this.initialize();
|
|
676
|
+
}
|
|
677
|
+
// Check cache (LRU: re-insert on hit to move to end of Map iteration order)
|
|
678
|
+
const cacheKey = this.getCacheKey(text);
|
|
679
|
+
if (this.cache.has(cacheKey)) {
|
|
680
|
+
const cached = this.cache.get(cacheKey);
|
|
681
|
+
// Move to end (most recently used) by re-inserting
|
|
682
|
+
this.cache.delete(cacheKey);
|
|
683
|
+
this.cache.set(cacheKey, cached);
|
|
684
|
+
return cached;
|
|
685
|
+
}
|
|
686
|
+
const embedding = await this.provider.embed(text);
|
|
687
|
+
// Update cache (LRU eviction: remove least recently used entry)
|
|
688
|
+
if (this.cache.size >= this.cacheMaxSize) {
|
|
689
|
+
// Remove LRU entry (first in Map iteration order)
|
|
690
|
+
const firstKey = this.cache.keys().next().value;
|
|
691
|
+
if (firstKey !== undefined) {
|
|
692
|
+
this.cache.delete(firstKey);
|
|
693
|
+
}
|
|
694
|
+
}
|
|
695
|
+
this.cache.set(cacheKey, embedding);
|
|
696
|
+
return embedding;
|
|
697
|
+
}
|
|
698
|
+
async embedBatch(texts) {
|
|
699
|
+
if (!this.provider) {
|
|
700
|
+
await this.initialize();
|
|
701
|
+
}
|
|
702
|
+
const results = [];
|
|
703
|
+
const uncachedTexts = [];
|
|
704
|
+
const uncachedIndices = [];
|
|
705
|
+
// Check cache for each text (LRU: re-insert on hit to mark as recently used)
|
|
706
|
+
for (let i = 0; i < texts.length; i++) {
|
|
707
|
+
const cacheKey = this.getCacheKey(texts[i]);
|
|
708
|
+
if (this.cache.has(cacheKey)) {
|
|
709
|
+
const cached = this.cache.get(cacheKey);
|
|
710
|
+
// Move to end (most recently used) by re-inserting
|
|
711
|
+
this.cache.delete(cacheKey);
|
|
712
|
+
this.cache.set(cacheKey, cached);
|
|
713
|
+
results[i] = cached;
|
|
714
|
+
}
|
|
715
|
+
else {
|
|
716
|
+
uncachedTexts.push(texts[i]);
|
|
717
|
+
uncachedIndices.push(i);
|
|
718
|
+
}
|
|
719
|
+
}
|
|
720
|
+
// Generate embeddings for uncached texts
|
|
721
|
+
if (uncachedTexts.length > 0) {
|
|
722
|
+
const newEmbeddings = await this.provider.embedBatch(uncachedTexts);
|
|
723
|
+
for (let i = 0; i < uncachedTexts.length; i++) {
|
|
724
|
+
const idx = uncachedIndices[i];
|
|
725
|
+
results[idx] = newEmbeddings[i];
|
|
726
|
+
// Update cache
|
|
727
|
+
const cacheKey = this.getCacheKey(uncachedTexts[i]);
|
|
728
|
+
if (this.cache.size < this.cacheMaxSize) {
|
|
729
|
+
this.cache.set(cacheKey, newEmbeddings[i]);
|
|
730
|
+
}
|
|
731
|
+
}
|
|
732
|
+
}
|
|
733
|
+
return results;
|
|
734
|
+
}
|
|
735
|
+
cosineSimilarity(a, b) {
|
|
736
|
+
if (a.length !== b.length) {
|
|
737
|
+
throw new Error('Vectors must have same dimensions');
|
|
738
|
+
}
|
|
739
|
+
let dotProduct = 0;
|
|
740
|
+
let normA = 0;
|
|
741
|
+
let normB = 0;
|
|
742
|
+
for (let i = 0; i < a.length; i++) {
|
|
743
|
+
dotProduct += a[i] * b[i];
|
|
744
|
+
normA += a[i] * a[i];
|
|
745
|
+
normB += b[i] * b[i];
|
|
746
|
+
}
|
|
747
|
+
const denominator = Math.sqrt(normA) * Math.sqrt(normB);
|
|
748
|
+
if (denominator === 0)
|
|
749
|
+
return 0;
|
|
750
|
+
return dotProduct / denominator;
|
|
751
|
+
}
|
|
752
|
+
getDimensions() {
|
|
753
|
+
return this.provider?.dimensions || 384;
|
|
754
|
+
}
|
|
755
|
+
getProviderName() {
|
|
756
|
+
return this.provider?.name || 'uninitialized';
|
|
757
|
+
}
|
|
758
|
+
getCacheKey(text) {
|
|
759
|
+
// Use SHA-256 hash to avoid collisions from truncation
|
|
760
|
+
return createHash('sha256').update(text.toLowerCase().trim()).digest('hex');
|
|
761
|
+
}
|
|
762
|
+
}
|
|
763
|
+
// Singleton instance
|
|
764
|
+
let embeddingServiceInstance = null;
|
|
765
|
+
export function getEmbeddingService() {
|
|
766
|
+
if (!embeddingServiceInstance) {
|
|
767
|
+
const llamaCppEndpoint = process.env.UAP_EMBEDDING_ENDPOINT || undefined;
|
|
768
|
+
embeddingServiceInstance = new EmbeddingService(undefined, undefined, llamaCppEndpoint);
|
|
769
|
+
}
|
|
770
|
+
return embeddingServiceInstance;
|
|
771
|
+
}
|
|
772
|
+
export async function generateEmbedding(text) {
|
|
773
|
+
const service = getEmbeddingService();
|
|
774
|
+
return service.embed(text);
|
|
775
|
+
}
|
|
776
|
+
export async function generateEmbeddings(texts) {
|
|
777
|
+
const service = getEmbeddingService();
|
|
778
|
+
return service.embedBatch(texts);
|
|
779
|
+
}
|
|
780
|
+
//# sourceMappingURL=embeddings.js.map
|