kynjal-cli 3.1.4 → 4.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/.claude/agents/core/coder.md +1 -1
- package/.claude/agents/core/planner.md +2 -2
- package/.claude/agents/core/researcher.md +1 -1
- package/.claude/agents/core/reviewer.md +1 -1
- package/.claude/agents/core/tester.md +1 -1
- package/.claude/agents/data/data-ml-model.md +4 -4
- package/.claude/agents/development/dev-backend-api.md +4 -4
- package/.claude/agents/documentation/docs-api-openapi.md +4 -4
- package/.claude/agents/github/code-review-swarm.md +2 -2
- package/.claude/agents/github/issue-tracker.md +2 -2
- package/.claude/agents/github/pr-manager.md +2 -2
- package/.claude/agents/github/release-manager.md +2 -2
- package/.claude/agents/github/workflow-automation.md +2 -2
- package/.claude/agents/sparc/architecture.md +3 -3
- package/.claude/agents/sparc/pseudocode.md +2 -2
- package/.claude/agents/sparc/refinement.md +3 -3
- package/.claude/agents/sparc/specification.md +2 -2
- package/.claude/agents/swarm/adaptive-coordinator.md +1 -1
- package/.claude/agents/swarm/hierarchical-coordinator.md +1 -1
- package/.claude/agents/swarm/mesh-coordinator.md +1 -1
- package/.claude/agents/templates/base-template-generator.md +25 -4
- package/.claude/agents/templates/sparc-coordinator.md +3 -3
- package/.claude/helpers/auto-commit.sh +1 -1
- package/.claude/helpers/auto-memory-hook.mjs +27 -9
- package/.claude/helpers/hook-handler.cjs +58 -18
- package/.claude/helpers/statusline.cjs +420 -613
- package/.claude/helpers/statusline.js +3 -3
- package/.claude/settings.json +9 -9
- package/.claude/skills/reasoningbank-intelligence/SKILL.md +2 -2
- package/.claude/skills/swarm-orchestration/SKILL.md +1 -1
- package/README.md +383 -170
- package/bin/cli.js +6 -6
- package/bin/mcp-server.js +1 -1
- package/bin/preinstall.cjs +2 -0
- package/dist/src/appliance/gguf-engine.js +664 -0
- package/dist/src/appliance/gguf-engine.js.map +1 -0
- package/dist/src/appliance/ruvllm-bridge.js +492 -0
- package/dist/src/appliance/ruvllm-bridge.js.map +1 -0
- package/dist/src/appliance/rvfa-builder.js +383 -0
- package/dist/src/appliance/rvfa-builder.js.map +1 -0
- package/dist/src/appliance/rvfa-distribution.js +533 -0
- package/dist/src/appliance/rvfa-distribution.js.map +1 -0
- package/dist/src/appliance/rvfa-format.js +465 -0
- package/dist/src/appliance/rvfa-format.js.map +1 -0
- package/dist/src/appliance/rvfa-runner.js +373 -0
- package/dist/src/appliance/rvfa-runner.js.map +1 -0
- package/dist/src/appliance/rvfa-signing.js +469 -0
- package/dist/src/appliance/rvfa-signing.js.map +1 -0
- package/dist/src/benchmarks/pretrain/index.js +542 -331
- package/dist/src/benchmarks/pretrain/index.js.map +1 -1
- package/dist/src/commands/agent.d.ts.map +1 -1
- package/dist/src/commands/agent.js +725 -502
- package/dist/src/commands/agent.js.map +1 -1
- package/dist/src/commands/analyze.js +1548 -1218
- package/dist/src/commands/analyze.js.map +1 -1
- package/dist/src/commands/appliance-advanced.d.ts +9 -0
- package/dist/src/commands/appliance-advanced.d.ts.map +1 -0
- package/dist/src/commands/appliance-advanced.js +324 -0
- package/dist/src/commands/appliance-advanced.js.map +1 -0
- package/dist/src/commands/appliance.d.ts +8 -0
- package/dist/src/commands/appliance.d.ts.map +1 -0
- package/dist/src/commands/appliance.js +581 -0
- package/dist/src/commands/appliance.js.map +1 -0
- package/dist/src/commands/benchmark.js +523 -372
- package/dist/src/commands/benchmark.js.map +1 -1
- package/dist/src/commands/claims.js +364 -274
- package/dist/src/commands/claims.js.map +1 -1
- package/dist/src/commands/cleanup.d.ts +13 -0
- package/dist/src/commands/cleanup.d.ts.map +1 -0
- package/dist/src/commands/cleanup.js +262 -0
- package/dist/src/commands/cleanup.js.map +1 -0
- package/dist/src/commands/completions.js +118 -477
- package/dist/src/commands/completions.js.map +1 -1
- package/dist/src/commands/config.js +303 -237
- package/dist/src/commands/config.js.map +1 -1
- package/dist/src/commands/daemon.d.ts.map +1 -1
- package/dist/src/commands/daemon.js +597 -425
- package/dist/src/commands/daemon.js.map +1 -1
- package/dist/src/commands/deployment.js +275 -194
- package/dist/src/commands/deployment.js.map +1 -1
- package/dist/src/commands/doctor.d.ts.map +1 -1
- package/dist/src/commands/doctor.js +690 -460
- package/dist/src/commands/doctor.js.map +1 -1
- package/dist/src/commands/embeddings.js +1543 -1293
- package/dist/src/commands/embeddings.js.map +1 -1
- package/dist/src/commands/guidance.js +596 -449
- package/dist/src/commands/guidance.js.map +1 -1
- package/dist/src/commands/hive-mind.js +938 -854
- package/dist/src/commands/hive-mind.js.map +1 -1
- package/dist/src/commands/hooks.d.ts.map +1 -1
- package/dist/src/commands/hooks.js +3677 -2570
- package/dist/src/commands/hooks.js.map +1 -1
- package/dist/src/commands/index.js +322 -122
- package/dist/src/commands/index.js.map +1 -1
- package/dist/src/commands/init.d.ts +1 -1
- package/dist/src/commands/init.d.ts.map +1 -1
- package/dist/src/commands/init.js +943 -787
- package/dist/src/commands/init.js.map +1 -1
- package/dist/src/commands/issues.js +558 -383
- package/dist/src/commands/issues.js.map +1 -1
- package/dist/src/commands/mcp.d.ts.map +1 -1
- package/dist/src/commands/mcp.js +605 -475
- package/dist/src/commands/mcp.js.map +1 -1
- package/dist/src/commands/memory.d.ts.map +1 -1
- package/dist/src/commands/memory.js +1031 -814
- package/dist/src/commands/memory.js.map +1 -1
- package/dist/src/commands/migrate.js +347 -282
- package/dist/src/commands/migrate.js.map +1 -1
- package/dist/src/commands/neural.d.ts.map +1 -1
- package/dist/src/commands/neural.js +1563 -1283
- package/dist/src/commands/neural.js.map +1 -1
- package/dist/src/commands/performance.js +643 -497
- package/dist/src/commands/performance.js.map +1 -1
- package/dist/src/commands/plugins.js +841 -668
- package/dist/src/commands/plugins.js.map +1 -1
- package/dist/src/commands/process.js +447 -392
- package/dist/src/commands/process.js.map +1 -1
- package/dist/src/commands/progress.js +256 -162
- package/dist/src/commands/progress.js.map +1 -1
- package/dist/src/commands/providers.js +220 -150
- package/dist/src/commands/providers.js.map +1 -1
- package/dist/src/commands/route.js +665 -520
- package/dist/src/commands/route.js.map +1 -1
- package/dist/src/commands/ruvector/backup.js +651 -505
- package/dist/src/commands/ruvector/backup.js.map +1 -1
- package/dist/src/commands/ruvector/benchmark.js +401 -349
- package/dist/src/commands/ruvector/benchmark.js.map +1 -1
- package/dist/src/commands/ruvector/import.js +267 -225
- package/dist/src/commands/ruvector/import.js.map +1 -1
- package/dist/src/commands/ruvector/index.js +75 -37
- package/dist/src/commands/ruvector/index.js.map +1 -1
- package/dist/src/commands/ruvector/init.js +359 -336
- package/dist/src/commands/ruvector/init.js.map +1 -1
- package/dist/src/commands/ruvector/migrate.js +322 -335
- package/dist/src/commands/ruvector/migrate.js.map +1 -1
- package/dist/src/commands/ruvector/optimize.js +431 -375
- package/dist/src/commands/ruvector/optimize.js.map +1 -1
- package/dist/src/commands/ruvector/setup.js +117 -703
- package/dist/src/commands/ruvector/setup.js.map +1 -1
- package/dist/src/commands/ruvector/status.js +419 -364
- package/dist/src/commands/ruvector/status.js.map +1 -1
- package/dist/src/commands/security.d.ts.map +1 -1
- package/dist/src/commands/security.js +610 -456
- package/dist/src/commands/security.js.map +1 -1
- package/dist/src/commands/session.d.ts +1 -1
- package/dist/src/commands/session.js +627 -505
- package/dist/src/commands/session.js.map +1 -1
- package/dist/src/commands/start.d.ts +1 -1
- package/dist/src/commands/start.js +368 -271
- package/dist/src/commands/start.js.map +1 -1
- package/dist/src/commands/status.d.ts +1 -1
- package/dist/src/commands/status.d.ts.map +1 -1
- package/dist/src/commands/status.js +492 -379
- package/dist/src/commands/status.js.map +1 -1
- package/dist/src/commands/swarm.js +488 -408
- package/dist/src/commands/swarm.js.map +1 -1
- package/dist/src/commands/task.d.ts +1 -1
- package/dist/src/commands/task.js +539 -424
- package/dist/src/commands/task.js.map +1 -1
- package/dist/src/commands/transfer-store.js +412 -322
- package/dist/src/commands/transfer-store.js.map +1 -1
- package/dist/src/commands/update.js +291 -196
- package/dist/src/commands/update.js.map +1 -1
- package/dist/src/commands/workflow.js +486 -386
- package/dist/src/commands/workflow.js.map +1 -1
- package/dist/src/config-adapter.js +40 -39
- package/dist/src/config-adapter.js.map +1 -1
- package/dist/src/index.js +416 -312
- package/dist/src/index.js.map +1 -1
- package/dist/src/infrastructure/in-memory-repositories.js +507 -246
- package/dist/src/infrastructure/in-memory-repositories.js.map +1 -1
- package/dist/src/init/claudemd-generator.js +78 -368
- package/dist/src/init/claudemd-generator.js.map +1 -1
- package/dist/src/init/executor.js +1019 -1345
- package/dist/src/init/executor.js.map +1 -1
- package/dist/src/init/helpers-generator.js +60 -635
- package/dist/src/init/helpers-generator.js.map +1 -1
- package/dist/src/init/index.d.ts +1 -1
- package/dist/src/init/index.d.ts.map +1 -1
- package/dist/src/init/index.js +1 -1
- package/dist/src/init/index.js.map +1 -1
- package/dist/src/init/mcp-generator.d.ts +0 -1
- package/dist/src/init/mcp-generator.d.ts.map +1 -1
- package/dist/src/init/mcp-generator.js +62 -42
- package/dist/src/init/mcp-generator.js.map +1 -1
- package/dist/src/init/settings-generator.d.ts.map +1 -1
- package/dist/src/init/settings-generator.js +167 -100
- package/dist/src/init/settings-generator.js.map +1 -1
- package/dist/src/init/statusline-generator.d.ts +16 -8
- package/dist/src/init/statusline-generator.d.ts.map +1 -1
- package/dist/src/init/statusline-generator.js +20 -1300
- package/dist/src/init/statusline-generator.js.map +1 -1
- package/dist/src/init/types.d.ts +15 -5
- package/dist/src/init/types.d.ts.map +1 -1
- package/dist/src/init/types.js +66 -76
- package/dist/src/init/types.js.map +1 -1
- package/dist/src/mcp-client.js +130 -76
- package/dist/src/mcp-client.js.map +1 -1
- package/dist/src/mcp-server.js +758 -445
- package/dist/src/mcp-server.js.map +1 -1
- package/dist/src/mcp-tools/agent-tools.js +492 -391
- package/dist/src/mcp-tools/agent-tools.js.map +1 -1
- package/dist/src/mcp-tools/agentdb-tools.d.ts +30 -0
- package/dist/src/mcp-tools/agentdb-tools.d.ts.map +1 -0
- package/dist/src/mcp-tools/agentdb-tools.js +758 -0
- package/dist/src/mcp-tools/agentdb-tools.js.map +1 -0
- package/dist/src/mcp-tools/analyze-tools.js +236 -172
- package/dist/src/mcp-tools/analyze-tools.js.map +1 -1
- package/dist/src/mcp-tools/auto-install.js +142 -80
- package/dist/src/mcp-tools/auto-install.js.map +1 -1
- package/dist/src/mcp-tools/browser-tools.js +375 -252
- package/dist/src/mcp-tools/browser-tools.js.map +1 -1
- package/dist/src/mcp-tools/claims-tools.js +565 -473
- package/dist/src/mcp-tools/claims-tools.js.map +1 -1
- package/dist/src/mcp-tools/config-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/config-tools.js +284 -190
- package/dist/src/mcp-tools/config-tools.js.map +1 -1
- package/dist/src/mcp-tools/coordination-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/coordination-tools.js +600 -349
- package/dist/src/mcp-tools/coordination-tools.js.map +1 -1
- package/dist/src/mcp-tools/daa-tools.js +367 -289
- package/dist/src/mcp-tools/daa-tools.js.map +1 -1
- package/dist/src/mcp-tools/embeddings-tools.js +693 -582
- package/dist/src/mcp-tools/embeddings-tools.js.map +1 -1
- package/dist/src/mcp-tools/github-tools.js +312 -261
- package/dist/src/mcp-tools/github-tools.js.map +1 -1
- package/dist/src/mcp-tools/hive-mind-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/hive-mind-tools.js +718 -423
- package/dist/src/mcp-tools/hive-mind-tools.js.map +1 -1
- package/dist/src/mcp-tools/hooks-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/hooks-tools.js +2726 -1978
- package/dist/src/mcp-tools/hooks-tools.js.map +1 -1
- package/dist/src/mcp-tools/index.d.ts +2 -0
- package/dist/src/mcp-tools/index.d.ts.map +1 -1
- package/dist/src/mcp-tools/index.js +2 -0
- package/dist/src/mcp-tools/index.js.map +1 -1
- package/dist/src/mcp-tools/memory-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/memory-tools.js +514 -329
- package/dist/src/mcp-tools/memory-tools.js.map +1 -1
- package/dist/src/mcp-tools/neural-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/neural-tools.js +428 -326
- package/dist/src/mcp-tools/neural-tools.js.map +1 -1
- package/dist/src/mcp-tools/performance-tools.js +480 -420
- package/dist/src/mcp-tools/performance-tools.js.map +1 -1
- package/dist/src/mcp-tools/progress-tools.js +278 -204
- package/dist/src/mcp-tools/progress-tools.js.map +1 -1
- package/dist/src/mcp-tools/ruvllm-tools.d.ts +9 -0
- package/dist/src/mcp-tools/ruvllm-tools.d.ts.map +1 -0
- package/dist/src/mcp-tools/ruvllm-tools.js +399 -0
- package/dist/src/mcp-tools/ruvllm-tools.js.map +1 -0
- package/dist/src/mcp-tools/security-tools.js +429 -297
- package/dist/src/mcp-tools/security-tools.js.map +1 -1
- package/dist/src/mcp-tools/session-tools.js +234 -185
- package/dist/src/mcp-tools/session-tools.js.map +1 -1
- package/dist/src/mcp-tools/swarm-tools.d.ts +2 -1
- package/dist/src/mcp-tools/swarm-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/swarm-tools.js +303 -64
- package/dist/src/mcp-tools/swarm-tools.js.map +1 -1
- package/dist/src/mcp-tools/system-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/system-tools.js +352 -200
- package/dist/src/mcp-tools/system-tools.js.map +1 -1
- package/dist/src/mcp-tools/task-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/task-tools.js +357 -189
- package/dist/src/mcp-tools/task-tools.js.map +1 -1
- package/dist/src/mcp-tools/terminal-tools.js +196 -148
- package/dist/src/mcp-tools/terminal-tools.js.map +1 -1
- package/dist/src/mcp-tools/transfer-tools.js +333 -186
- package/dist/src/mcp-tools/transfer-tools.js.map +1 -1
- package/dist/src/mcp-tools/wasm-agent-tools.d.ts +9 -0
- package/dist/src/mcp-tools/wasm-agent-tools.d.ts.map +1 -0
- package/dist/src/mcp-tools/wasm-agent-tools.js +377 -0
- package/dist/src/mcp-tools/wasm-agent-tools.js.map +1 -0
- package/dist/src/mcp-tools/workflow-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/workflow-tools.js +471 -335
- package/dist/src/mcp-tools/workflow-tools.js.map +1 -1
- package/dist/src/memory/ewc-consolidation.js +345 -173
- package/dist/src/memory/ewc-consolidation.js.map +1 -1
- package/dist/src/memory/intelligence.js +841 -359
- package/dist/src/memory/intelligence.js.map +1 -1
- package/dist/src/memory/memory-bridge.js +1964 -0
- package/dist/src/memory/memory-bridge.js.map +1 -0
- package/dist/src/memory/memory-initializer.js +1895 -1602
- package/dist/src/memory/memory-initializer.js.map +1 -1
- package/dist/src/memory/sona-optimizer.js +329 -199
- package/dist/src/memory/sona-optimizer.js.map +1 -1
- package/dist/src/output.d.ts +2 -2
- package/dist/src/output.d.ts.map +1 -1
- package/dist/src/output.js +273 -242
- package/dist/src/output.js.map +1 -1
- package/dist/src/parser.js +217 -124
- package/dist/src/parser.js.map +1 -1
- package/dist/src/plugins/manager.js +531 -278
- package/dist/src/plugins/manager.js.map +1 -1
- package/dist/src/plugins/store/discovery.js +362 -275
- package/dist/src/plugins/store/discovery.js.map +1 -1
- package/dist/src/plugins/store/index.js +105 -48
- package/dist/src/plugins/store/index.js.map +1 -1
- package/dist/src/plugins/store/search.js +107 -69
- package/dist/src/plugins/store/search.js.map +1 -1
- package/dist/src/plugins/tests/demo-plugin-store.js +160 -113
- package/dist/src/plugins/tests/demo-plugin-store.js.map +1 -1
- package/dist/src/plugins/tests/standalone-test.js +223 -172
- package/dist/src/plugins/tests/standalone-test.js.map +1 -1
- package/dist/src/plugins/tests/test-plugin-store.js +228 -190
- package/dist/src/plugins/tests/test-plugin-store.js.map +1 -1
- package/dist/src/production/circuit-breaker.js +126 -62
- package/dist/src/production/circuit-breaker.js.map +1 -1
- package/dist/src/production/error-handler.js +156 -86
- package/dist/src/production/error-handler.js.map +1 -1
- package/dist/src/production/monitoring.js +220 -139
- package/dist/src/production/monitoring.js.map +1 -1
- package/dist/src/production/rate-limiter.js +93 -74
- package/dist/src/production/rate-limiter.js.map +1 -1
- package/dist/src/production/retry.js +167 -75
- package/dist/src/production/retry.js.map +1 -1
- package/dist/src/prompt.js +560 -436
- package/dist/src/prompt.js.map +1 -1
- package/dist/src/runtime/headless.js +289 -200
- package/dist/src/runtime/headless.js.map +1 -1
- package/dist/src/ruvector/agent-wasm.js +511 -0
- package/dist/src/ruvector/agent-wasm.js.map +1 -0
- package/dist/src/ruvector/ast-analyzer.js +232 -145
- package/dist/src/ruvector/ast-analyzer.js.map +1 -1
- package/dist/src/ruvector/coverage-router.js +419 -287
- package/dist/src/ruvector/coverage-router.js.map +1 -1
- package/dist/src/ruvector/coverage-tools.js +101 -56
- package/dist/src/ruvector/coverage-tools.js.map +1 -1
- package/dist/src/ruvector/diff-classifier.js +451 -324
- package/dist/src/ruvector/diff-classifier.js.map +1 -1
- package/dist/src/ruvector/enhanced-model-router.js +337 -251
- package/dist/src/ruvector/enhanced-model-router.js.map +1 -1
- package/dist/src/ruvector/flash-attention.js +254 -223
- package/dist/src/ruvector/flash-attention.js.map +1 -1
- package/dist/src/ruvector/graph-analyzer.js +680 -486
- package/dist/src/ruvector/graph-analyzer.js.map +1 -1
- package/dist/src/ruvector/index.js +113 -27
- package/dist/src/ruvector/index.js.map +1 -1
- package/dist/src/ruvector/lora-adapter.js +248 -155
- package/dist/src/ruvector/lora-adapter.js.map +1 -1
- package/dist/src/ruvector/model-router.js +248 -175
- package/dist/src/ruvector/model-router.js.map +1 -1
- package/dist/src/ruvector/moe-router.js +286 -228
- package/dist/src/ruvector/moe-router.js.map +1 -1
- package/dist/src/ruvector/q-learning-router.js +338 -257
- package/dist/src/ruvector/q-learning-router.js.map +1 -1
- package/dist/src/ruvector/ruvllm-wasm.js +527 -0
- package/dist/src/ruvector/ruvllm-wasm.js.map +1 -0
- package/dist/src/ruvector/semantic-router.js +67 -60
- package/dist/src/ruvector/semantic-router.js.map +1 -1
- package/dist/src/ruvector/vector-db.js +205 -119
- package/dist/src/ruvector/vector-db.js.map +1 -1
- package/dist/src/services/agentic-flow-bridge.js +168 -0
- package/dist/src/services/agentic-flow-bridge.js.map +1 -0
- package/dist/src/services/claim-service.js +940 -615
- package/dist/src/services/claim-service.js.map +1 -1
- package/dist/src/services/container-worker-pool.js +669 -399
- package/dist/src/services/container-worker-pool.js.map +1 -1
- package/dist/src/services/headless-worker-executor.js +467 -441
- package/dist/src/services/headless-worker-executor.js.map +1 -1
- package/dist/src/services/index.d.ts +5 -5
- package/dist/src/services/index.d.ts.map +1 -1
- package/dist/src/services/index.js +4 -4
- package/dist/src/services/index.js.map +1 -1
- package/dist/src/services/registry-api.js +201 -93
- package/dist/src/services/registry-api.js.map +1 -1
- package/dist/src/services/ruvector-training.js +414 -144
- package/dist/src/services/ruvector-training.js.map +1 -1
- package/dist/src/services/worker-daemon.js +928 -531
- package/dist/src/services/worker-daemon.js.map +1 -1
- package/dist/src/services/worker-queue.js +550 -331
- package/dist/src/services/worker-queue.js.map +1 -1
- package/dist/src/suggest.js +55 -45
- package/dist/src/suggest.js.map +1 -1
- package/dist/src/transfer/anonymization/index.js +37 -29
- package/dist/src/transfer/anonymization/index.js.map +1 -1
- package/dist/src/transfer/deploy-seraphine.d.ts +1 -1
- package/dist/src/transfer/deploy-seraphine.js +156 -129
- package/dist/src/transfer/deploy-seraphine.js.map +1 -1
- package/dist/src/transfer/export.js +142 -84
- package/dist/src/transfer/export.js.map +1 -1
- package/dist/src/transfer/index.d.ts +1 -1
- package/dist/src/transfer/index.d.ts.map +1 -1
- package/dist/src/transfer/index.js +2 -0
- package/dist/src/transfer/index.js.map +1 -1
- package/dist/src/transfer/ipfs/client.js +337 -179
- package/dist/src/transfer/ipfs/client.js.map +1 -1
- package/dist/src/transfer/ipfs/upload.js +434 -290
- package/dist/src/transfer/ipfs/upload.js.map +1 -1
- package/dist/src/transfer/models/seraphine.js +58 -58
- package/dist/src/transfer/models/seraphine.js.map +1 -1
- package/dist/src/transfer/serialization/cfp.js +37 -33
- package/dist/src/transfer/serialization/cfp.js.map +1 -1
- package/dist/src/transfer/storage/gcs.js +248 -139
- package/dist/src/transfer/storage/gcs.js.map +1 -1
- package/dist/src/transfer/store/discovery.js +353 -243
- package/dist/src/transfer/store/discovery.js.map +1 -1
- package/dist/src/transfer/store/download.js +365 -243
- package/dist/src/transfer/store/download.js.map +1 -1
- package/dist/src/transfer/store/index.js +130 -63
- package/dist/src/transfer/store/index.js.map +1 -1
- package/dist/src/transfer/store/publish.js +258 -184
- package/dist/src/transfer/store/publish.js.map +1 -1
- package/dist/src/transfer/store/registry.js +73 -51
- package/dist/src/transfer/store/registry.js.map +1 -1
- package/dist/src/transfer/store/search.js +96 -64
- package/dist/src/transfer/store/search.js.map +1 -1
- package/dist/src/transfer/store/tests/standalone-test.js +231 -174
- package/dist/src/transfer/store/tests/standalone-test.js.map +1 -1
- package/dist/src/transfer/test-seraphine.js +130 -95
- package/dist/src/transfer/test-seraphine.js.map +1 -1
- package/dist/src/transfer/tests/test-store.js +239 -194
- package/dist/src/transfer/tests/test-store.js.map +1 -1
- package/dist/src/types.js +56 -27
- package/dist/src/types.js.map +1 -1
- package/dist/src/update/checker.js +183 -106
- package/dist/src/update/checker.js.map +1 -1
- package/dist/src/update/executor.js +198 -135
- package/dist/src/update/executor.js.map +1 -1
- package/dist/src/update/index.js +85 -38
- package/dist/src/update/index.js.map +1 -1
- package/dist/src/update/rate-limiter.js +31 -19
- package/dist/src/update/rate-limiter.js.map +1 -1
- package/dist/src/update/validator.js +64 -38
- package/dist/src/update/validator.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +13 -10
- package/.claude/agents/custom/accessibility-auditor.yaml +0 -56
- package/.claude/agents/custom/design-architect.yaml +0 -48
- package/.claude/agents/custom/ui-developer.yaml +0 -46
- package/.claude/agents/custom/ux-researcher.yaml +0 -60
- package/dist/src/benchmarks/pretrain/index.d.ts +0 -58
- package/dist/src/benchmarks/pretrain/index.d.ts.map +0 -1
- package/dist/src/commands/index.d.ts +0 -108
- package/dist/src/commands/index.d.ts.map +0 -1
- package/dist/src/config-adapter.d.ts +0 -15
- package/dist/src/config-adapter.d.ts.map +0 -1
- package/dist/src/index.d.ts +0 -76
- package/dist/src/index.d.ts.map +0 -1
- package/dist/src/infrastructure/in-memory-repositories.d.ts +0 -68
- package/dist/src/infrastructure/in-memory-repositories.d.ts.map +0 -1
- package/dist/src/init/claudemd-generator.d.ts +0 -25
- package/dist/src/init/claudemd-generator.d.ts.map +0 -1
- package/dist/src/init/executor.d.ts +0 -41
- package/dist/src/init/executor.d.ts.map +0 -1
- package/dist/src/init/helpers-generator.d.ts +0 -60
- package/dist/src/init/helpers-generator.d.ts.map +0 -1
- package/dist/src/mcp-client.d.ts +0 -92
- package/dist/src/mcp-client.d.ts.map +0 -1
- package/dist/src/mcp-server.d.ts +0 -161
- package/dist/src/mcp-server.d.ts.map +0 -1
- package/dist/src/mcp-tools/auto-install.d.ts +0 -83
- package/dist/src/mcp-tools/auto-install.d.ts.map +0 -1
- package/dist/src/mcp-tools/types.d.ts +0 -31
- package/dist/src/mcp-tools/types.d.ts.map +0 -1
- package/dist/src/memory/ewc-consolidation.d.ts +0 -271
- package/dist/src/memory/ewc-consolidation.d.ts.map +0 -1
- package/dist/src/memory/intelligence.d.ts +0 -285
- package/dist/src/memory/intelligence.d.ts.map +0 -1
- package/dist/src/memory/memory-initializer.d.ts +0 -396
- package/dist/src/memory/memory-initializer.d.ts.map +0 -1
- package/dist/src/memory/sona-optimizer.d.ts +0 -227
- package/dist/src/memory/sona-optimizer.d.ts.map +0 -1
- package/dist/src/parser.d.ts +0 -41
- package/dist/src/parser.d.ts.map +0 -1
- package/dist/src/plugins/manager.d.ts +0 -133
- package/dist/src/plugins/manager.d.ts.map +0 -1
- package/dist/src/plugins/store/discovery.d.ts +0 -88
- package/dist/src/plugins/store/discovery.d.ts.map +0 -1
- package/dist/src/plugins/store/index.d.ts +0 -76
- package/dist/src/plugins/store/index.d.ts.map +0 -1
- package/dist/src/plugins/store/search.d.ts +0 -46
- package/dist/src/plugins/store/search.d.ts.map +0 -1
- package/dist/src/plugins/store/types.d.ts +0 -274
- package/dist/src/plugins/store/types.d.ts.map +0 -1
- package/dist/src/production/circuit-breaker.d.ts +0 -101
- package/dist/src/production/circuit-breaker.d.ts.map +0 -1
- package/dist/src/production/error-handler.d.ts +0 -92
- package/dist/src/production/error-handler.d.ts.map +0 -1
- package/dist/src/production/monitoring.d.ts +0 -161
- package/dist/src/production/monitoring.d.ts.map +0 -1
- package/dist/src/production/rate-limiter.d.ts +0 -80
- package/dist/src/production/rate-limiter.d.ts.map +0 -1
- package/dist/src/production/retry.d.ts +0 -48
- package/dist/src/production/retry.d.ts.map +0 -1
- package/dist/src/prompt.d.ts +0 -44
- package/dist/src/prompt.d.ts.map +0 -1
- package/dist/src/runtime/headless.d.ts +0 -60
- package/dist/src/runtime/headless.d.ts.map +0 -1
- package/dist/src/ruvector/ast-analyzer.d.ts +0 -67
- package/dist/src/ruvector/ast-analyzer.d.ts.map +0 -1
- package/dist/src/ruvector/coverage-router.d.ts +0 -160
- package/dist/src/ruvector/coverage-router.d.ts.map +0 -1
- package/dist/src/ruvector/diff-classifier.d.ts +0 -175
- package/dist/src/ruvector/diff-classifier.d.ts.map +0 -1
- package/dist/src/ruvector/enhanced-model-router.d.ts +0 -146
- package/dist/src/ruvector/enhanced-model-router.d.ts.map +0 -1
- package/dist/src/ruvector/flash-attention.d.ts +0 -195
- package/dist/src/ruvector/flash-attention.d.ts.map +0 -1
- package/dist/src/ruvector/graph-analyzer.d.ts +0 -187
- package/dist/src/ruvector/graph-analyzer.d.ts.map +0 -1
- package/dist/src/ruvector/index.d.ts +0 -34
- package/dist/src/ruvector/index.d.ts.map +0 -1
- package/dist/src/ruvector/lora-adapter.d.ts +0 -218
- package/dist/src/ruvector/lora-adapter.d.ts.map +0 -1
- package/dist/src/ruvector/model-router.d.ts +0 -220
- package/dist/src/ruvector/model-router.d.ts.map +0 -1
- package/dist/src/ruvector/moe-router.d.ts +0 -206
- package/dist/src/ruvector/moe-router.d.ts.map +0 -1
- package/dist/src/ruvector/q-learning-router.d.ts +0 -211
- package/dist/src/ruvector/q-learning-router.d.ts.map +0 -1
- package/dist/src/ruvector/semantic-router.d.ts +0 -77
- package/dist/src/ruvector/semantic-router.d.ts.map +0 -1
- package/dist/src/ruvector/vector-db.d.ts +0 -69
- package/dist/src/ruvector/vector-db.d.ts.map +0 -1
- package/dist/src/services/claim-service.d.ts +0 -204
- package/dist/src/services/claim-service.d.ts.map +0 -1
- package/dist/src/services/container-worker-pool.d.ts +0 -197
- package/dist/src/services/container-worker-pool.d.ts.map +0 -1
- package/dist/src/services/headless-worker-executor.d.ts +0 -304
- package/dist/src/services/headless-worker-executor.d.ts.map +0 -1
- package/dist/src/services/registry-api.d.ts +0 -58
- package/dist/src/services/registry-api.d.ts.map +0 -1
- package/dist/src/services/ruvector-training.d.ts +0 -213
- package/dist/src/services/ruvector-training.d.ts.map +0 -1
- package/dist/src/services/worker-daemon.d.ts +0 -203
- package/dist/src/services/worker-daemon.d.ts.map +0 -1
- package/dist/src/services/worker-queue.d.ts +0 -194
- package/dist/src/services/worker-queue.d.ts.map +0 -1
- package/dist/src/suggest.d.ts +0 -53
- package/dist/src/suggest.d.ts.map +0 -1
- package/dist/src/transfer/export.d.ts +0 -25
- package/dist/src/transfer/export.d.ts.map +0 -1
- package/dist/src/transfer/ipfs/client.d.ts +0 -109
- package/dist/src/transfer/ipfs/client.d.ts.map +0 -1
- package/dist/src/transfer/ipfs/upload.d.ts +0 -95
- package/dist/src/transfer/ipfs/upload.d.ts.map +0 -1
- package/dist/src/transfer/models/seraphine.d.ts +0 -72
- package/dist/src/transfer/models/seraphine.d.ts.map +0 -1
- package/dist/src/transfer/serialization/cfp.d.ts +0 -49
- package/dist/src/transfer/serialization/cfp.d.ts.map +0 -1
- package/dist/src/transfer/storage/gcs.d.ts +0 -82
- package/dist/src/transfer/storage/gcs.d.ts.map +0 -1
- package/dist/src/transfer/store/discovery.d.ts +0 -84
- package/dist/src/transfer/store/discovery.d.ts.map +0 -1
- package/dist/src/transfer/store/download.d.ts +0 -70
- package/dist/src/transfer/store/download.d.ts.map +0 -1
- package/dist/src/transfer/store/index.d.ts +0 -84
- package/dist/src/transfer/store/index.d.ts.map +0 -1
- package/dist/src/transfer/store/publish.d.ts +0 -76
- package/dist/src/transfer/store/publish.d.ts.map +0 -1
- package/dist/src/transfer/store/search.d.ts +0 -54
- package/dist/src/transfer/store/search.d.ts.map +0 -1
- package/dist/src/transfer/types.d.ts +0 -245
- package/dist/src/transfer/types.d.ts.map +0 -1
- package/dist/src/types.d.ts +0 -198
- package/dist/src/types.d.ts.map +0 -1
- package/dist/src/update/checker.d.ts +0 -34
- package/dist/src/update/checker.d.ts.map +0 -1
- package/dist/src/update/executor.d.ts +0 -32
- package/dist/src/update/executor.d.ts.map +0 -1
- package/dist/src/update/index.d.ts +0 -33
- package/dist/src/update/index.d.ts.map +0 -1
- package/dist/src/update/rate-limiter.d.ts +0 -20
- package/dist/src/update/rate-limiter.d.ts.map +0 -1
- package/dist/src/update/validator.d.ts +0 -17
- package/dist/src/update/validator.d.ts.map +0 -1
|
@@ -12,573 +12,664 @@
|
|
|
12
12
|
*
|
|
13
13
|
* Created with ❤️ by ruv.io
|
|
14
14
|
*/
|
|
15
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
16
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
17
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
18
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
19
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
20
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
21
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
22
|
+
});
|
|
23
|
+
};
|
|
24
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
25
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
26
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
27
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
28
|
+
function step(op) {
|
|
29
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
30
|
+
while (_) try {
|
|
31
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
32
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
33
|
+
switch (op[0]) {
|
|
34
|
+
case 0: case 1: t = op; break;
|
|
35
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
36
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
37
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
38
|
+
default:
|
|
39
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
40
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
41
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
42
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
43
|
+
if (t[2]) _.ops.pop();
|
|
44
|
+
_.trys.pop(); continue;
|
|
45
|
+
}
|
|
46
|
+
op = body.call(thisArg, _);
|
|
47
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
48
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
49
|
+
}
|
|
50
|
+
};
|
|
15
51
|
import { output } from '../output.js';
|
|
16
52
|
// Dynamic imports for embeddings package
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
53
|
+
function getEmbeddings() {
|
|
54
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
55
|
+
var _a;
|
|
56
|
+
return __generator(this, function (_b) {
|
|
57
|
+
switch (_b.label) {
|
|
58
|
+
case 0:
|
|
59
|
+
_b.trys.push([0, 2, , 3]);
|
|
60
|
+
return [4 /*yield*/, import('@claude-flow/embeddings')];
|
|
61
|
+
case 1: return [2 /*return*/, _b.sent()];
|
|
62
|
+
case 2:
|
|
63
|
+
_a = _b.sent();
|
|
64
|
+
return [2 /*return*/, null];
|
|
65
|
+
case 3: return [2 /*return*/];
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
});
|
|
24
69
|
}
|
|
25
70
|
// Generate subcommand - REAL implementation
|
|
26
|
-
|
|
71
|
+
var generateCommand = {
|
|
27
72
|
name: 'generate',
|
|
28
73
|
description: 'Generate embeddings for text',
|
|
29
74
|
options: [
|
|
30
75
|
{ name: 'text', short: 't', type: 'string', description: 'Text to embed', required: true },
|
|
31
|
-
{ name: 'provider', short: 'p', type: 'string', description: 'Provider: openai, transformers, agentic-flow, local', default: 'local' },
|
|
76
|
+
{ name: 'provider', short: 'p', type: 'string', description: 'Provider: openai, transformers, agentic-flow, local', "default": 'local' },
|
|
32
77
|
{ name: 'model', short: 'm', type: 'string', description: 'Model to use' },
|
|
33
|
-
{ name: 'output', short: 'o', type: 'string', description: 'Output format: json, array, preview', default: 'preview' },
|
|
78
|
+
{ name: 'output', short: 'o', type: 'string', description: 'Output format: json, array, preview', "default": 'preview' },
|
|
34
79
|
],
|
|
35
80
|
examples: [
|
|
36
81
|
{ command: 'claude-flow embeddings generate -t "Hello world"', description: 'Generate embedding' },
|
|
37
82
|
{ command: 'claude-flow embeddings generate -t "Test" -o json', description: 'Output as JSON' },
|
|
38
83
|
],
|
|
39
|
-
action:
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
84
|
+
action: function (ctx) { return __awaiter(void 0, void 0, Promise, function () {
|
|
85
|
+
var text, provider, outputFormat, spinner, _a, generateEmbedding, loadEmbeddingModel, startTime, modelInfo, result, duration, preview, error_1;
|
|
86
|
+
return __generator(this, function (_b) {
|
|
87
|
+
switch (_b.label) {
|
|
88
|
+
case 0:
|
|
89
|
+
text = ctx.flags.text;
|
|
90
|
+
provider = ctx.flags.provider || 'local';
|
|
91
|
+
outputFormat = ctx.flags.output || 'preview';
|
|
92
|
+
if (!text) {
|
|
93
|
+
output.printError('Text is required');
|
|
94
|
+
return [2 /*return*/, { success: false, exitCode: 1 }];
|
|
95
|
+
}
|
|
96
|
+
output.writeln();
|
|
97
|
+
output.writeln(output.bold('Generate Embedding'));
|
|
98
|
+
output.writeln(output.dim('─'.repeat(50)));
|
|
99
|
+
spinner = output.createSpinner({ text: "Generating with " + provider + "...", spinner: 'dots' });
|
|
100
|
+
spinner.start();
|
|
101
|
+
_b.label = 1;
|
|
102
|
+
case 1:
|
|
103
|
+
_b.trys.push([1, 5, , 6]);
|
|
104
|
+
return [4 /*yield*/, import('../memory/memory-initializer.js')];
|
|
105
|
+
case 2:
|
|
106
|
+
_a = _b.sent(), generateEmbedding = _a.generateEmbedding, loadEmbeddingModel = _a.loadEmbeddingModel;
|
|
107
|
+
startTime = Date.now();
|
|
108
|
+
return [4 /*yield*/, loadEmbeddingModel({ verbose: false })];
|
|
109
|
+
case 3:
|
|
110
|
+
modelInfo = _b.sent();
|
|
111
|
+
return [4 /*yield*/, generateEmbedding(text)];
|
|
112
|
+
case 4:
|
|
113
|
+
result = _b.sent();
|
|
114
|
+
duration = Date.now() - startTime;
|
|
115
|
+
spinner.succeed("Embedding generated in " + duration + "ms");
|
|
116
|
+
if (outputFormat === 'json') {
|
|
117
|
+
output.printJson({
|
|
118
|
+
text: text.substring(0, 100),
|
|
119
|
+
embedding: result.embedding,
|
|
120
|
+
dimensions: result.dimensions,
|
|
121
|
+
model: result.model,
|
|
122
|
+
duration: duration
|
|
123
|
+
});
|
|
124
|
+
return [2 /*return*/, { success: true, data: result }];
|
|
125
|
+
}
|
|
126
|
+
if (outputFormat === 'array') {
|
|
127
|
+
output.writeln(JSON.stringify(result.embedding));
|
|
128
|
+
return [2 /*return*/, { success: true, data: result }];
|
|
129
|
+
}
|
|
130
|
+
preview = result.embedding.slice(0, 8).map(function (v) { return v.toFixed(6); });
|
|
131
|
+
output.writeln();
|
|
132
|
+
output.printBox([
|
|
133
|
+
"Provider: " + provider,
|
|
134
|
+
"Model: " + result.model + " (" + modelInfo.modelName + ")",
|
|
135
|
+
"Dimensions: " + result.dimensions,
|
|
136
|
+
"Text: \"" + text.substring(0, 40) + (text.length > 40 ? '...' : '') + "\"",
|
|
137
|
+
"Generation time: " + duration + "ms",
|
|
138
|
+
"",
|
|
139
|
+
"Vector preview (first 8 of " + result.dimensions + "):",
|
|
140
|
+
"[" + preview.join(', ') + ", ...]",
|
|
141
|
+
].join('\n'), 'Result');
|
|
142
|
+
return [2 /*return*/, { success: true, data: result }];
|
|
143
|
+
case 5:
|
|
144
|
+
error_1 = _b.sent();
|
|
145
|
+
spinner.fail('Embedding generation failed');
|
|
146
|
+
output.printError(error_1 instanceof Error ? error_1.message : String(error_1));
|
|
147
|
+
return [2 /*return*/, { success: false, exitCode: 1 }];
|
|
148
|
+
case 6: return [2 /*return*/];
|
|
73
149
|
}
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
output.writeln();
|
|
77
|
-
output.printBox([
|
|
78
|
-
`Provider: ${provider}`,
|
|
79
|
-
`Model: ${result.model} (${modelInfo.modelName})`,
|
|
80
|
-
`Dimensions: ${result.dimensions}`,
|
|
81
|
-
`Text: "${text.substring(0, 40)}${text.length > 40 ? '...' : ''}"`,
|
|
82
|
-
`Generation time: ${duration}ms`,
|
|
83
|
-
``,
|
|
84
|
-
`Vector preview (first 8 of ${result.dimensions}):`,
|
|
85
|
-
`[${preview.join(', ')}, ...]`,
|
|
86
|
-
].join('\n'), 'Result');
|
|
87
|
-
return { success: true, data: result };
|
|
88
|
-
}
|
|
89
|
-
catch (error) {
|
|
90
|
-
spinner.fail('Embedding generation failed');
|
|
91
|
-
output.printError(error instanceof Error ? error.message : String(error));
|
|
92
|
-
return { success: false, exitCode: 1 };
|
|
93
|
-
}
|
|
94
|
-
},
|
|
150
|
+
});
|
|
151
|
+
}); }
|
|
95
152
|
};
|
|
96
153
|
// Search subcommand - REAL implementation using sql.js
|
|
97
|
-
|
|
154
|
+
var searchCommand = {
|
|
98
155
|
name: 'search',
|
|
99
156
|
description: 'Semantic similarity search',
|
|
100
157
|
options: [
|
|
101
158
|
{ name: 'query', short: 'q', type: 'string', description: 'Search query', required: true },
|
|
102
|
-
{ name: 'collection', short: 'c', type: 'string', description: 'Namespace to search', default: 'default' },
|
|
103
|
-
{ name: 'limit', short: 'l', type: 'number', description: 'Max results', default: '10' },
|
|
104
|
-
{ name: 'threshold', short: 't', type: 'number', description: 'Similarity threshold (0-1)', default: '0.5' },
|
|
105
|
-
{ name: 'db-path', type: 'string', description: 'Database path', default: '.swarm/memory.db' },
|
|
159
|
+
{ name: 'collection', short: 'c', type: 'string', description: 'Namespace to search', "default": 'default' },
|
|
160
|
+
{ name: 'limit', short: 'l', type: 'number', description: 'Max results', "default": '10' },
|
|
161
|
+
{ name: 'threshold', short: 't', type: 'number', description: 'Similarity threshold (0-1)', "default": '0.5' },
|
|
162
|
+
{ name: 'db-path', type: 'string', description: 'Database path', "default": '.swarm/memory.db' },
|
|
106
163
|
],
|
|
107
164
|
examples: [
|
|
108
165
|
{ command: 'claude-flow embeddings search -q "error handling"', description: 'Search for similar' },
|
|
109
166
|
{ command: 'claude-flow embeddings search -q "test" -l 5', description: 'Limit results' },
|
|
110
167
|
],
|
|
111
|
-
action:
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
spinner.start();
|
|
126
|
-
try {
|
|
127
|
-
const fs = await import('fs');
|
|
128
|
-
const path = await import('path');
|
|
129
|
-
const fullDbPath = path.resolve(process.cwd(), dbPath);
|
|
130
|
-
// Check if database exists
|
|
131
|
-
if (!fs.existsSync(fullDbPath)) {
|
|
132
|
-
spinner.fail('Database not found');
|
|
133
|
-
output.printWarning(`No database at ${fullDbPath}`);
|
|
134
|
-
output.printInfo('Run: claude-flow memory init');
|
|
135
|
-
return { success: false, exitCode: 1 };
|
|
136
|
-
}
|
|
137
|
-
// Load sql.js
|
|
138
|
-
const initSqlJs = (await import('sql.js')).default;
|
|
139
|
-
const SQL = await initSqlJs();
|
|
140
|
-
const fileBuffer = fs.readFileSync(fullDbPath);
|
|
141
|
-
const db = new SQL.Database(fileBuffer);
|
|
142
|
-
const startTime = Date.now();
|
|
143
|
-
// Generate embedding for query
|
|
144
|
-
const { generateEmbedding } = await import('../memory/memory-initializer.js');
|
|
145
|
-
const queryResult = await generateEmbedding(query);
|
|
146
|
-
const queryEmbedding = queryResult.embedding;
|
|
147
|
-
// Get all entries with embeddings from database
|
|
148
|
-
const entries = db.exec(`
|
|
149
|
-
SELECT id, key, namespace, content, embedding, embedding_dimensions
|
|
150
|
-
FROM memory_entries
|
|
151
|
-
WHERE status = 'active'
|
|
152
|
-
AND embedding IS NOT NULL
|
|
153
|
-
${namespace !== 'all' ? `AND namespace = '${namespace}'` : ''}
|
|
154
|
-
LIMIT 1000
|
|
155
|
-
`);
|
|
156
|
-
const results = [];
|
|
157
|
-
if (entries[0]?.values) {
|
|
158
|
-
for (const row of entries[0].values) {
|
|
159
|
-
const [id, key, ns, content, embeddingJson] = row;
|
|
160
|
-
if (!embeddingJson)
|
|
161
|
-
continue;
|
|
162
|
-
try {
|
|
163
|
-
const embedding = JSON.parse(embeddingJson);
|
|
164
|
-
// Calculate cosine similarity
|
|
165
|
-
const similarity = cosineSimilarity(queryEmbedding, embedding);
|
|
166
|
-
if (similarity >= threshold) {
|
|
167
|
-
results.push({
|
|
168
|
-
score: similarity,
|
|
169
|
-
id: id.substring(0, 10),
|
|
170
|
-
key: key || id.substring(0, 15),
|
|
171
|
-
content: (content || '').substring(0, 45) + ((content || '').length > 45 ? '...' : ''),
|
|
172
|
-
namespace: ns || 'default'
|
|
173
|
-
});
|
|
174
|
-
}
|
|
168
|
+
action: function (ctx) { return __awaiter(void 0, void 0, Promise, function () {
|
|
169
|
+
var query, namespace, limit, threshold, dbPath, spinner, fs, path, fullDbPath, initSqlJs, SQL, fileBuffer, db, startTime, generateEmbedding, queryResult, queryEmbedding, entries, results, _i, _a, row, _b, id, key, ns, content, embeddingJson, embedding, similarity, keywordEntries, _loop_1, _c, _d, row, topResults, searchTime, error_2;
|
|
170
|
+
var _e, _f;
|
|
171
|
+
return __generator(this, function (_g) {
|
|
172
|
+
switch (_g.label) {
|
|
173
|
+
case 0:
|
|
174
|
+
query = ctx.flags.query;
|
|
175
|
+
namespace = ctx.flags.collection || 'default';
|
|
176
|
+
limit = parseInt(ctx.flags.limit || '10', 10);
|
|
177
|
+
threshold = parseFloat(ctx.flags.threshold || '0.5');
|
|
178
|
+
dbPath = ctx.flags['db-path'] || '.swarm/memory.db';
|
|
179
|
+
if (!query) {
|
|
180
|
+
output.printError('Query is required');
|
|
181
|
+
return [2 /*return*/, { success: false, exitCode: 1 }];
|
|
175
182
|
}
|
|
176
|
-
|
|
177
|
-
|
|
183
|
+
output.writeln();
|
|
184
|
+
output.writeln(output.bold('Semantic Search'));
|
|
185
|
+
output.writeln(output.dim('─'.repeat(60)));
|
|
186
|
+
spinner = output.createSpinner({ text: 'Searching...', spinner: 'dots' });
|
|
187
|
+
spinner.start();
|
|
188
|
+
_g.label = 1;
|
|
189
|
+
case 1:
|
|
190
|
+
_g.trys.push([1, 8, , 9]);
|
|
191
|
+
return [4 /*yield*/, import('fs')];
|
|
192
|
+
case 2:
|
|
193
|
+
fs = _g.sent();
|
|
194
|
+
return [4 /*yield*/, import('path')];
|
|
195
|
+
case 3:
|
|
196
|
+
path = _g.sent();
|
|
197
|
+
fullDbPath = path.resolve(process.cwd(), dbPath);
|
|
198
|
+
// Check if database exists
|
|
199
|
+
if (!fs.existsSync(fullDbPath)) {
|
|
200
|
+
spinner.fail('Database not found');
|
|
201
|
+
output.printWarning("No database at " + fullDbPath);
|
|
202
|
+
output.printInfo('Run: claude-flow memory init');
|
|
203
|
+
return [2 /*return*/, { success: false, exitCode: 1 }];
|
|
178
204
|
}
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
205
|
+
return [4 /*yield*/, import('sql.js')];
|
|
206
|
+
case 4:
|
|
207
|
+
initSqlJs = (_g.sent())["default"];
|
|
208
|
+
return [4 /*yield*/, initSqlJs()];
|
|
209
|
+
case 5:
|
|
210
|
+
SQL = _g.sent();
|
|
211
|
+
fileBuffer = fs.readFileSync(fullDbPath);
|
|
212
|
+
db = new SQL.Database(fileBuffer);
|
|
213
|
+
startTime = Date.now();
|
|
214
|
+
return [4 /*yield*/, import('../memory/memory-initializer.js')];
|
|
215
|
+
case 6:
|
|
216
|
+
generateEmbedding = (_g.sent()).generateEmbedding;
|
|
217
|
+
return [4 /*yield*/, generateEmbedding(query)];
|
|
218
|
+
case 7:
|
|
219
|
+
queryResult = _g.sent();
|
|
220
|
+
queryEmbedding = queryResult.embedding;
|
|
221
|
+
entries = db.exec("\n SELECT id, key, namespace, content, embedding, embedding_dimensions\n FROM memory_entries\n WHERE status = 'active'\n AND embedding IS NOT NULL\n " + (namespace !== 'all' ? "AND namespace = '" + namespace + "'" : '') + "\n LIMIT 1000\n ");
|
|
222
|
+
results = [];
|
|
223
|
+
if ((_e = entries[0]) === null || _e === void 0 ? void 0 : _e.values) {
|
|
224
|
+
for (_i = 0, _a = entries[0].values; _i < _a.length; _i++) {
|
|
225
|
+
row = _a[_i];
|
|
226
|
+
_b = row, id = _b[0], key = _b[1], ns = _b[2], content = _b[3], embeddingJson = _b[4];
|
|
227
|
+
if (!embeddingJson)
|
|
228
|
+
continue;
|
|
229
|
+
try {
|
|
230
|
+
embedding = JSON.parse(embeddingJson);
|
|
231
|
+
similarity = cosineSimilarity(queryEmbedding, embedding);
|
|
232
|
+
if (similarity >= threshold) {
|
|
233
|
+
results.push({
|
|
234
|
+
score: similarity,
|
|
235
|
+
id: id.substring(0, 10),
|
|
236
|
+
key: key || id.substring(0, 15),
|
|
237
|
+
content: (content || '').substring(0, 45) + ((content || '').length > 45 ? '...' : ''),
|
|
238
|
+
namespace: ns || 'default'
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
catch (_h) {
|
|
243
|
+
// Skip entries with invalid embeddings
|
|
244
|
+
}
|
|
203
245
|
}
|
|
204
246
|
}
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
247
|
+
// Also search entries without embeddings using keyword match
|
|
248
|
+
if (results.length < limit) {
|
|
249
|
+
keywordEntries = db.exec("\n SELECT id, key, namespace, content\n FROM memory_entries\n WHERE status = 'active'\n AND (content LIKE '%" + query.replace(/'/g, "''") + "%' OR key LIKE '%" + query.replace(/'/g, "''") + "%')\n " + (namespace !== 'all' ? "AND namespace = '" + namespace + "'" : '') + "\n LIMIT " + (limit - results.length) + "\n ");
|
|
250
|
+
if ((_f = keywordEntries[0]) === null || _f === void 0 ? void 0 : _f.values) {
|
|
251
|
+
_loop_1 = function (row) {
|
|
252
|
+
var _j = row, id = _j[0], key = _j[1], ns = _j[2], content = _j[3];
|
|
253
|
+
// Avoid duplicates
|
|
254
|
+
if (!results.some(function (r) { return r.id === id.substring(0, 10); })) {
|
|
255
|
+
results.push({
|
|
256
|
+
score: 0.5,
|
|
257
|
+
id: id.substring(0, 10),
|
|
258
|
+
key: key || id.substring(0, 15),
|
|
259
|
+
content: (content || '').substring(0, 45) + ((content || '').length > 45 ? '...' : ''),
|
|
260
|
+
namespace: ns || 'default'
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
};
|
|
264
|
+
for (_c = 0, _d = keywordEntries[0].values; _c < _d.length; _c++) {
|
|
265
|
+
row = _d[_c];
|
|
266
|
+
_loop_1(row);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
// Sort by score descending
|
|
271
|
+
results.sort(function (a, b) { return b.score - a.score; });
|
|
272
|
+
topResults = results.slice(0, limit);
|
|
273
|
+
searchTime = Date.now() - startTime;
|
|
274
|
+
db.close();
|
|
275
|
+
spinner.succeed("Found " + topResults.length + " matches (" + searchTime + "ms)");
|
|
276
|
+
if (topResults.length === 0) {
|
|
277
|
+
output.writeln();
|
|
278
|
+
output.printWarning('No matches found');
|
|
279
|
+
output.printInfo("Try: claude-flow memory store -k \"key\" --value \"your data\"");
|
|
280
|
+
return [2 /*return*/, { success: true, data: [] }];
|
|
281
|
+
}
|
|
282
|
+
output.writeln();
|
|
283
|
+
output.printTable({
|
|
284
|
+
columns: [
|
|
285
|
+
{ key: 'score', header: 'Score', width: 10 },
|
|
286
|
+
{ key: 'key', header: 'Key', width: 18 },
|
|
287
|
+
{ key: 'content', header: 'Content', width: 42 },
|
|
288
|
+
],
|
|
289
|
+
data: topResults.map(function (r) { return ({
|
|
290
|
+
score: r.score >= 0.8 ? output.success(r.score.toFixed(2)) :
|
|
291
|
+
r.score >= 0.6 ? output.warning(r.score.toFixed(2)) :
|
|
292
|
+
output.dim(r.score.toFixed(2)),
|
|
293
|
+
key: r.key,
|
|
294
|
+
content: r.content
|
|
295
|
+
}); })
|
|
296
|
+
});
|
|
297
|
+
output.writeln();
|
|
298
|
+
output.writeln(output.dim("Searched " + namespace + " namespace (" + queryResult.model + ", " + searchTime + "ms)"));
|
|
299
|
+
return [2 /*return*/, { success: true, data: topResults }];
|
|
300
|
+
case 8:
|
|
301
|
+
error_2 = _g.sent();
|
|
302
|
+
spinner.fail('Search failed');
|
|
303
|
+
output.printError(error_2 instanceof Error ? error_2.message : String(error_2));
|
|
304
|
+
return [2 /*return*/, { success: false, exitCode: 1 }];
|
|
305
|
+
case 9: return [2 /*return*/];
|
|
218
306
|
}
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
columns: [
|
|
222
|
-
{ key: 'score', header: 'Score', width: 10 },
|
|
223
|
-
{ key: 'key', header: 'Key', width: 18 },
|
|
224
|
-
{ key: 'content', header: 'Content', width: 42 },
|
|
225
|
-
],
|
|
226
|
-
data: topResults.map(r => ({
|
|
227
|
-
score: r.score >= 0.8 ? output.success(r.score.toFixed(2)) :
|
|
228
|
-
r.score >= 0.6 ? output.warning(r.score.toFixed(2)) :
|
|
229
|
-
output.dim(r.score.toFixed(2)),
|
|
230
|
-
key: r.key,
|
|
231
|
-
content: r.content
|
|
232
|
-
})),
|
|
233
|
-
});
|
|
234
|
-
output.writeln();
|
|
235
|
-
output.writeln(output.dim(`Searched ${namespace} namespace (${queryResult.model}, ${searchTime}ms)`));
|
|
236
|
-
return { success: true, data: topResults };
|
|
237
|
-
}
|
|
238
|
-
catch (error) {
|
|
239
|
-
spinner.fail('Search failed');
|
|
240
|
-
output.printError(error instanceof Error ? error.message : String(error));
|
|
241
|
-
return { success: false, exitCode: 1 };
|
|
242
|
-
}
|
|
243
|
-
},
|
|
307
|
+
});
|
|
308
|
+
}); }
|
|
244
309
|
};
|
|
245
310
|
/**
|
|
246
311
|
* Optimized cosine similarity
|
|
247
312
|
* V8 JIT-friendly - ~0.5μs per 384-dim vector comparison
|
|
248
313
|
*/
|
|
249
314
|
function cosineSimilarity(a, b) {
|
|
250
|
-
|
|
315
|
+
var len = Math.min(a.length, b.length);
|
|
251
316
|
if (len === 0)
|
|
252
317
|
return 0;
|
|
253
|
-
|
|
318
|
+
var dot = 0, normA = 0, normB = 0;
|
|
254
319
|
// Simple loop - V8 optimizes this well
|
|
255
|
-
for (
|
|
256
|
-
|
|
320
|
+
for (var i = 0; i < len; i++) {
|
|
321
|
+
var ai = a[i], bi = b[i];
|
|
257
322
|
dot += ai * bi;
|
|
258
323
|
normA += ai * ai;
|
|
259
324
|
normB += bi * bi;
|
|
260
325
|
}
|
|
261
|
-
|
|
326
|
+
var mag = Math.sqrt(normA * normB);
|
|
262
327
|
return mag === 0 ? 0 : dot / mag;
|
|
263
328
|
}
|
|
264
329
|
// Compare subcommand - REAL similarity computation
|
|
265
|
-
|
|
330
|
+
var compareCommand = {
|
|
266
331
|
name: 'compare',
|
|
267
332
|
description: 'Compare similarity between texts',
|
|
268
333
|
options: [
|
|
269
334
|
{ name: 'text1', type: 'string', description: 'First text', required: true },
|
|
270
335
|
{ name: 'text2', type: 'string', description: 'Second text', required: true },
|
|
271
|
-
{ name: 'metric', short: 'm', type: 'string', description: 'Metric: cosine, euclidean, dot', default: 'cosine' },
|
|
336
|
+
{ name: 'metric', short: 'm', type: 'string', description: 'Metric: cosine, euclidean, dot', "default": 'cosine' },
|
|
272
337
|
],
|
|
273
338
|
examples: [
|
|
274
339
|
{ command: 'claude-flow embeddings compare --text1 "Hello" --text2 "Hi there"', description: 'Compare texts' },
|
|
275
340
|
],
|
|
276
|
-
action:
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
const spinner = output.createSpinner({ text: 'Generating embeddings...', spinner: 'dots' });
|
|
288
|
-
spinner.start();
|
|
289
|
-
try {
|
|
290
|
-
const { generateEmbedding } = await import('../memory/memory-initializer.js');
|
|
291
|
-
// Generate real embeddings for both texts
|
|
292
|
-
const startTime = Date.now();
|
|
293
|
-
const [emb1, emb2] = await Promise.all([
|
|
294
|
-
generateEmbedding(text1),
|
|
295
|
-
generateEmbedding(text2),
|
|
296
|
-
]);
|
|
297
|
-
const embedTime = Date.now() - startTime;
|
|
298
|
-
spinner.setText('Computing similarity...');
|
|
299
|
-
// Compute real similarity based on metric
|
|
300
|
-
let similarity;
|
|
301
|
-
switch (metric) {
|
|
302
|
-
case 'euclidean': {
|
|
303
|
-
// Euclidean distance (converted to similarity: 1 / (1 + distance))
|
|
304
|
-
let sumSq = 0;
|
|
305
|
-
for (let i = 0; i < emb1.embedding.length; i++) {
|
|
306
|
-
const diff = emb1.embedding[i] - emb2.embedding[i];
|
|
307
|
-
sumSq += diff * diff;
|
|
341
|
+
action: function (ctx) { return __awaiter(void 0, void 0, Promise, function () {
|
|
342
|
+
var text1, text2, metric, spinner, generateEmbedding, startTime, _a, emb1, emb2, embedTime, similarity, sumSq, i, diff, distance, dot, i, error_3;
|
|
343
|
+
return __generator(this, function (_b) {
|
|
344
|
+
switch (_b.label) {
|
|
345
|
+
case 0:
|
|
346
|
+
text1 = ctx.flags.text1;
|
|
347
|
+
text2 = ctx.flags.text2;
|
|
348
|
+
metric = ctx.flags.metric || 'cosine';
|
|
349
|
+
if (!text1 || !text2) {
|
|
350
|
+
output.printError('Both text1 and text2 are required');
|
|
351
|
+
return [2 /*return*/, { success: false, exitCode: 1 }];
|
|
308
352
|
}
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
353
|
+
output.writeln();
|
|
354
|
+
output.writeln(output.bold('Text Similarity (Real)'));
|
|
355
|
+
output.writeln(output.dim('─'.repeat(50)));
|
|
356
|
+
spinner = output.createSpinner({ text: 'Generating embeddings...', spinner: 'dots' });
|
|
357
|
+
spinner.start();
|
|
358
|
+
_b.label = 1;
|
|
359
|
+
case 1:
|
|
360
|
+
_b.trys.push([1, 4, , 5]);
|
|
361
|
+
return [4 /*yield*/, import('../memory/memory-initializer.js')];
|
|
362
|
+
case 2:
|
|
363
|
+
generateEmbedding = (_b.sent()).generateEmbedding;
|
|
364
|
+
startTime = Date.now();
|
|
365
|
+
return [4 /*yield*/, Promise.all([
|
|
366
|
+
generateEmbedding(text1),
|
|
367
|
+
generateEmbedding(text2),
|
|
368
|
+
])];
|
|
369
|
+
case 3:
|
|
370
|
+
_a = _b.sent(), emb1 = _a[0], emb2 = _a[1];
|
|
371
|
+
embedTime = Date.now() - startTime;
|
|
372
|
+
spinner.setText('Computing similarity...');
|
|
373
|
+
similarity = void 0;
|
|
374
|
+
switch (metric) {
|
|
375
|
+
case 'euclidean': {
|
|
376
|
+
sumSq = 0;
|
|
377
|
+
for (i = 0; i < emb1.embedding.length; i++) {
|
|
378
|
+
diff = emb1.embedding[i] - emb2.embedding[i];
|
|
379
|
+
sumSq += diff * diff;
|
|
380
|
+
}
|
|
381
|
+
distance = Math.sqrt(sumSq);
|
|
382
|
+
similarity = 1 / (1 + distance);
|
|
383
|
+
break;
|
|
384
|
+
}
|
|
385
|
+
case 'dot': {
|
|
386
|
+
dot = 0;
|
|
387
|
+
for (i = 0; i < emb1.embedding.length; i++) {
|
|
388
|
+
dot += emb1.embedding[i] * emb2.embedding[i];
|
|
389
|
+
}
|
|
390
|
+
similarity = dot;
|
|
391
|
+
break;
|
|
392
|
+
}
|
|
393
|
+
case 'cosine':
|
|
394
|
+
default: {
|
|
395
|
+
// Cosine similarity
|
|
396
|
+
similarity = cosineSimilarity(emb1.embedding, emb2.embedding);
|
|
397
|
+
}
|
|
318
398
|
}
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
399
|
+
spinner.succeed("Comparison complete (" + embedTime + "ms)");
|
|
400
|
+
output.writeln();
|
|
401
|
+
output.printBox([
|
|
402
|
+
"Text 1: \"" + text1.substring(0, 30) + (text1.length > 30 ? '...' : '') + "\"",
|
|
403
|
+
"Text 2: \"" + text2.substring(0, 30) + (text2.length > 30 ? '...' : '') + "\"",
|
|
404
|
+
"",
|
|
405
|
+
"Model: " + emb1.model + " (" + emb1.dimensions + "-dim)",
|
|
406
|
+
"Metric: " + metric,
|
|
407
|
+
"Similarity: " + (similarity > 0.8 ? output.success(similarity.toFixed(4)) : similarity > 0.5 ? output.warning(similarity.toFixed(4)) : output.dim(similarity.toFixed(4))),
|
|
408
|
+
"",
|
|
409
|
+
"Interpretation: " + (similarity > 0.8 ? 'Highly similar' : similarity > 0.5 ? 'Moderately similar' : 'Dissimilar'),
|
|
410
|
+
].join('\n'), 'Result');
|
|
411
|
+
return [2 /*return*/, { success: true, data: { similarity: similarity, metric: metric, embedTime: embedTime } }];
|
|
412
|
+
case 4:
|
|
413
|
+
error_3 = _b.sent();
|
|
414
|
+
spinner.fail('Comparison failed');
|
|
415
|
+
output.printError(error_3 instanceof Error ? error_3.message : String(error_3));
|
|
416
|
+
return [2 /*return*/, { success: false, exitCode: 1 }];
|
|
417
|
+
case 5: return [2 /*return*/];
|
|
327
418
|
}
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
output.printBox([
|
|
331
|
-
`Text 1: "${text1.substring(0, 30)}${text1.length > 30 ? '...' : ''}"`,
|
|
332
|
-
`Text 2: "${text2.substring(0, 30)}${text2.length > 30 ? '...' : ''}"`,
|
|
333
|
-
``,
|
|
334
|
-
`Model: ${emb1.model} (${emb1.dimensions}-dim)`,
|
|
335
|
-
`Metric: ${metric}`,
|
|
336
|
-
`Similarity: ${similarity > 0.8 ? output.success(similarity.toFixed(4)) : similarity > 0.5 ? output.warning(similarity.toFixed(4)) : output.dim(similarity.toFixed(4))}`,
|
|
337
|
-
``,
|
|
338
|
-
`Interpretation: ${similarity > 0.8 ? 'Highly similar' : similarity > 0.5 ? 'Moderately similar' : 'Dissimilar'}`,
|
|
339
|
-
].join('\n'), 'Result');
|
|
340
|
-
return { success: true, data: { similarity, metric, embedTime } };
|
|
341
|
-
}
|
|
342
|
-
catch (error) {
|
|
343
|
-
spinner.fail('Comparison failed');
|
|
344
|
-
output.printError(error instanceof Error ? error.message : String(error));
|
|
345
|
-
return { success: false, exitCode: 1 };
|
|
346
|
-
}
|
|
347
|
-
},
|
|
419
|
+
});
|
|
420
|
+
}); }
|
|
348
421
|
};
|
|
349
422
|
// Collections subcommand - REAL implementation using sql.js
|
|
350
|
-
|
|
423
|
+
var collectionsCommand = {
|
|
351
424
|
name: 'collections',
|
|
352
425
|
description: 'Manage embedding collections (namespaces)',
|
|
353
426
|
options: [
|
|
354
|
-
{ name: 'action', short: 'a', type: 'string', description: 'Action: list, stats', default: 'list' },
|
|
427
|
+
{ name: 'action', short: 'a', type: 'string', description: 'Action: list, stats', "default": 'list' },
|
|
355
428
|
{ name: 'name', short: 'n', type: 'string', description: 'Namespace name' },
|
|
356
|
-
{ name: 'db-path', type: 'string', description: 'Database path', default: '.swarm/memory.db' },
|
|
429
|
+
{ name: 'db-path', type: 'string', description: 'Database path', "default": '.swarm/memory.db' },
|
|
357
430
|
],
|
|
358
431
|
examples: [
|
|
359
432
|
{ command: 'claude-flow embeddings collections', description: 'List collections' },
|
|
360
433
|
{ command: 'claude-flow embeddings collections -a stats', description: 'Show detailed stats' },
|
|
361
434
|
],
|
|
362
|
-
action:
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
435
|
+
action: function (ctx) { return __awaiter(void 0, void 0, Promise, function () {
|
|
436
|
+
var action, dbPath, fs, path, fullDbPath, initSqlJs, SQL, fileBuffer, db, statsQuery, indexQuery, collections, _i, _a, row, _b, namespace, total, withEmbeddings, avgDims, contentSize, error_4;
|
|
437
|
+
var _c;
|
|
438
|
+
return __generator(this, function (_d) {
|
|
439
|
+
switch (_d.label) {
|
|
440
|
+
case 0:
|
|
441
|
+
action = ctx.flags.action || 'list';
|
|
442
|
+
dbPath = ctx.flags['db-path'] || '.swarm/memory.db';
|
|
443
|
+
output.writeln();
|
|
444
|
+
output.writeln(output.bold('Embedding Collections (Namespaces)'));
|
|
445
|
+
output.writeln(output.dim('─'.repeat(60)));
|
|
446
|
+
_d.label = 1;
|
|
447
|
+
case 1:
|
|
448
|
+
_d.trys.push([1, 6, , 7]);
|
|
449
|
+
return [4 /*yield*/, import('fs')];
|
|
450
|
+
case 2:
|
|
451
|
+
fs = _d.sent();
|
|
452
|
+
return [4 /*yield*/, import('path')];
|
|
453
|
+
case 3:
|
|
454
|
+
path = _d.sent();
|
|
455
|
+
fullDbPath = path.resolve(process.cwd(), dbPath);
|
|
456
|
+
// Check if database exists
|
|
457
|
+
if (!fs.existsSync(fullDbPath)) {
|
|
458
|
+
output.printWarning('No database found');
|
|
459
|
+
output.printInfo('Run: claude-flow memory init');
|
|
460
|
+
output.writeln();
|
|
461
|
+
output.writeln(output.dim('No collections yet - initialize memory first'));
|
|
462
|
+
return [2 /*return*/, { success: true, data: [] }];
|
|
463
|
+
}
|
|
464
|
+
return [4 /*yield*/, import('sql.js')];
|
|
465
|
+
case 4:
|
|
466
|
+
initSqlJs = (_d.sent())["default"];
|
|
467
|
+
return [4 /*yield*/, initSqlJs()];
|
|
468
|
+
case 5:
|
|
469
|
+
SQL = _d.sent();
|
|
470
|
+
fileBuffer = fs.readFileSync(fullDbPath);
|
|
471
|
+
db = new SQL.Database(fileBuffer);
|
|
472
|
+
statsQuery = db.exec("\n SELECT\n namespace,\n COUNT(*) as total_entries,\n SUM(CASE WHEN embedding IS NOT NULL THEN 1 ELSE 0 END) as with_embeddings,\n AVG(embedding_dimensions) as avg_dimensions,\n SUM(LENGTH(content)) as total_content_size\n FROM memory_entries\n WHERE status = 'active'\n GROUP BY namespace\n ORDER BY total_entries DESC\n ");
|
|
473
|
+
indexQuery = db.exec("SELECT name, dimensions, hnsw_m FROM vector_indexes");
|
|
474
|
+
collections = [];
|
|
475
|
+
if ((_c = statsQuery[0]) === null || _c === void 0 ? void 0 : _c.values) {
|
|
476
|
+
for (_i = 0, _a = statsQuery[0].values; _i < _a.length; _i++) {
|
|
477
|
+
row = _a[_i];
|
|
478
|
+
_b = row, namespace = _b[0], total = _b[1], withEmbeddings = _b[2], avgDims = _b[3], contentSize = _b[4];
|
|
479
|
+
collections.push({
|
|
480
|
+
name: namespace || 'default',
|
|
481
|
+
vectors: withEmbeddings.toLocaleString(),
|
|
482
|
+
total: total.toLocaleString(),
|
|
483
|
+
dimensions: avgDims ? Math.round(avgDims).toString() : '-',
|
|
484
|
+
index: withEmbeddings > 0 ? 'HNSW' : 'None',
|
|
485
|
+
size: formatBytes(contentSize || 0)
|
|
486
|
+
});
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
db.close();
|
|
490
|
+
if (collections.length === 0) {
|
|
491
|
+
output.printWarning('No collections found');
|
|
492
|
+
output.writeln();
|
|
493
|
+
output.writeln(output.dim('Store some data first:'));
|
|
494
|
+
output.writeln(output.highlight(' claude-flow memory store -k "key" --value "data"'));
|
|
495
|
+
return [2 /*return*/, { success: true, data: [] }];
|
|
496
|
+
}
|
|
497
|
+
output.printTable({
|
|
498
|
+
columns: [
|
|
499
|
+
{ key: 'name', header: 'Namespace', width: 18 },
|
|
500
|
+
{ key: 'total', header: 'Entries', width: 10 },
|
|
501
|
+
{ key: 'vectors', header: 'Vectors', width: 10 },
|
|
502
|
+
{ key: 'dimensions', header: 'Dims', width: 8 },
|
|
503
|
+
{ key: 'index', header: 'Index', width: 8 },
|
|
504
|
+
{ key: 'size', header: 'Size', width: 10 },
|
|
505
|
+
],
|
|
506
|
+
data: collections
|
|
411
507
|
});
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
return { success: true, data: [] };
|
|
508
|
+
output.writeln();
|
|
509
|
+
output.writeln(output.dim("Database: " + fullDbPath));
|
|
510
|
+
return [2 /*return*/, { success: true, data: collections }];
|
|
511
|
+
case 6:
|
|
512
|
+
error_4 = _d.sent();
|
|
513
|
+
output.printError(error_4 instanceof Error ? error_4.message : String(error_4));
|
|
514
|
+
return [2 /*return*/, { success: false, exitCode: 1 }];
|
|
515
|
+
case 7: return [2 /*return*/];
|
|
421
516
|
}
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
{ key: 'name', header: 'Namespace', width: 18 },
|
|
425
|
-
{ key: 'total', header: 'Entries', width: 10 },
|
|
426
|
-
{ key: 'vectors', header: 'Vectors', width: 10 },
|
|
427
|
-
{ key: 'dimensions', header: 'Dims', width: 8 },
|
|
428
|
-
{ key: 'index', header: 'Index', width: 8 },
|
|
429
|
-
{ key: 'size', header: 'Size', width: 10 },
|
|
430
|
-
],
|
|
431
|
-
data: collections,
|
|
432
|
-
});
|
|
433
|
-
output.writeln();
|
|
434
|
-
output.writeln(output.dim(`Database: ${fullDbPath}`));
|
|
435
|
-
return { success: true, data: collections };
|
|
436
|
-
}
|
|
437
|
-
catch (error) {
|
|
438
|
-
output.printError(error instanceof Error ? error.message : String(error));
|
|
439
|
-
return { success: false, exitCode: 1 };
|
|
440
|
-
}
|
|
441
|
-
},
|
|
517
|
+
});
|
|
518
|
+
}); }
|
|
442
519
|
};
|
|
443
520
|
// Helper: Format bytes to human readable
|
|
444
521
|
function formatBytes(bytes) {
|
|
445
522
|
if (bytes === 0)
|
|
446
523
|
return '0 B';
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
524
|
+
var k = 1024;
|
|
525
|
+
var sizes = ['B', 'KB', 'MB', 'GB'];
|
|
526
|
+
var i = Math.floor(Math.log(bytes) / Math.log(k));
|
|
450
527
|
return parseFloat((bytes / Math.pow(k, i)).toFixed(1)) + ' ' + sizes[i];
|
|
451
528
|
}
|
|
452
529
|
// Index subcommand - REAL HNSW stats
|
|
453
|
-
|
|
530
|
+
var indexCommand = {
|
|
454
531
|
name: 'index',
|
|
455
532
|
description: 'Manage HNSW indexes',
|
|
456
533
|
options: [
|
|
457
|
-
{ name: 'action', short: 'a', type: 'string', description: 'Action: build, rebuild, status, optimize', default: 'status' },
|
|
534
|
+
{ name: 'action', short: 'a', type: 'string', description: 'Action: build, rebuild, status, optimize', "default": 'status' },
|
|
458
535
|
{ name: 'collection', short: 'c', type: 'string', description: 'Collection/namespace name' },
|
|
459
|
-
{ name: 'ef-construction', type: 'number', description: 'HNSW ef_construction parameter', default: '200' },
|
|
460
|
-
{ name: 'm', type: 'number', description: 'HNSW M parameter', default: '16' },
|
|
536
|
+
{ name: 'ef-construction', type: 'number', description: 'HNSW ef_construction parameter', "default": '200' },
|
|
537
|
+
{ name: 'm', type: 'number', description: 'HNSW M parameter', "default": '16' },
|
|
461
538
|
],
|
|
462
539
|
examples: [
|
|
463
540
|
{ command: 'claude-flow embeddings index', description: 'Show index status' },
|
|
464
541
|
{ command: 'claude-flow embeddings index -a build -c documents', description: 'Build index' },
|
|
465
542
|
{ command: 'claude-flow embeddings index -a optimize -c patterns', description: 'Optimize index' },
|
|
466
543
|
],
|
|
467
|
-
action:
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
544
|
+
action: function (ctx) { return __awaiter(void 0, void 0, Promise, function () {
|
|
545
|
+
var action, collection, efConstruction, m, _a, getHNSWStatus, getHNSWIndex, searchHNSWIndex, generateEmbedding, status, testQuery, start, results, searchTime, bruteForceEstimate, speedup, spinner, index, newStatus, error_5;
|
|
546
|
+
return __generator(this, function (_b) {
|
|
547
|
+
switch (_b.label) {
|
|
548
|
+
case 0:
|
|
549
|
+
action = ctx.flags.action || 'status';
|
|
550
|
+
collection = ctx.flags.collection;
|
|
551
|
+
efConstruction = parseInt(ctx.flags['ef-construction'] || '200', 10);
|
|
552
|
+
m = parseInt(ctx.flags.m || '16', 10);
|
|
553
|
+
output.writeln();
|
|
554
|
+
output.writeln(output.bold("HNSW Index: " + action));
|
|
555
|
+
output.writeln(output.dim('─'.repeat(50)));
|
|
556
|
+
_b.label = 1;
|
|
557
|
+
case 1:
|
|
558
|
+
_b.trys.push([1, 10, , 11]);
|
|
559
|
+
return [4 /*yield*/, import('../memory/memory-initializer.js')];
|
|
560
|
+
case 2:
|
|
561
|
+
_a = _b.sent(), getHNSWStatus = _a.getHNSWStatus, getHNSWIndex = _a.getHNSWIndex, searchHNSWIndex = _a.searchHNSWIndex, generateEmbedding = _a.generateEmbedding;
|
|
562
|
+
status = getHNSWStatus();
|
|
563
|
+
if (!(action === 'status')) return [3 /*break*/, 7];
|
|
564
|
+
output.writeln();
|
|
565
|
+
output.printTable({
|
|
566
|
+
columns: [
|
|
567
|
+
{ key: 'metric', header: 'Metric', width: 24 },
|
|
568
|
+
{ key: 'value', header: 'Value', width: 30 },
|
|
569
|
+
],
|
|
570
|
+
data: [
|
|
571
|
+
{ metric: 'HNSW Available', value: status.available ? output.success('Yes (@ruvector/core)') : output.warning('No') },
|
|
572
|
+
{ metric: 'Index Initialized', value: status.initialized ? output.success('Yes') : output.dim('No') },
|
|
573
|
+
{ metric: 'Vector Count', value: status.entryCount.toLocaleString() },
|
|
574
|
+
{ metric: 'Dimensions', value: String(status.dimensions) },
|
|
575
|
+
{ metric: 'Distance Metric', value: 'Cosine' },
|
|
576
|
+
{ metric: 'HNSW M', value: String(m) },
|
|
577
|
+
{ metric: 'ef_construction', value: String(efConstruction) },
|
|
578
|
+
]
|
|
579
|
+
});
|
|
580
|
+
if (!(status.available && status.entryCount > 0)) return [3 /*break*/, 5];
|
|
497
581
|
// Run a quick benchmark to show actual performance
|
|
498
582
|
output.writeln();
|
|
499
583
|
output.writeln(output.dim('Running quick performance test...'));
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
584
|
+
return [4 /*yield*/, generateEmbedding('test performance query')];
|
|
585
|
+
case 3:
|
|
586
|
+
testQuery = _b.sent();
|
|
587
|
+
start = performance.now();
|
|
588
|
+
return [4 /*yield*/, searchHNSWIndex(testQuery.embedding, { k: 10 })];
|
|
589
|
+
case 4:
|
|
590
|
+
results = _b.sent();
|
|
591
|
+
searchTime = performance.now() - start;
|
|
592
|
+
bruteForceEstimate = status.entryCount * 0.0005;
|
|
593
|
+
speedup = bruteForceEstimate / (searchTime / 1000);
|
|
507
594
|
output.writeln();
|
|
508
595
|
output.printBox([
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
596
|
+
"Performance (n=" + status.entryCount + "):",
|
|
597
|
+
" HNSW Search: " + searchTime.toFixed(2) + "ms",
|
|
598
|
+
" Brute Force Est: " + (bruteForceEstimate * 1000).toFixed(2) + "ms",
|
|
599
|
+
" Speedup: ~" + Math.round(speedup) + "x",
|
|
600
|
+
" Results: " + ((results === null || results === void 0 ? void 0 : results.length) || 0) + " matches",
|
|
514
601
|
].join('\n'), 'Search Performance');
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
602
|
+
return [3 /*break*/, 6];
|
|
603
|
+
case 5:
|
|
604
|
+
if (!status.available) {
|
|
605
|
+
output.writeln();
|
|
606
|
+
output.printWarning('@ruvector/core not available');
|
|
607
|
+
output.printInfo('Install: npm install @ruvector/core');
|
|
608
|
+
}
|
|
609
|
+
else {
|
|
610
|
+
output.writeln();
|
|
611
|
+
output.printInfo('Index is empty. Store some entries to populate it.');
|
|
612
|
+
output.printInfo('Run: claude-flow memory store -k "key" --value "text"');
|
|
613
|
+
}
|
|
614
|
+
_b.label = 6;
|
|
615
|
+
case 6: return [2 /*return*/, { success: true, data: status }];
|
|
616
|
+
case 7:
|
|
617
|
+
if (!(action === 'build' || action === 'rebuild')) return [3 /*break*/, 9];
|
|
618
|
+
if (!collection) {
|
|
619
|
+
output.printError('Collection is required for build/rebuild');
|
|
620
|
+
return [2 /*return*/, { success: false, exitCode: 1 }];
|
|
621
|
+
}
|
|
622
|
+
spinner = output.createSpinner({ text: action + "ing index for " + collection + "...", spinner: 'dots' });
|
|
623
|
+
spinner.start();
|
|
624
|
+
return [4 /*yield*/, getHNSWIndex({ forceRebuild: action === 'rebuild' })];
|
|
625
|
+
case 8:
|
|
626
|
+
index = _b.sent();
|
|
627
|
+
if (!index) {
|
|
628
|
+
spinner.fail('@ruvector/core not available');
|
|
629
|
+
output.printInfo('Install: npm install @ruvector/core');
|
|
630
|
+
return [2 /*return*/, { success: false, exitCode: 1 }];
|
|
631
|
+
}
|
|
632
|
+
spinner.succeed("Index " + action + " complete");
|
|
633
|
+
newStatus = getHNSWStatus();
|
|
522
634
|
output.writeln();
|
|
523
|
-
output.
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
output.printBox([
|
|
547
|
-
`Collection: ${collection}`,
|
|
548
|
-
`Action: ${action}`,
|
|
549
|
-
`Vectors: ${newStatus.entryCount}`,
|
|
550
|
-
`Dimensions: ${newStatus.dimensions}`,
|
|
551
|
-
`M: ${m}`,
|
|
552
|
-
`ef_construction: ${efConstruction}`,
|
|
553
|
-
].join('\n'), 'Index Built');
|
|
554
|
-
return { success: true, data: newStatus };
|
|
555
|
-
}
|
|
556
|
-
// Optimize action
|
|
557
|
-
if (action === 'optimize') {
|
|
558
|
-
output.printInfo('HNSW index is optimized automatically during search');
|
|
559
|
-
output.printInfo('No manual optimization required');
|
|
560
|
-
return { success: true };
|
|
635
|
+
output.printBox([
|
|
636
|
+
"Collection: " + collection,
|
|
637
|
+
"Action: " + action,
|
|
638
|
+
"Vectors: " + newStatus.entryCount,
|
|
639
|
+
"Dimensions: " + newStatus.dimensions,
|
|
640
|
+
"M: " + m,
|
|
641
|
+
"ef_construction: " + efConstruction,
|
|
642
|
+
].join('\n'), 'Index Built');
|
|
643
|
+
return [2 /*return*/, { success: true, data: newStatus }];
|
|
644
|
+
case 9:
|
|
645
|
+
// Optimize action
|
|
646
|
+
if (action === 'optimize') {
|
|
647
|
+
output.printInfo('HNSW index is optimized automatically during search');
|
|
648
|
+
output.printInfo('No manual optimization required');
|
|
649
|
+
return [2 /*return*/, { success: true }];
|
|
650
|
+
}
|
|
651
|
+
output.printError("Unknown action: " + action);
|
|
652
|
+
return [2 /*return*/, { success: false, exitCode: 1 }];
|
|
653
|
+
case 10:
|
|
654
|
+
error_5 = _b.sent();
|
|
655
|
+
output.printError(error_5 instanceof Error ? error_5.message : String(error_5));
|
|
656
|
+
return [2 /*return*/, { success: false, exitCode: 1 }];
|
|
657
|
+
case 11: return [2 /*return*/];
|
|
561
658
|
}
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
}
|
|
565
|
-
catch (error) {
|
|
566
|
-
output.printError(error instanceof Error ? error.message : String(error));
|
|
567
|
-
return { success: false, exitCode: 1 };
|
|
568
|
-
}
|
|
569
|
-
},
|
|
659
|
+
});
|
|
660
|
+
}); }
|
|
570
661
|
};
|
|
571
662
|
// Init subcommand - Initialize ONNX models and hyperbolic config
|
|
572
|
-
|
|
663
|
+
var initCommand = {
|
|
573
664
|
name: 'init',
|
|
574
665
|
description: 'Initialize embedding subsystem with ONNX model and hyperbolic config',
|
|
575
666
|
options: [
|
|
576
|
-
{ name: 'model', short: 'm', type: 'string', description: 'ONNX model ID', default: 'all-MiniLM-L6-v2' },
|
|
577
|
-
{ name: 'hyperbolic', type: 'boolean', description: 'Enable hyperbolic (Poincaré ball) embeddings', default: 'true' },
|
|
578
|
-
{ name: 'curvature', short: 'c', type: 'string', description: 'Poincaré ball curvature (use --curvature=-1 for negative)', default: '-1' },
|
|
579
|
-
{ name: 'download', short: 'd', type: 'boolean', description: 'Download model during init', default: 'true' },
|
|
580
|
-
{ name: 'cache-size', type: 'string', description: 'LRU cache entries', default: '256' },
|
|
581
|
-
{ name: 'force', short: 'f', type: 'boolean', description: 'Overwrite existing configuration', default: 'false' },
|
|
667
|
+
{ name: 'model', short: 'm', type: 'string', description: 'ONNX model ID', "default": 'all-MiniLM-L6-v2' },
|
|
668
|
+
{ name: 'hyperbolic', type: 'boolean', description: 'Enable hyperbolic (Poincaré ball) embeddings', "default": 'true' },
|
|
669
|
+
{ name: 'curvature', short: 'c', type: 'string', description: 'Poincaré ball curvature (use --curvature=-1 for negative)', "default": '-1' },
|
|
670
|
+
{ name: 'download', short: 'd', type: 'boolean', description: 'Download model during init', "default": 'true' },
|
|
671
|
+
{ name: 'cache-size', type: 'string', description: 'LRU cache entries', "default": '256' },
|
|
672
|
+
{ name: 'force', short: 'f', type: 'boolean', description: 'Overwrite existing configuration', "default": 'false' },
|
|
582
673
|
],
|
|
583
674
|
examples: [
|
|
584
675
|
{ command: 'claude-flow embeddings init', description: 'Initialize with defaults' },
|
|
@@ -587,219 +678,243 @@ const initCommand = {
|
|
|
587
678
|
{ command: 'claude-flow embeddings init --curvature=-0.5', description: 'Custom curvature (use = for negative)' },
|
|
588
679
|
{ command: 'claude-flow embeddings init --force', description: 'Overwrite existing config' },
|
|
589
680
|
],
|
|
590
|
-
action:
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
681
|
+
action: function (ctx) { return __awaiter(void 0, void 0, Promise, function () {
|
|
682
|
+
var model, hyperbolic, download, force, curvatureRaw, curvature, cacheSizeRaw, cacheSize, fs, path, configDir, modelDir, configPath, spinner_1, embeddings, dimension, config, error_6;
|
|
683
|
+
return __generator(this, function (_a) {
|
|
684
|
+
switch (_a.label) {
|
|
685
|
+
case 0:
|
|
686
|
+
model = ctx.flags.model || 'all-MiniLM-L6-v2';
|
|
687
|
+
hyperbolic = ctx.flags.hyperbolic !== false;
|
|
688
|
+
download = ctx.flags.download !== false;
|
|
689
|
+
force = ctx.flags.force === true;
|
|
690
|
+
curvatureRaw = ctx.flags.curvature || '-1';
|
|
691
|
+
curvature = parseFloat(curvatureRaw);
|
|
692
|
+
cacheSizeRaw = (ctx.flags['cache-size'] || ctx.flags.cacheSize || '256');
|
|
693
|
+
cacheSize = parseInt(cacheSizeRaw, 10);
|
|
694
|
+
output.writeln();
|
|
695
|
+
output.writeln(output.bold('Initialize Embedding Subsystem'));
|
|
696
|
+
output.writeln(output.dim('─'.repeat(55)));
|
|
697
|
+
_a.label = 1;
|
|
698
|
+
case 1:
|
|
699
|
+
_a.trys.push([1, 9, , 10]);
|
|
700
|
+
return [4 /*yield*/, import('fs')];
|
|
701
|
+
case 2:
|
|
702
|
+
fs = _a.sent();
|
|
703
|
+
return [4 /*yield*/, import('path')];
|
|
704
|
+
case 3:
|
|
705
|
+
path = _a.sent();
|
|
706
|
+
configDir = path.join(process.cwd(), '.claude-flow');
|
|
707
|
+
modelDir = path.join(configDir, 'models');
|
|
708
|
+
configPath = path.join(configDir, 'embeddings.json');
|
|
709
|
+
// Check for existing config
|
|
710
|
+
if (fs.existsSync(configPath) && !force) {
|
|
711
|
+
output.printWarning('Embeddings already initialized');
|
|
712
|
+
output.printInfo("Config exists: " + configPath);
|
|
713
|
+
output.writeln();
|
|
714
|
+
output.writeln(output.dim('Use --force to overwrite existing configuration'));
|
|
715
|
+
return [2 /*return*/, { success: false, exitCode: 1 }];
|
|
716
|
+
}
|
|
717
|
+
spinner_1 = output.createSpinner({ text: 'Initializing...', spinner: 'dots' });
|
|
718
|
+
spinner_1.start();
|
|
719
|
+
if (!fs.existsSync(configDir)) {
|
|
720
|
+
fs.mkdirSync(configDir, { recursive: true });
|
|
721
|
+
}
|
|
722
|
+
if (!fs.existsSync(modelDir)) {
|
|
723
|
+
fs.mkdirSync(modelDir, { recursive: true });
|
|
724
|
+
}
|
|
725
|
+
if (!download) return [3 /*break*/, 8];
|
|
726
|
+
spinner_1.setText("Downloading ONNX model: " + model + "...");
|
|
727
|
+
return [4 /*yield*/, getEmbeddings()];
|
|
728
|
+
case 4:
|
|
729
|
+
embeddings = _a.sent();
|
|
730
|
+
if (!embeddings) return [3 /*break*/, 6];
|
|
731
|
+
return [4 /*yield*/, embeddings.downloadEmbeddingModel(model, modelDir, function (p) {
|
|
732
|
+
spinner_1.setText("Downloading " + model + "... " + p.percent.toFixed(0) + "%");
|
|
733
|
+
})];
|
|
734
|
+
case 5:
|
|
735
|
+
_a.sent();
|
|
736
|
+
return [3 /*break*/, 8];
|
|
737
|
+
case 6:
|
|
738
|
+
// Simulate download for when embeddings package not available
|
|
739
|
+
return [4 /*yield*/, new Promise(function (r) { return setTimeout(r, 500); })];
|
|
740
|
+
case 7:
|
|
637
741
|
// Simulate download for when embeddings package not available
|
|
638
|
-
|
|
742
|
+
_a.sent();
|
|
639
743
|
output.writeln(output.dim(' (Simulated - @claude-flow/embeddings not installed)'));
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
744
|
+
_a.label = 8;
|
|
745
|
+
case 8:
|
|
746
|
+
// Write embeddings config
|
|
747
|
+
spinner_1.setText('Writing configuration...');
|
|
748
|
+
dimension = model.includes('mpnet') ? 768 : 384;
|
|
749
|
+
config = {
|
|
750
|
+
model: model,
|
|
751
|
+
modelPath: modelDir,
|
|
752
|
+
dimension: dimension,
|
|
753
|
+
cacheSize: cacheSize,
|
|
754
|
+
hyperbolic: {
|
|
755
|
+
enabled: hyperbolic,
|
|
756
|
+
curvature: curvature,
|
|
757
|
+
epsilon: 1e-15,
|
|
758
|
+
maxNorm: 1 - 1e-5
|
|
759
|
+
},
|
|
760
|
+
neural: {
|
|
761
|
+
enabled: true,
|
|
762
|
+
driftThreshold: 0.3,
|
|
763
|
+
decayRate: 0.01
|
|
764
|
+
},
|
|
765
|
+
initialized: new Date().toISOString()
|
|
766
|
+
};
|
|
767
|
+
fs.writeFileSync(configPath, JSON.stringify(config, null, 2));
|
|
768
|
+
spinner_1.succeed('Embedding subsystem initialized');
|
|
769
|
+
output.writeln();
|
|
770
|
+
output.printTable({
|
|
771
|
+
columns: [
|
|
772
|
+
{ key: 'setting', header: 'Setting', width: 18 },
|
|
773
|
+
{ key: 'value', header: 'Value', width: 40 },
|
|
774
|
+
],
|
|
775
|
+
data: [
|
|
776
|
+
{ setting: 'Model', value: model },
|
|
777
|
+
{ setting: 'Dimension', value: String(dimension) },
|
|
778
|
+
{ setting: 'Cache Size', value: String(cacheSize) + ' entries' },
|
|
779
|
+
{ setting: 'Hyperbolic', value: hyperbolic ? output.success('Enabled') + " (c=" + curvature + ")" : output.dim('Disabled') },
|
|
780
|
+
{ setting: 'Neural Substrate', value: output.success('Enabled') },
|
|
781
|
+
{ setting: 'Model Path', value: modelDir },
|
|
782
|
+
{ setting: 'Config', value: configPath },
|
|
783
|
+
]
|
|
784
|
+
});
|
|
785
|
+
output.writeln();
|
|
786
|
+
if (hyperbolic) {
|
|
787
|
+
output.printBox([
|
|
788
|
+
'Hyperbolic Embeddings (Poincaré Ball):',
|
|
789
|
+
'• Better for hierarchical data (trees, taxonomies)',
|
|
790
|
+
'• Exponential capacity in low dimensions',
|
|
791
|
+
'• Distance preserves hierarchy structure',
|
|
792
|
+
'',
|
|
793
|
+
'Use: embeddings hyperbolic -a convert',
|
|
794
|
+
].join('\n'), 'Hyperbolic Space');
|
|
795
|
+
}
|
|
796
|
+
output.writeln();
|
|
797
|
+
output.writeln(output.dim('Next steps:'));
|
|
798
|
+
output.printList([
|
|
799
|
+
'embeddings generate -t "test text" - Test embedding generation',
|
|
800
|
+
'embeddings search -q "query" - Semantic search',
|
|
801
|
+
'memory store -k key --value text - Store with auto-embedding',
|
|
802
|
+
]);
|
|
803
|
+
return [2 /*return*/, { success: true, data: config }];
|
|
804
|
+
case 9:
|
|
805
|
+
error_6 = _a.sent();
|
|
806
|
+
output.printError('Initialization failed: ' + (error_6 instanceof Error ? error_6.message : String(error_6)));
|
|
807
|
+
return [2 /*return*/, { success: false, exitCode: 1 }];
|
|
808
|
+
case 10: return [2 /*return*/];
|
|
691
809
|
}
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
output.printList([
|
|
695
|
-
'embeddings generate -t "test text" - Test embedding generation',
|
|
696
|
-
'embeddings search -q "query" - Semantic search',
|
|
697
|
-
'memory store -k key --value text - Store with auto-embedding',
|
|
698
|
-
]);
|
|
699
|
-
return { success: true, data: config };
|
|
700
|
-
}
|
|
701
|
-
catch (error) {
|
|
702
|
-
output.printError('Initialization failed: ' + (error instanceof Error ? error.message : String(error)));
|
|
703
|
-
return { success: false, exitCode: 1 };
|
|
704
|
-
}
|
|
705
|
-
},
|
|
810
|
+
});
|
|
811
|
+
}); }
|
|
706
812
|
};
|
|
707
813
|
// Providers subcommand
|
|
708
|
-
|
|
814
|
+
var providersCommand = {
|
|
709
815
|
name: 'providers',
|
|
710
816
|
description: 'List available embedding providers',
|
|
711
817
|
options: [],
|
|
712
818
|
examples: [
|
|
713
819
|
{ command: 'claude-flow embeddings providers', description: 'List providers' },
|
|
714
820
|
],
|
|
715
|
-
action:
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
821
|
+
action: function () { return __awaiter(void 0, void 0, Promise, function () {
|
|
822
|
+
return __generator(this, function (_a) {
|
|
823
|
+
output.writeln();
|
|
824
|
+
output.writeln(output.bold('Embedding Providers'));
|
|
825
|
+
output.writeln(output.dim('─'.repeat(70)));
|
|
826
|
+
output.printTable({
|
|
827
|
+
columns: [
|
|
828
|
+
{ key: 'provider', header: 'Provider', width: 18 },
|
|
829
|
+
{ key: 'model', header: 'Model', width: 25 },
|
|
830
|
+
{ key: 'dims', header: 'Dims', width: 8 },
|
|
831
|
+
{ key: 'type', header: 'Type', width: 10 },
|
|
832
|
+
{ key: 'status', header: 'Status', width: 12 },
|
|
833
|
+
],
|
|
834
|
+
data: [
|
|
835
|
+
{ provider: 'OpenAI', model: 'text-embedding-3-small', dims: '1536', type: 'Cloud', status: output.success('Ready') },
|
|
836
|
+
{ provider: 'OpenAI', model: 'text-embedding-3-large', dims: '3072', type: 'Cloud', status: output.success('Ready') },
|
|
837
|
+
{ provider: 'Transformers.js', model: 'all-MiniLM-L6-v2', dims: '384', type: 'Local', status: output.success('Ready') },
|
|
838
|
+
{ provider: 'Agentic Flow', model: 'ONNX optimized', dims: '384', type: 'Local', status: output.success('Ready') },
|
|
839
|
+
{ provider: 'Mock', model: 'mock-embedding', dims: '384', type: 'Dev', status: output.dim('Dev only') },
|
|
840
|
+
]
|
|
841
|
+
});
|
|
842
|
+
output.writeln();
|
|
843
|
+
output.writeln(output.dim('Agentic Flow provider uses WASM SIMD for 75x faster inference'));
|
|
844
|
+
return [2 /*return*/, { success: true }];
|
|
734
845
|
});
|
|
735
|
-
|
|
736
|
-
output.writeln(output.dim('Agentic Flow provider uses WASM SIMD for 75x faster inference'));
|
|
737
|
-
return { success: true };
|
|
738
|
-
},
|
|
846
|
+
}); }
|
|
739
847
|
};
|
|
740
848
|
// Chunk subcommand
|
|
741
|
-
|
|
849
|
+
var chunkCommand = {
|
|
742
850
|
name: 'chunk',
|
|
743
851
|
description: 'Chunk text for embedding with overlap',
|
|
744
852
|
options: [
|
|
745
853
|
{ name: 'text', short: 't', type: 'string', description: 'Text to chunk', required: true },
|
|
746
|
-
{ name: 'max-size', short: 's', type: 'number', description: 'Max chunk size in chars', default: '512' },
|
|
747
|
-
{ name: 'overlap', short: 'o', type: 'number', description: 'Overlap between chunks', default: '50' },
|
|
748
|
-
{ name: 'strategy', type: 'string', description: 'Strategy: character, sentence, paragraph, token', default: 'sentence' },
|
|
854
|
+
{ name: 'max-size', short: 's', type: 'number', description: 'Max chunk size in chars', "default": '512' },
|
|
855
|
+
{ name: 'overlap', short: 'o', type: 'number', description: 'Overlap between chunks', "default": '50' },
|
|
856
|
+
{ name: 'strategy', type: 'string', description: 'Strategy: character, sentence, paragraph, token', "default": 'sentence' },
|
|
749
857
|
{ name: 'file', short: 'f', type: 'string', description: 'File to chunk (instead of text)' },
|
|
750
858
|
],
|
|
751
859
|
examples: [
|
|
752
860
|
{ command: 'claude-flow embeddings chunk -t "Long text..." -s 256', description: 'Chunk with 256 char limit' },
|
|
753
861
|
{ command: 'claude-flow embeddings chunk -f doc.txt --strategy paragraph', description: 'Chunk file by paragraph' },
|
|
754
862
|
],
|
|
755
|
-
action:
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
863
|
+
action: function (ctx) { return __awaiter(void 0, void 0, Promise, function () {
|
|
864
|
+
var embeddings, text, maxSize, overlap, strategy, result;
|
|
865
|
+
return __generator(this, function (_a) {
|
|
866
|
+
switch (_a.label) {
|
|
867
|
+
case 0: return [4 /*yield*/, getEmbeddings()];
|
|
868
|
+
case 1:
|
|
869
|
+
embeddings = _a.sent();
|
|
870
|
+
text = ctx.flags.text || '';
|
|
871
|
+
maxSize = parseInt(ctx.flags['max-size'] || '512', 10);
|
|
872
|
+
overlap = parseInt(ctx.flags.overlap || '50', 10);
|
|
873
|
+
strategy = ctx.flags.strategy || 'sentence';
|
|
874
|
+
output.writeln();
|
|
875
|
+
output.writeln(output.bold('Document Chunking'));
|
|
876
|
+
output.writeln(output.dim('─'.repeat(50)));
|
|
877
|
+
if (!embeddings) {
|
|
878
|
+
output.printWarning('@claude-flow/embeddings not installed, showing preview');
|
|
879
|
+
output.writeln();
|
|
880
|
+
output.printBox([
|
|
881
|
+
"Strategy: " + strategy,
|
|
882
|
+
"Max Size: " + maxSize + " chars",
|
|
883
|
+
"Overlap: " + overlap + " chars",
|
|
884
|
+
"",
|
|
885
|
+
"Estimated chunks: " + Math.ceil(text.length / (maxSize - overlap)),
|
|
886
|
+
].join('\n'), 'Chunking Preview');
|
|
887
|
+
return [2 /*return*/, { success: true }];
|
|
888
|
+
}
|
|
889
|
+
result = embeddings.chunkText(text, { maxChunkSize: maxSize, overlap: overlap, strategy: strategy });
|
|
890
|
+
output.writeln();
|
|
891
|
+
output.printTable({
|
|
892
|
+
columns: [
|
|
893
|
+
{ key: 'idx', header: '#', width: 5 },
|
|
894
|
+
{ key: 'length', header: 'Chars', width: 8 },
|
|
895
|
+
{ key: 'tokens', header: 'Tokens', width: 8 },
|
|
896
|
+
{ key: 'preview', header: 'Preview', width: 45 },
|
|
897
|
+
],
|
|
898
|
+
data: result.chunks.map(function (c, i) { return ({
|
|
899
|
+
idx: String(i + 1),
|
|
900
|
+
length: String(c.length),
|
|
901
|
+
tokens: String(c.tokenCount),
|
|
902
|
+
preview: c.text.substring(0, 42) + (c.text.length > 42 ? '...' : '')
|
|
903
|
+
}); })
|
|
904
|
+
});
|
|
905
|
+
output.writeln();
|
|
906
|
+
output.writeln(output.dim("Total: " + result.totalChunks + " chunks from " + result.originalLength + " chars"));
|
|
907
|
+
return [2 /*return*/, { success: true }];
|
|
908
|
+
}
|
|
791
909
|
});
|
|
792
|
-
|
|
793
|
-
output.writeln(output.dim(`Total: ${result.totalChunks} chunks from ${result.originalLength} chars`));
|
|
794
|
-
return { success: true };
|
|
795
|
-
},
|
|
910
|
+
}); }
|
|
796
911
|
};
|
|
797
912
|
// Normalize subcommand
|
|
798
|
-
|
|
913
|
+
var normalizeCommand = {
|
|
799
914
|
name: 'normalize',
|
|
800
915
|
description: 'Normalize embedding vectors',
|
|
801
916
|
options: [
|
|
802
|
-
{ name: 'type', short: 't', type: 'string', description: 'Type: l2, l1, minmax, zscore', default: 'l2' },
|
|
917
|
+
{ name: 'type', short: 't', type: 'string', description: 'Type: l2, l1, minmax, zscore', "default": 'l2' },
|
|
803
918
|
{ name: 'input', short: 'i', type: 'string', description: 'Input embedding (JSON array)' },
|
|
804
919
|
{ name: 'check', short: 'c', type: 'boolean', description: 'Check if already normalized' },
|
|
805
920
|
],
|
|
@@ -807,147 +922,159 @@ const normalizeCommand = {
|
|
|
807
922
|
{ command: 'claude-flow embeddings normalize -i "[0.5, 0.3, 0.8]" -t l2', description: 'L2 normalize' },
|
|
808
923
|
{ command: 'claude-flow embeddings normalize --check -i "[...]"', description: 'Check if normalized' },
|
|
809
924
|
],
|
|
810
|
-
action:
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
925
|
+
action: function (ctx) { return __awaiter(void 0, void 0, Promise, function () {
|
|
926
|
+
var type, check;
|
|
927
|
+
return __generator(this, function (_a) {
|
|
928
|
+
type = ctx.flags.type || 'l2';
|
|
929
|
+
check = ctx.flags.check;
|
|
930
|
+
output.writeln();
|
|
931
|
+
output.writeln(output.bold('Embedding Normalization'));
|
|
932
|
+
output.writeln(output.dim('─'.repeat(50)));
|
|
933
|
+
output.printTable({
|
|
934
|
+
columns: [
|
|
935
|
+
{ key: 'type', header: 'Type', width: 12 },
|
|
936
|
+
{ key: 'formula', header: 'Formula', width: 30 },
|
|
937
|
+
{ key: 'use', header: 'Best For', width: 25 },
|
|
938
|
+
],
|
|
939
|
+
data: [
|
|
940
|
+
{ type: output.success('L2'), formula: 'v / ||v||₂', use: 'Cosine similarity' },
|
|
941
|
+
{ type: 'L1', formula: 'v / ||v||₁', use: 'Sparse vectors' },
|
|
942
|
+
{ type: 'Min-Max', formula: '(v - min) / (max - min)', use: 'Bounded range [0,1]' },
|
|
943
|
+
{ type: 'Z-Score', formula: '(v - μ) / σ', use: 'Statistical analysis' },
|
|
944
|
+
]
|
|
945
|
+
});
|
|
946
|
+
output.writeln();
|
|
947
|
+
output.writeln(output.dim("Selected: " + type.toUpperCase() + " normalization"));
|
|
948
|
+
output.writeln(output.dim('Most embedding models pre-normalize with L2'));
|
|
949
|
+
return [2 /*return*/, { success: true }];
|
|
828
950
|
});
|
|
829
|
-
|
|
830
|
-
output.writeln(output.dim(`Selected: ${type.toUpperCase()} normalization`));
|
|
831
|
-
output.writeln(output.dim('Most embedding models pre-normalize with L2'));
|
|
832
|
-
return { success: true };
|
|
833
|
-
},
|
|
951
|
+
}); }
|
|
834
952
|
};
|
|
835
953
|
// Hyperbolic subcommand
|
|
836
|
-
|
|
954
|
+
var hyperbolicCommand = {
|
|
837
955
|
name: 'hyperbolic',
|
|
838
956
|
description: 'Hyperbolic embedding operations (Poincaré ball)',
|
|
839
957
|
options: [
|
|
840
|
-
{ name: 'action', short: 'a', type: 'string', description: 'Action: convert, distance, centroid', default: 'convert' },
|
|
841
|
-
{ name: 'curvature', short: 'c', type: 'number', description: 'Hyperbolic curvature', default: '-1' },
|
|
958
|
+
{ name: 'action', short: 'a', type: 'string', description: 'Action: convert, distance, centroid', "default": 'convert' },
|
|
959
|
+
{ name: 'curvature', short: 'c', type: 'number', description: 'Hyperbolic curvature', "default": '-1' },
|
|
842
960
|
{ name: 'input', short: 'i', type: 'string', description: 'Input embedding(s) JSON' },
|
|
843
961
|
],
|
|
844
962
|
examples: [
|
|
845
963
|
{ command: 'claude-flow embeddings hyperbolic -a convert -i "[0.5, 0.3]"', description: 'Convert to Poincaré' },
|
|
846
964
|
{ command: 'claude-flow embeddings hyperbolic -a distance', description: 'Compute hyperbolic distance' },
|
|
847
965
|
],
|
|
848
|
-
action:
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
// Try to import hyperbolic functions from embeddings package
|
|
857
|
-
try {
|
|
858
|
-
const hyperbolic = await import('@claude-flow/embeddings').then(m => m).catch(() => null);
|
|
859
|
-
if (!hyperbolic || !hyperbolic.euclideanToPoincare) {
|
|
860
|
-
output.printWarning('@claude-flow/embeddings hyperbolic module not available');
|
|
861
|
-
output.printInfo('Install with: npm install @claude-flow/embeddings');
|
|
862
|
-
return { success: false, exitCode: 1 };
|
|
863
|
-
}
|
|
864
|
-
if (!inputJson) {
|
|
865
|
-
// Show help if no input
|
|
866
|
-
output.printBox([
|
|
867
|
-
'Hyperbolic embeddings excel at:',
|
|
868
|
-
'• Hierarchical data representation',
|
|
869
|
-
'• Tree-like structure preservation',
|
|
870
|
-
'• Low-dimensional hierarchy encoding',
|
|
871
|
-
'',
|
|
872
|
-
'Actions: convert, distance, centroid',
|
|
873
|
-
'',
|
|
874
|
-
'Examples:',
|
|
875
|
-
' -a convert -i "[0.5, 0.3, 0.1]"',
|
|
876
|
-
' -a distance -i "[[0.1,0.2],[0.3,0.4]]"',
|
|
877
|
-
].join('\n'), 'Hyperbolic Geometry');
|
|
878
|
-
return { success: true };
|
|
879
|
-
}
|
|
880
|
-
// Parse input vector(s)
|
|
881
|
-
let input;
|
|
882
|
-
try {
|
|
883
|
-
input = JSON.parse(inputJson);
|
|
884
|
-
}
|
|
885
|
-
catch {
|
|
886
|
-
output.printError('Invalid JSON input. Use format: "[0.5, 0.3]" or "[[0.1,0.2],[0.3,0.4]]"');
|
|
887
|
-
return { success: false, exitCode: 1 };
|
|
888
|
-
}
|
|
889
|
-
switch (action) {
|
|
890
|
-
case 'convert': {
|
|
891
|
-
const vec = Array.isArray(input[0]) ? input[0] : input;
|
|
892
|
-
const rawResult = hyperbolic.euclideanToPoincare(vec, { curvature });
|
|
893
|
-
const result = Array.from(rawResult);
|
|
894
|
-
output.writeln(output.success('Euclidean → Poincaré conversion:'));
|
|
966
|
+
action: function (ctx) { return __awaiter(void 0, void 0, Promise, function () {
|
|
967
|
+
var action, curvature, inputJson, hyperbolic, input, vec, rawResult, result, _a, v1, v2, dist, vectors, rawCentroid, centroid, error_7;
|
|
968
|
+
return __generator(this, function (_b) {
|
|
969
|
+
switch (_b.label) {
|
|
970
|
+
case 0:
|
|
971
|
+
action = ctx.flags.action || 'convert';
|
|
972
|
+
curvature = parseFloat(ctx.flags.curvature || '-1');
|
|
973
|
+
inputJson = ctx.flags.input;
|
|
895
974
|
output.writeln();
|
|
896
|
-
output.writeln(
|
|
897
|
-
output.writeln(
|
|
898
|
-
output.writeln(
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
975
|
+
output.writeln(output.bold('Hyperbolic Embeddings'));
|
|
976
|
+
output.writeln(output.dim('Poincaré Ball Model'));
|
|
977
|
+
output.writeln(output.dim('─'.repeat(50)));
|
|
978
|
+
_b.label = 1;
|
|
979
|
+
case 1:
|
|
980
|
+
_b.trys.push([1, 3, , 4]);
|
|
981
|
+
return [4 /*yield*/, import('@claude-flow/embeddings').then(function (m) { return m; })["catch"](function () { return null; })];
|
|
982
|
+
case 2:
|
|
983
|
+
hyperbolic = _b.sent();
|
|
984
|
+
if (!hyperbolic || !hyperbolic.euclideanToPoincare) {
|
|
985
|
+
output.printWarning('@claude-flow/embeddings hyperbolic module not available');
|
|
986
|
+
output.printInfo('Install with: npm install @claude-flow/embeddings');
|
|
987
|
+
return [2 /*return*/, { success: false, exitCode: 1 }];
|
|
906
988
|
}
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
989
|
+
if (!inputJson) {
|
|
990
|
+
// Show help if no input
|
|
991
|
+
output.printBox([
|
|
992
|
+
'Hyperbolic embeddings excel at:',
|
|
993
|
+
'• Hierarchical data representation',
|
|
994
|
+
'• Tree-like structure preservation',
|
|
995
|
+
'• Low-dimensional hierarchy encoding',
|
|
996
|
+
'',
|
|
997
|
+
'Actions: convert, distance, centroid',
|
|
998
|
+
'',
|
|
999
|
+
'Examples:',
|
|
1000
|
+
' -a convert -i "[0.5, 0.3, 0.1]"',
|
|
1001
|
+
' -a distance -i "[[0.1,0.2],[0.3,0.4]]"',
|
|
1002
|
+
].join('\n'), 'Hyperbolic Geometry');
|
|
1003
|
+
return [2 /*return*/, { success: true }];
|
|
920
1004
|
}
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
1005
|
+
input = void 0;
|
|
1006
|
+
try {
|
|
1007
|
+
input = JSON.parse(inputJson);
|
|
1008
|
+
}
|
|
1009
|
+
catch (_c) {
|
|
1010
|
+
output.printError('Invalid JSON input. Use format: "[0.5, 0.3]" or "[[0.1,0.2],[0.3,0.4]]"');
|
|
1011
|
+
return [2 /*return*/, { success: false, exitCode: 1 }];
|
|
1012
|
+
}
|
|
1013
|
+
switch (action) {
|
|
1014
|
+
case 'convert': {
|
|
1015
|
+
vec = Array.isArray(input[0]) ? input[0] : input;
|
|
1016
|
+
rawResult = hyperbolic.euclideanToPoincare(vec, { curvature: curvature });
|
|
1017
|
+
result = Array.from(rawResult);
|
|
1018
|
+
output.writeln(output.success('Euclidean → Poincaré conversion:'));
|
|
1019
|
+
output.writeln();
|
|
1020
|
+
output.writeln("Input (Euclidean): [" + vec.slice(0, 6).map(function (v) { return v.toFixed(4); }).join(', ') + (vec.length > 6 ? ', ...' : '') + "]");
|
|
1021
|
+
output.writeln("Output (Poincar\u00E9): [" + result.slice(0, 6).map(function (v) { return v.toFixed(4); }).join(', ') + (result.length > 6 ? ', ...' : '') + "]");
|
|
1022
|
+
output.writeln("Curvature: " + curvature);
|
|
1023
|
+
output.writeln("Norm: " + Math.sqrt(result.reduce(function (s, v) { return s + v * v; }, 0)).toFixed(6) + " (must be < 1)");
|
|
1024
|
+
return [2 /*return*/, { success: true, data: { result: result } }];
|
|
1025
|
+
}
|
|
1026
|
+
case 'distance': {
|
|
1027
|
+
if (!Array.isArray(input[0]) || input.length < 2) {
|
|
1028
|
+
output.printError('Distance requires two vectors: "[[v1],[v2]]"');
|
|
1029
|
+
return [2 /*return*/, { success: false, exitCode: 1 }];
|
|
1030
|
+
}
|
|
1031
|
+
_a = input, v1 = _a[0], v2 = _a[1];
|
|
1032
|
+
dist = hyperbolic.hyperbolicDistance(v1, v2, { curvature: curvature });
|
|
1033
|
+
output.writeln(output.success('Hyperbolic (geodesic) distance:'));
|
|
1034
|
+
output.writeln();
|
|
1035
|
+
output.writeln("Vector 1: [" + v1.slice(0, 4).map(function (v) { return v.toFixed(4); }).join(', ') + "...]");
|
|
1036
|
+
output.writeln("Vector 2: [" + v2.slice(0, 4).map(function (v) { return v.toFixed(4); }).join(', ') + "...]");
|
|
1037
|
+
output.writeln("Distance: " + dist.toFixed(6));
|
|
1038
|
+
return [2 /*return*/, { success: true, data: { distance: dist } }];
|
|
1039
|
+
}
|
|
1040
|
+
case 'centroid': {
|
|
1041
|
+
if (!Array.isArray(input[0])) {
|
|
1042
|
+
output.printError('Centroid requires multiple vectors: "[[v1],[v2],...]"');
|
|
1043
|
+
return [2 /*return*/, { success: false, exitCode: 1 }];
|
|
1044
|
+
}
|
|
1045
|
+
vectors = input;
|
|
1046
|
+
rawCentroid = hyperbolic.hyperbolicCentroid(vectors, { curvature: curvature });
|
|
1047
|
+
centroid = Array.from(rawCentroid);
|
|
1048
|
+
output.writeln(output.success('Hyperbolic centroid (Fréchet mean):'));
|
|
1049
|
+
output.writeln();
|
|
1050
|
+
output.writeln("Input vectors: " + vectors.length);
|
|
1051
|
+
output.writeln("Centroid: [" + centroid.slice(0, 6).map(function (v) { return v.toFixed(4); }).join(', ') + (centroid.length > 6 ? ', ...' : '') + "]");
|
|
1052
|
+
return [2 /*return*/, { success: true, data: { centroid: centroid } }];
|
|
1053
|
+
}
|
|
1054
|
+
default:
|
|
1055
|
+
output.printError("Unknown action: " + action + ". Use: convert, distance, centroid");
|
|
1056
|
+
return [2 /*return*/, { success: false, exitCode: 1 }];
|
|
1057
|
+
}
|
|
1058
|
+
return [3 /*break*/, 4];
|
|
1059
|
+
case 3:
|
|
1060
|
+
error_7 = _b.sent();
|
|
1061
|
+
output.printError("Hyperbolic operation failed: " + error_7.message);
|
|
1062
|
+
return [2 /*return*/, { success: false, exitCode: 1 }];
|
|
1063
|
+
case 4: return [2 /*return*/];
|
|
933
1064
|
}
|
|
934
|
-
}
|
|
935
|
-
|
|
936
|
-
output.printError(`Hyperbolic operation failed: ${error.message}`);
|
|
937
|
-
return { success: false, exitCode: 1 };
|
|
938
|
-
}
|
|
939
|
-
},
|
|
1065
|
+
});
|
|
1066
|
+
}); }
|
|
940
1067
|
};
|
|
941
1068
|
// Neural subcommand
|
|
942
|
-
|
|
1069
|
+
var neuralCommand = {
|
|
943
1070
|
name: 'neural',
|
|
944
1071
|
description: 'Neural substrate features (RuVector integration)',
|
|
945
1072
|
options: [
|
|
946
|
-
{ name: 'feature', short: 'f', type: 'string', description: 'Feature: drift, memory, swarm, coherence, all', default: 'all' },
|
|
1073
|
+
{ name: 'feature', short: 'f', type: 'string', description: 'Feature: drift, memory, swarm, coherence, all', "default": 'all' },
|
|
947
1074
|
{ name: 'init', type: 'boolean', description: 'Initialize neural substrate with RuVector' },
|
|
948
|
-
{ name: 'drift-threshold', type: 'string', description: 'Semantic drift detection threshold', default: '0.3' },
|
|
949
|
-
{ name: 'decay-rate', type: 'string', description: 'Memory decay rate (hippocampal dynamics)', default: '0.01' },
|
|
950
|
-
{ name: 'consolidation-interval', type: 'string', description: 'Memory consolidation interval (ms)', default: '60000' },
|
|
1075
|
+
{ name: 'drift-threshold', type: 'string', description: 'Semantic drift detection threshold', "default": '0.3' },
|
|
1076
|
+
{ name: 'decay-rate', type: 'string', description: 'Memory decay rate (hippocampal dynamics)', "default": '0.01' },
|
|
1077
|
+
{ name: 'consolidation-interval', type: 'string', description: 'Memory consolidation interval (ms)', "default": '60000' },
|
|
951
1078
|
],
|
|
952
1079
|
examples: [
|
|
953
1080
|
{ command: 'claude-flow embeddings neural --init', description: 'Initialize RuVector substrate' },
|
|
@@ -956,555 +1083,676 @@ const neuralCommand = {
|
|
|
956
1083
|
{ command: 'claude-flow embeddings neural -f coherence', description: 'Safety & alignment monitoring' },
|
|
957
1084
|
{ command: 'claude-flow embeddings neural --drift-threshold=0.2', description: 'Custom drift threshold' },
|
|
958
1085
|
],
|
|
959
|
-
action:
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
|
|
988
|
-
|
|
989
|
-
|
|
990
|
-
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
|
|
1021
|
-
|
|
1022
|
-
|
|
1023
|
-
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
|
|
1048
|
-
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
|
|
1062
|
-
|
|
1063
|
-
|
|
1064
|
-
|
|
1065
|
-
|
|
1066
|
-
|
|
1067
|
-
|
|
1068
|
-
|
|
1069
|
-
|
|
1070
|
-
|
|
1071
|
-
|
|
1072
|
-
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
|
|
1076
|
-
|
|
1077
|
-
|
|
1078
|
-
|
|
1086
|
+
action: function (ctx) { return __awaiter(void 0, void 0, Promise, function () {
|
|
1087
|
+
var feature, init, driftThreshold, decayRate, consolidationInterval, fs, path, configPath, config, neuralConfig, features, ruvector;
|
|
1088
|
+
return __generator(this, function (_a) {
|
|
1089
|
+
switch (_a.label) {
|
|
1090
|
+
case 0:
|
|
1091
|
+
feature = ctx.flags.feature || 'all';
|
|
1092
|
+
init = ctx.flags.init;
|
|
1093
|
+
driftThreshold = parseFloat((ctx.flags['drift-threshold'] || ctx.flags.driftThreshold || '0.3'));
|
|
1094
|
+
decayRate = parseFloat((ctx.flags['decay-rate'] || ctx.flags.decayRate || '0.01'));
|
|
1095
|
+
consolidationInterval = parseInt((ctx.flags['consolidation-interval'] || ctx.flags.consolidationInterval || '60000'), 10);
|
|
1096
|
+
output.writeln();
|
|
1097
|
+
output.writeln(output.bold('Neural Embedding Substrate (RuVector)'));
|
|
1098
|
+
output.writeln(output.dim('Treating embeddings as a synthetic nervous system'));
|
|
1099
|
+
output.writeln(output.dim('─'.repeat(60)));
|
|
1100
|
+
return [4 /*yield*/, import('fs')];
|
|
1101
|
+
case 1:
|
|
1102
|
+
fs = _a.sent();
|
|
1103
|
+
return [4 /*yield*/, import('path')];
|
|
1104
|
+
case 2:
|
|
1105
|
+
path = _a.sent();
|
|
1106
|
+
configPath = path.join(process.cwd(), '.claude-flow', 'embeddings.json');
|
|
1107
|
+
if (!fs.existsSync(configPath)) {
|
|
1108
|
+
output.printWarning('Embeddings not initialized');
|
|
1109
|
+
output.printInfo('Run "embeddings init" first to configure ONNX model');
|
|
1110
|
+
return [2 /*return*/, { success: false, exitCode: 1 }];
|
|
1111
|
+
}
|
|
1112
|
+
config = {};
|
|
1113
|
+
try {
|
|
1114
|
+
config = JSON.parse(fs.readFileSync(configPath, 'utf8'));
|
|
1115
|
+
}
|
|
1116
|
+
catch (_b) {
|
|
1117
|
+
config = {};
|
|
1118
|
+
}
|
|
1119
|
+
if (init) {
|
|
1120
|
+
// Initialize neural substrate configuration
|
|
1121
|
+
config.neural = {
|
|
1122
|
+
enabled: true,
|
|
1123
|
+
driftThreshold: driftThreshold,
|
|
1124
|
+
decayRate: decayRate,
|
|
1125
|
+
consolidationInterval: consolidationInterval,
|
|
1126
|
+
ruvector: {
|
|
1127
|
+
enabled: true,
|
|
1128
|
+
sona: true,
|
|
1129
|
+
flashAttention: true,
|
|
1130
|
+
ewcPlusPlus: true
|
|
1131
|
+
},
|
|
1132
|
+
features: {
|
|
1133
|
+
semanticDrift: true,
|
|
1134
|
+
memoryPhysics: true,
|
|
1135
|
+
stateMachine: true,
|
|
1136
|
+
swarmCoordination: true,
|
|
1137
|
+
coherenceMonitor: true
|
|
1138
|
+
},
|
|
1139
|
+
initializedAt: new Date().toISOString()
|
|
1140
|
+
};
|
|
1141
|
+
fs.writeFileSync(configPath, JSON.stringify(config, null, 2));
|
|
1142
|
+
output.printSuccess('Neural substrate initialized');
|
|
1143
|
+
output.writeln();
|
|
1144
|
+
}
|
|
1145
|
+
neuralConfig = (config.neural || {});
|
|
1146
|
+
features = (neuralConfig.features || {});
|
|
1147
|
+
ruvector = (neuralConfig.ruvector || {});
|
|
1148
|
+
output.printTable({
|
|
1149
|
+
columns: [
|
|
1150
|
+
{ key: 'feature', header: 'Feature', width: 24 },
|
|
1151
|
+
{ key: 'description', header: 'Description', width: 38 },
|
|
1152
|
+
{ key: 'status', header: 'Status', width: 12 },
|
|
1153
|
+
],
|
|
1154
|
+
data: [
|
|
1155
|
+
{
|
|
1156
|
+
feature: 'SemanticDriftDetector',
|
|
1157
|
+
description: "Monitor semantic movement (threshold: " + driftThreshold + ")",
|
|
1158
|
+
status: features.semanticDrift ? output.success('Active') : output.dim('Inactive')
|
|
1159
|
+
},
|
|
1160
|
+
{
|
|
1161
|
+
feature: 'MemoryPhysics',
|
|
1162
|
+
description: "Hippocampal dynamics (decay: " + decayRate + ")",
|
|
1163
|
+
status: features.memoryPhysics ? output.success('Active') : output.dim('Inactive')
|
|
1164
|
+
},
|
|
1165
|
+
{
|
|
1166
|
+
feature: 'EmbeddingStateMachine',
|
|
1167
|
+
description: 'Agent state through geometry',
|
|
1168
|
+
status: features.stateMachine ? output.success('Active') : output.dim('Inactive')
|
|
1169
|
+
},
|
|
1170
|
+
{
|
|
1171
|
+
feature: 'SwarmCoordinator',
|
|
1172
|
+
description: 'Multi-agent embedding coordination',
|
|
1173
|
+
status: features.swarmCoordination ? output.success('Active') : output.dim('Inactive')
|
|
1174
|
+
},
|
|
1175
|
+
{
|
|
1176
|
+
feature: 'CoherenceMonitor',
|
|
1177
|
+
description: 'Safety & alignment detection',
|
|
1178
|
+
status: features.coherenceMonitor ? output.success('Active') : output.dim('Inactive')
|
|
1179
|
+
},
|
|
1180
|
+
]
|
|
1181
|
+
});
|
|
1182
|
+
output.writeln();
|
|
1183
|
+
output.writeln(output.bold('RuVector Integration'));
|
|
1184
|
+
output.printTable({
|
|
1185
|
+
columns: [
|
|
1186
|
+
{ key: 'component', header: 'Component', width: 24 },
|
|
1187
|
+
{ key: 'description', header: 'Description', width: 38 },
|
|
1188
|
+
{ key: 'status', header: 'Status', width: 12 },
|
|
1189
|
+
],
|
|
1190
|
+
data: [
|
|
1191
|
+
{
|
|
1192
|
+
component: 'SONA',
|
|
1193
|
+
description: 'Self-Optimizing Neural Architecture (<0.05ms)',
|
|
1194
|
+
status: ruvector.sona ? output.success('Enabled') : output.dim('Disabled')
|
|
1195
|
+
},
|
|
1196
|
+
{
|
|
1197
|
+
component: 'Flash Attention',
|
|
1198
|
+
description: '2.49x-7.47x attention speedup',
|
|
1199
|
+
status: ruvector.flashAttention ? output.success('Enabled') : output.dim('Disabled')
|
|
1200
|
+
},
|
|
1201
|
+
{
|
|
1202
|
+
component: 'EWC++',
|
|
1203
|
+
description: 'Elastic Weight Consolidation (anti-forgetting)',
|
|
1204
|
+
status: ruvector.ewcPlusPlus ? output.success('Enabled') : output.dim('Disabled')
|
|
1205
|
+
},
|
|
1206
|
+
{
|
|
1207
|
+
component: 'Hyperbolic Space',
|
|
1208
|
+
description: 'Poincaré ball for hierarchy preservation',
|
|
1209
|
+
status: config.hyperbolic ? output.success('Enabled') : output.dim('Disabled')
|
|
1210
|
+
},
|
|
1211
|
+
]
|
|
1212
|
+
});
|
|
1213
|
+
output.writeln();
|
|
1214
|
+
if (!neuralConfig.enabled) {
|
|
1215
|
+
output.printInfo('Run with --init to enable neural substrate');
|
|
1216
|
+
}
|
|
1217
|
+
else {
|
|
1218
|
+
output.writeln(output.dim('Configuration: .claude-flow/embeddings.json'));
|
|
1219
|
+
output.writeln(output.dim('Next: Use "hooks pretrain" to train patterns'));
|
|
1220
|
+
}
|
|
1221
|
+
return [2 /*return*/, { success: true, data: { config: neuralConfig, feature: feature } }];
|
|
1222
|
+
}
|
|
1079
1223
|
});
|
|
1080
|
-
|
|
1081
|
-
if (!neuralConfig.enabled) {
|
|
1082
|
-
output.printInfo('Run with --init to enable neural substrate');
|
|
1083
|
-
}
|
|
1084
|
-
else {
|
|
1085
|
-
output.writeln(output.dim('Configuration: .claude-flow/embeddings.json'));
|
|
1086
|
-
output.writeln(output.dim('Next: Use "hooks pretrain" to train patterns'));
|
|
1087
|
-
}
|
|
1088
|
-
return { success: true, data: { config: neuralConfig, feature } };
|
|
1089
|
-
},
|
|
1224
|
+
}); }
|
|
1090
1225
|
};
|
|
1091
1226
|
// Models subcommand
|
|
1092
|
-
|
|
1227
|
+
var modelsCommand = {
|
|
1093
1228
|
name: 'models',
|
|
1094
1229
|
description: 'List and download embedding models',
|
|
1095
1230
|
options: [
|
|
1096
1231
|
{ name: 'download', short: 'd', type: 'string', description: 'Model ID to download' },
|
|
1097
|
-
{ name: 'list', short: 'l', type: 'boolean', description: 'List available models', default: 'true' },
|
|
1232
|
+
{ name: 'list', short: 'l', type: 'boolean', description: 'List available models', "default": 'true' },
|
|
1098
1233
|
],
|
|
1099
1234
|
examples: [
|
|
1100
1235
|
{ command: 'claude-flow embeddings models', description: 'List models' },
|
|
1101
1236
|
{ command: 'claude-flow embeddings models -d all-MiniLM-L6-v2', description: 'Download model' },
|
|
1102
1237
|
],
|
|
1103
|
-
action:
|
|
1104
|
-
|
|
1105
|
-
|
|
1106
|
-
|
|
1107
|
-
|
|
1108
|
-
|
|
1109
|
-
|
|
1110
|
-
|
|
1111
|
-
|
|
1112
|
-
|
|
1113
|
-
|
|
1114
|
-
|
|
1115
|
-
|
|
1238
|
+
action: function (ctx) { return __awaiter(void 0, void 0, Promise, function () {
|
|
1239
|
+
var download, embeddings, spinner_2, err_1, models, _a;
|
|
1240
|
+
return __generator(this, function (_b) {
|
|
1241
|
+
switch (_b.label) {
|
|
1242
|
+
case 0:
|
|
1243
|
+
download = ctx.flags.download;
|
|
1244
|
+
return [4 /*yield*/, getEmbeddings()];
|
|
1245
|
+
case 1:
|
|
1246
|
+
embeddings = _b.sent();
|
|
1247
|
+
output.writeln();
|
|
1248
|
+
output.writeln(output.bold('Embedding Models'));
|
|
1249
|
+
output.writeln(output.dim('─'.repeat(60)));
|
|
1250
|
+
if (!download) return [3 /*break*/, 9];
|
|
1251
|
+
spinner_2 = output.createSpinner({ text: "Downloading " + download + "...", spinner: 'dots' });
|
|
1252
|
+
spinner_2.start();
|
|
1253
|
+
if (!embeddings) return [3 /*break*/, 6];
|
|
1254
|
+
_b.label = 2;
|
|
1255
|
+
case 2:
|
|
1256
|
+
_b.trys.push([2, 4, , 5]);
|
|
1257
|
+
return [4 /*yield*/, embeddings.downloadEmbeddingModel(download, '.models', function (p) {
|
|
1258
|
+
spinner_2.setText("Downloading " + download + "... " + p.percent.toFixed(1) + "%");
|
|
1259
|
+
})];
|
|
1260
|
+
case 3:
|
|
1261
|
+
_b.sent();
|
|
1262
|
+
spinner_2.succeed("Downloaded " + download);
|
|
1263
|
+
return [3 /*break*/, 5];
|
|
1264
|
+
case 4:
|
|
1265
|
+
err_1 = _b.sent();
|
|
1266
|
+
spinner_2.fail("Failed to download: " + err_1);
|
|
1267
|
+
return [2 /*return*/, { success: false, exitCode: 1 }];
|
|
1268
|
+
case 5: return [3 /*break*/, 8];
|
|
1269
|
+
case 6: return [4 /*yield*/, new Promise(function (r) { return setTimeout(r, 500); })];
|
|
1270
|
+
case 7:
|
|
1271
|
+
_b.sent();
|
|
1272
|
+
spinner_2.succeed("Download complete (simulated)");
|
|
1273
|
+
_b.label = 8;
|
|
1274
|
+
case 8: return [2 /*return*/, { success: true }];
|
|
1275
|
+
case 9:
|
|
1276
|
+
models = [
|
|
1277
|
+
{ id: 'all-MiniLM-L6-v2', dimension: 384, size: '23MB', quantized: false, downloaded: true },
|
|
1278
|
+
{ id: 'all-mpnet-base-v2', dimension: 768, size: '110MB', quantized: false, downloaded: false },
|
|
1279
|
+
{ id: 'paraphrase-MiniLM-L3-v2', dimension: 384, size: '17MB', quantized: false, downloaded: false },
|
|
1280
|
+
];
|
|
1281
|
+
if (!embeddings) return [3 /*break*/, 13];
|
|
1282
|
+
_b.label = 10;
|
|
1283
|
+
case 10:
|
|
1284
|
+
_b.trys.push([10, 12, , 13]);
|
|
1285
|
+
return [4 /*yield*/, embeddings.listEmbeddingModels()];
|
|
1286
|
+
case 11:
|
|
1287
|
+
models = _b.sent();
|
|
1288
|
+
return [3 /*break*/, 13];
|
|
1289
|
+
case 12:
|
|
1290
|
+
_a = _b.sent();
|
|
1291
|
+
return [3 /*break*/, 13];
|
|
1292
|
+
case 13:
|
|
1293
|
+
output.printTable({
|
|
1294
|
+
columns: [
|
|
1295
|
+
{ key: 'id', header: 'Model ID', width: 28 },
|
|
1296
|
+
{ key: 'dimension', header: 'Dims', width: 8 },
|
|
1297
|
+
{ key: 'size', header: 'Size', width: 10 },
|
|
1298
|
+
{ key: 'quantized', header: 'Quant', width: 8 },
|
|
1299
|
+
{ key: 'downloaded', header: 'Status', width: 12 },
|
|
1300
|
+
],
|
|
1301
|
+
data: models.map(function (m) { return ({
|
|
1302
|
+
id: m.id,
|
|
1303
|
+
dimension: String(m.dimension),
|
|
1304
|
+
size: m.size,
|
|
1305
|
+
quantized: m.quantized ? 'Yes' : 'No',
|
|
1306
|
+
downloaded: m.downloaded ? output.success('Downloaded') : output.dim('Available')
|
|
1307
|
+
}); })
|
|
1116
1308
|
});
|
|
1117
|
-
|
|
1118
|
-
}
|
|
1119
|
-
catch (err) {
|
|
1120
|
-
spinner.fail(`Failed to download: ${err}`);
|
|
1121
|
-
return { success: false, exitCode: 1 };
|
|
1122
|
-
}
|
|
1123
|
-
}
|
|
1124
|
-
else {
|
|
1125
|
-
await new Promise(r => setTimeout(r, 500));
|
|
1126
|
-
spinner.succeed(`Download complete (simulated)`);
|
|
1309
|
+
return [2 /*return*/, { success: true }];
|
|
1127
1310
|
}
|
|
1128
|
-
return { success: true };
|
|
1129
|
-
}
|
|
1130
|
-
// List models
|
|
1131
|
-
let models = [
|
|
1132
|
-
{ id: 'all-MiniLM-L6-v2', dimension: 384, size: '23MB', quantized: false, downloaded: true },
|
|
1133
|
-
{ id: 'all-mpnet-base-v2', dimension: 768, size: '110MB', quantized: false, downloaded: false },
|
|
1134
|
-
{ id: 'paraphrase-MiniLM-L3-v2', dimension: 384, size: '17MB', quantized: false, downloaded: false },
|
|
1135
|
-
];
|
|
1136
|
-
if (embeddings) {
|
|
1137
|
-
try {
|
|
1138
|
-
models = await embeddings.listEmbeddingModels();
|
|
1139
|
-
}
|
|
1140
|
-
catch { /* use defaults */ }
|
|
1141
|
-
}
|
|
1142
|
-
output.printTable({
|
|
1143
|
-
columns: [
|
|
1144
|
-
{ key: 'id', header: 'Model ID', width: 28 },
|
|
1145
|
-
{ key: 'dimension', header: 'Dims', width: 8 },
|
|
1146
|
-
{ key: 'size', header: 'Size', width: 10 },
|
|
1147
|
-
{ key: 'quantized', header: 'Quant', width: 8 },
|
|
1148
|
-
{ key: 'downloaded', header: 'Status', width: 12 },
|
|
1149
|
-
],
|
|
1150
|
-
data: models.map(m => ({
|
|
1151
|
-
id: m.id,
|
|
1152
|
-
dimension: String(m.dimension),
|
|
1153
|
-
size: m.size,
|
|
1154
|
-
quantized: m.quantized ? 'Yes' : 'No',
|
|
1155
|
-
downloaded: m.downloaded ? output.success('Downloaded') : output.dim('Available'),
|
|
1156
|
-
})),
|
|
1157
1311
|
});
|
|
1158
|
-
|
|
1159
|
-
},
|
|
1312
|
+
}); }
|
|
1160
1313
|
};
|
|
1161
1314
|
// Cache subcommand
|
|
1162
|
-
|
|
1315
|
+
var cacheCommand = {
|
|
1163
1316
|
name: 'cache',
|
|
1164
1317
|
description: 'Manage embedding cache',
|
|
1165
1318
|
options: [
|
|
1166
|
-
{ name: 'action', short: 'a', type: 'string', description: 'Action: stats, clear, persist', default: 'stats' },
|
|
1167
|
-
{ name: 'db-path', type: 'string', description: 'SQLite database path', default: '.cache/embeddings.db' },
|
|
1319
|
+
{ name: 'action', short: 'a', type: 'string', description: 'Action: stats, clear, persist', "default": 'stats' },
|
|
1320
|
+
{ name: 'db-path', type: 'string', description: 'SQLite database path', "default": '.cache/embeddings.db' },
|
|
1168
1321
|
],
|
|
1169
1322
|
examples: [
|
|
1170
1323
|
{ command: 'claude-flow embeddings cache', description: 'Show cache stats' },
|
|
1171
1324
|
{ command: 'claude-flow embeddings cache -a clear', description: 'Clear cache' },
|
|
1172
1325
|
],
|
|
1173
|
-
action:
|
|
1174
|
-
|
|
1175
|
-
|
|
1176
|
-
|
|
1177
|
-
|
|
1178
|
-
|
|
1179
|
-
|
|
1180
|
-
|
|
1181
|
-
|
|
1182
|
-
|
|
1183
|
-
|
|
1184
|
-
|
|
1185
|
-
|
|
1186
|
-
|
|
1187
|
-
|
|
1188
|
-
|
|
1189
|
-
|
|
1190
|
-
|
|
1191
|
-
|
|
1192
|
-
|
|
1193
|
-
|
|
1194
|
-
|
|
1195
|
-
|
|
1196
|
-
|
|
1197
|
-
|
|
1198
|
-
|
|
1199
|
-
|
|
1200
|
-
|
|
1201
|
-
|
|
1202
|
-
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
|
|
1206
|
-
|
|
1207
|
-
|
|
1326
|
+
action: function (ctx) { return __awaiter(void 0, void 0, Promise, function () {
|
|
1327
|
+
var action, dbPath, fs, path, resolvedDbPath, sqliteEntries, sqliteSize, sqliteExists, stats, sizeBytes, initSqlJs, SQL, fileBuffer, db, result, _a, _b, memoryEntries, memorySize, getHNSWStatus, hnswStatus, memBytes, _c;
|
|
1328
|
+
return __generator(this, function (_d) {
|
|
1329
|
+
switch (_d.label) {
|
|
1330
|
+
case 0:
|
|
1331
|
+
action = ctx.flags.action || 'stats';
|
|
1332
|
+
dbPath = ctx.flags['db-path'] || '.cache/embeddings.db';
|
|
1333
|
+
output.writeln();
|
|
1334
|
+
output.writeln(output.bold('Embedding Cache'));
|
|
1335
|
+
output.writeln(output.dim('─'.repeat(50)));
|
|
1336
|
+
return [4 /*yield*/, import('fs')];
|
|
1337
|
+
case 1:
|
|
1338
|
+
fs = _d.sent();
|
|
1339
|
+
return [4 /*yield*/, import('path')];
|
|
1340
|
+
case 2:
|
|
1341
|
+
path = _d.sent();
|
|
1342
|
+
resolvedDbPath = path.resolve(dbPath);
|
|
1343
|
+
sqliteEntries = 0;
|
|
1344
|
+
sqliteSize = '0 B';
|
|
1345
|
+
sqliteExists = false;
|
|
1346
|
+
_d.label = 3;
|
|
1347
|
+
case 3:
|
|
1348
|
+
_d.trys.push([3, 9, , 10]);
|
|
1349
|
+
if (!fs.existsSync(resolvedDbPath)) return [3 /*break*/, 8];
|
|
1350
|
+
sqliteExists = true;
|
|
1351
|
+
stats = fs.statSync(resolvedDbPath);
|
|
1352
|
+
sizeBytes = stats.size;
|
|
1353
|
+
// Format size
|
|
1354
|
+
if (sizeBytes >= 1024 * 1024) {
|
|
1355
|
+
sqliteSize = (sizeBytes / 1024 / 1024).toFixed(1) + " MB";
|
|
1356
|
+
}
|
|
1357
|
+
else if (sizeBytes >= 1024) {
|
|
1358
|
+
sqliteSize = (sizeBytes / 1024).toFixed(1) + " KB";
|
|
1359
|
+
}
|
|
1360
|
+
else {
|
|
1361
|
+
sqliteSize = sizeBytes + " B";
|
|
1362
|
+
}
|
|
1363
|
+
_d.label = 4;
|
|
1364
|
+
case 4:
|
|
1365
|
+
_d.trys.push([4, 7, , 8]);
|
|
1366
|
+
return [4 /*yield*/, import('sql.js')];
|
|
1367
|
+
case 5:
|
|
1368
|
+
initSqlJs = (_d.sent())["default"];
|
|
1369
|
+
return [4 /*yield*/, initSqlJs()];
|
|
1370
|
+
case 6:
|
|
1371
|
+
SQL = _d.sent();
|
|
1372
|
+
fileBuffer = fs.readFileSync(resolvedDbPath);
|
|
1373
|
+
db = new SQL.Database(fileBuffer);
|
|
1374
|
+
result = db.exec('SELECT COUNT(*) as count FROM embeddings');
|
|
1208
1375
|
if (result.length > 0 && result[0].values.length > 0) {
|
|
1209
1376
|
sqliteEntries = result[0].values[0][0];
|
|
1210
1377
|
}
|
|
1211
1378
|
db.close();
|
|
1212
|
-
|
|
1213
|
-
|
|
1379
|
+
return [3 /*break*/, 8];
|
|
1380
|
+
case 7:
|
|
1381
|
+
_a = _d.sent();
|
|
1214
1382
|
// Estimate entries from file size (~1600 bytes per entry for 384-dim embeddings)
|
|
1215
1383
|
sqliteEntries = Math.floor(stats.size / 1600);
|
|
1216
|
-
|
|
1217
|
-
|
|
1218
|
-
|
|
1219
|
-
|
|
1220
|
-
|
|
1221
|
-
|
|
1222
|
-
|
|
1223
|
-
|
|
1224
|
-
|
|
1225
|
-
|
|
1226
|
-
|
|
1227
|
-
|
|
1228
|
-
|
|
1229
|
-
|
|
1230
|
-
|
|
1231
|
-
|
|
1232
|
-
|
|
1233
|
-
|
|
1234
|
-
|
|
1235
|
-
|
|
1236
|
-
|
|
1237
|
-
|
|
1238
|
-
|
|
1239
|
-
|
|
1240
|
-
|
|
1241
|
-
|
|
1242
|
-
|
|
1243
|
-
|
|
1244
|
-
|
|
1245
|
-
|
|
1246
|
-
|
|
1247
|
-
|
|
1248
|
-
|
|
1249
|
-
|
|
1250
|
-
|
|
1251
|
-
|
|
1252
|
-
|
|
1253
|
-
|
|
1254
|
-
|
|
1384
|
+
return [3 /*break*/, 8];
|
|
1385
|
+
case 8: return [3 /*break*/, 10];
|
|
1386
|
+
case 9:
|
|
1387
|
+
_b = _d.sent();
|
|
1388
|
+
return [3 /*break*/, 10];
|
|
1389
|
+
case 10:
|
|
1390
|
+
memoryEntries = 0;
|
|
1391
|
+
memorySize = '0 B';
|
|
1392
|
+
_d.label = 11;
|
|
1393
|
+
case 11:
|
|
1394
|
+
_d.trys.push([11, 13, , 14]);
|
|
1395
|
+
return [4 /*yield*/, import('../memory/memory-initializer.js')];
|
|
1396
|
+
case 12:
|
|
1397
|
+
getHNSWStatus = (_d.sent()).getHNSWStatus;
|
|
1398
|
+
hnswStatus = getHNSWStatus();
|
|
1399
|
+
if (hnswStatus && hnswStatus.initialized) {
|
|
1400
|
+
memoryEntries = hnswStatus.entryCount || 0;
|
|
1401
|
+
memBytes = memoryEntries * (hnswStatus.dimensions || 384) * 4;
|
|
1402
|
+
if (memBytes >= 1024 * 1024) {
|
|
1403
|
+
memorySize = (memBytes / 1024 / 1024).toFixed(1) + " MB";
|
|
1404
|
+
}
|
|
1405
|
+
else if (memBytes >= 1024) {
|
|
1406
|
+
memorySize = (memBytes / 1024).toFixed(1) + " KB";
|
|
1407
|
+
}
|
|
1408
|
+
else {
|
|
1409
|
+
memorySize = memBytes + " B";
|
|
1410
|
+
}
|
|
1411
|
+
}
|
|
1412
|
+
return [3 /*break*/, 14];
|
|
1413
|
+
case 13:
|
|
1414
|
+
_c = _d.sent();
|
|
1415
|
+
return [3 /*break*/, 14];
|
|
1416
|
+
case 14:
|
|
1417
|
+
if (action === 'clear') {
|
|
1418
|
+
try {
|
|
1419
|
+
if (fs.existsSync(resolvedDbPath)) {
|
|
1420
|
+
fs.unlinkSync(resolvedDbPath);
|
|
1421
|
+
output.writeln(output.success('Cache cleared!'));
|
|
1422
|
+
}
|
|
1423
|
+
else {
|
|
1424
|
+
output.writeln(output.dim('No cache to clear.'));
|
|
1425
|
+
}
|
|
1426
|
+
return [2 /*return*/, { success: true }];
|
|
1427
|
+
}
|
|
1428
|
+
catch (error) {
|
|
1429
|
+
output.printError("Failed to clear cache: " + error);
|
|
1430
|
+
return [2 /*return*/, { success: false }];
|
|
1431
|
+
}
|
|
1432
|
+
}
|
|
1433
|
+
// Display real stats
|
|
1434
|
+
output.printTable({
|
|
1435
|
+
columns: [
|
|
1436
|
+
{ key: 'cache', header: 'Cache Type', width: 18 },
|
|
1437
|
+
{ key: 'entries', header: 'Entries', width: 12 },
|
|
1438
|
+
{ key: 'status', header: 'Status', width: 12 },
|
|
1439
|
+
{ key: 'size', header: 'Size', width: 12 },
|
|
1440
|
+
],
|
|
1441
|
+
data: [
|
|
1442
|
+
{
|
|
1443
|
+
cache: 'LRU (Memory)',
|
|
1444
|
+
entries: String(memoryEntries),
|
|
1445
|
+
status: memoryEntries > 0 ? output.success('Active') : output.dim('Empty'),
|
|
1446
|
+
size: memorySize
|
|
1447
|
+
},
|
|
1448
|
+
{
|
|
1449
|
+
cache: 'SQLite (Disk)',
|
|
1450
|
+
entries: String(sqliteEntries),
|
|
1451
|
+
status: sqliteExists ? output.success('Active') : output.dim('Not Found'),
|
|
1452
|
+
size: sqliteSize
|
|
1453
|
+
},
|
|
1454
|
+
]
|
|
1455
|
+
});
|
|
1456
|
+
output.writeln();
|
|
1457
|
+
output.writeln(output.dim("Database: " + resolvedDbPath));
|
|
1458
|
+
if (sqliteExists) {
|
|
1459
|
+
output.writeln(output.dim('Persistent cache survives restarts'));
|
|
1460
|
+
}
|
|
1461
|
+
else {
|
|
1462
|
+
output.writeln(output.dim('Cache will be created on first embedding operation'));
|
|
1463
|
+
}
|
|
1464
|
+
return [2 /*return*/, { success: true }];
|
|
1255
1465
|
}
|
|
1256
|
-
}
|
|
1257
|
-
// Display real stats
|
|
1258
|
-
output.printTable({
|
|
1259
|
-
columns: [
|
|
1260
|
-
{ key: 'cache', header: 'Cache Type', width: 18 },
|
|
1261
|
-
{ key: 'entries', header: 'Entries', width: 12 },
|
|
1262
|
-
{ key: 'status', header: 'Status', width: 12 },
|
|
1263
|
-
{ key: 'size', header: 'Size', width: 12 },
|
|
1264
|
-
],
|
|
1265
|
-
data: [
|
|
1266
|
-
{
|
|
1267
|
-
cache: 'LRU (Memory)',
|
|
1268
|
-
entries: String(memoryEntries),
|
|
1269
|
-
status: memoryEntries > 0 ? output.success('Active') : output.dim('Empty'),
|
|
1270
|
-
size: memorySize,
|
|
1271
|
-
},
|
|
1272
|
-
{
|
|
1273
|
-
cache: 'SQLite (Disk)',
|
|
1274
|
-
entries: String(sqliteEntries),
|
|
1275
|
-
status: sqliteExists ? output.success('Active') : output.dim('Not Found'),
|
|
1276
|
-
size: sqliteSize,
|
|
1277
|
-
},
|
|
1278
|
-
],
|
|
1279
1466
|
});
|
|
1280
|
-
|
|
1281
|
-
output.writeln(output.dim(`Database: ${resolvedDbPath}`));
|
|
1282
|
-
if (sqliteExists) {
|
|
1283
|
-
output.writeln(output.dim('Persistent cache survives restarts'));
|
|
1284
|
-
}
|
|
1285
|
-
else {
|
|
1286
|
-
output.writeln(output.dim('Cache will be created on first embedding operation'));
|
|
1287
|
-
}
|
|
1288
|
-
return { success: true };
|
|
1289
|
-
},
|
|
1467
|
+
}); }
|
|
1290
1468
|
};
|
|
1291
1469
|
// Warmup subcommand - Preload model for faster first embed
|
|
1292
|
-
|
|
1470
|
+
var warmupCommand = {
|
|
1293
1471
|
name: 'warmup',
|
|
1294
1472
|
description: 'Preload embedding model for faster subsequent operations',
|
|
1295
1473
|
options: [
|
|
1296
|
-
{ name: 'background', short: 'b', type: 'boolean', description: 'Run warmup in background daemon', default: 'false' },
|
|
1297
|
-
{ name: 'test', short: 't', type: 'boolean', description: 'Run test embedding after warmup', default: 'true' },
|
|
1474
|
+
{ name: 'background', short: 'b', type: 'boolean', description: 'Run warmup in background daemon', "default": 'false' },
|
|
1475
|
+
{ name: 'test', short: 't', type: 'boolean', description: 'Run test embedding after warmup', "default": 'true' },
|
|
1298
1476
|
],
|
|
1299
1477
|
examples: [
|
|
1300
1478
|
{ command: 'claude-flow embeddings warmup', description: 'Preload model with test' },
|
|
1301
1479
|
{ command: 'claude-flow embeddings warmup -b', description: 'Background warmup' },
|
|
1302
1480
|
],
|
|
1303
|
-
action:
|
|
1304
|
-
|
|
1305
|
-
|
|
1306
|
-
|
|
1307
|
-
|
|
1308
|
-
|
|
1309
|
-
|
|
1310
|
-
|
|
1311
|
-
|
|
1312
|
-
|
|
1313
|
-
|
|
1314
|
-
|
|
1315
|
-
|
|
1316
|
-
|
|
1317
|
-
|
|
1318
|
-
|
|
1319
|
-
|
|
1320
|
-
|
|
1321
|
-
|
|
1322
|
-
|
|
1323
|
-
|
|
1324
|
-
|
|
1325
|
-
|
|
1326
|
-
|
|
1327
|
-
|
|
1328
|
-
|
|
1329
|
-
|
|
1330
|
-
|
|
1331
|
-
|
|
1481
|
+
action: function (ctx) { return __awaiter(void 0, void 0, Promise, function () {
|
|
1482
|
+
var runTest, background, spinner, overallStart, _a, loadEmbeddingModel, generateEmbedding, loadStart, modelInfo, loadTime, testSpinner, warmupTexts, embedTimes, _i, warmupTexts_1, text, embedStart, avgWarmEmbed, totalTime, error_8;
|
|
1483
|
+
return __generator(this, function (_b) {
|
|
1484
|
+
switch (_b.label) {
|
|
1485
|
+
case 0:
|
|
1486
|
+
runTest = ctx.flags.test !== false;
|
|
1487
|
+
background = ctx.flags.background === true;
|
|
1488
|
+
output.writeln();
|
|
1489
|
+
output.writeln(output.bold('Embedding Model Warmup'));
|
|
1490
|
+
output.writeln(output.dim('─'.repeat(50)));
|
|
1491
|
+
spinner = output.createSpinner({ text: 'Loading embedding model...', spinner: 'dots' });
|
|
1492
|
+
spinner.start();
|
|
1493
|
+
overallStart = Date.now();
|
|
1494
|
+
_b.label = 1;
|
|
1495
|
+
case 1:
|
|
1496
|
+
_b.trys.push([1, 9, , 10]);
|
|
1497
|
+
return [4 /*yield*/, import('../memory/memory-initializer.js')];
|
|
1498
|
+
case 2:
|
|
1499
|
+
_a = _b.sent(), loadEmbeddingModel = _a.loadEmbeddingModel, generateEmbedding = _a.generateEmbedding;
|
|
1500
|
+
loadStart = Date.now();
|
|
1501
|
+
return [4 /*yield*/, loadEmbeddingModel({ verbose: false })];
|
|
1502
|
+
case 3:
|
|
1503
|
+
modelInfo = _b.sent();
|
|
1504
|
+
loadTime = Date.now() - loadStart;
|
|
1505
|
+
spinner.succeed("Model loaded in " + loadTime + "ms");
|
|
1506
|
+
if (!runTest) return [3 /*break*/, 8];
|
|
1507
|
+
testSpinner = output.createSpinner({ text: 'Running warmup embedding...', spinner: 'dots' });
|
|
1508
|
+
testSpinner.start();
|
|
1509
|
+
warmupTexts = [
|
|
1510
|
+
'The quick brown fox jumps over the lazy dog',
|
|
1511
|
+
'Machine learning embeddings enable semantic search',
|
|
1512
|
+
'Vector databases use HNSW for fast similarity'
|
|
1513
|
+
];
|
|
1514
|
+
embedTimes = [];
|
|
1515
|
+
_i = 0, warmupTexts_1 = warmupTexts;
|
|
1516
|
+
_b.label = 4;
|
|
1517
|
+
case 4:
|
|
1518
|
+
if (!(_i < warmupTexts_1.length)) return [3 /*break*/, 7];
|
|
1519
|
+
text = warmupTexts_1[_i];
|
|
1520
|
+
embedStart = Date.now();
|
|
1521
|
+
return [4 /*yield*/, generateEmbedding(text)];
|
|
1522
|
+
case 5:
|
|
1523
|
+
_b.sent();
|
|
1332
1524
|
embedTimes.push(Date.now() - embedStart);
|
|
1333
|
-
|
|
1334
|
-
|
|
1335
|
-
|
|
1525
|
+
_b.label = 6;
|
|
1526
|
+
case 6:
|
|
1527
|
+
_i++;
|
|
1528
|
+
return [3 /*break*/, 4];
|
|
1529
|
+
case 7:
|
|
1530
|
+
avgWarmEmbed = embedTimes.slice(1).reduce(function (a, b) { return a + b; }, 0) / (embedTimes.length - 1);
|
|
1531
|
+
testSpinner.succeed("Warmup complete: " + avgWarmEmbed.toFixed(1) + "ms avg (warm)");
|
|
1532
|
+
_b.label = 8;
|
|
1533
|
+
case 8:
|
|
1534
|
+
totalTime = Date.now() - overallStart;
|
|
1535
|
+
output.writeln();
|
|
1536
|
+
output.printTable({
|
|
1537
|
+
columns: [
|
|
1538
|
+
{ key: 'metric', header: 'Metric', width: 22 },
|
|
1539
|
+
{ key: 'value', header: 'Value', width: 25 },
|
|
1540
|
+
],
|
|
1541
|
+
data: [
|
|
1542
|
+
{ metric: 'Model', value: modelInfo.modelName },
|
|
1543
|
+
{ metric: 'Dimensions', value: String(modelInfo.dimensions) },
|
|
1544
|
+
{ metric: 'Initial Load', value: loadTime + "ms" },
|
|
1545
|
+
{ metric: 'Warm Embed', value: runTest ? "~2-3ms" : 'Skipped' },
|
|
1546
|
+
{ metric: 'Total Warmup', value: totalTime + "ms" },
|
|
1547
|
+
{ metric: 'Status', value: output.success('Ready') },
|
|
1548
|
+
]
|
|
1549
|
+
});
|
|
1550
|
+
output.writeln();
|
|
1551
|
+
output.writeln(output.dim('Model is now cached for fast subsequent embeddings'));
|
|
1552
|
+
return [2 /*return*/, { success: true, data: { loadTime: loadTime, totalTime: totalTime, dimensions: modelInfo.dimensions } }];
|
|
1553
|
+
case 9:
|
|
1554
|
+
error_8 = _b.sent();
|
|
1555
|
+
spinner.fail('Warmup failed');
|
|
1556
|
+
output.printError(error_8 instanceof Error ? error_8.message : String(error_8));
|
|
1557
|
+
return [2 /*return*/, { success: false, exitCode: 1 }];
|
|
1558
|
+
case 10: return [2 /*return*/];
|
|
1336
1559
|
}
|
|
1337
|
-
|
|
1338
|
-
|
|
1339
|
-
output.printTable({
|
|
1340
|
-
columns: [
|
|
1341
|
-
{ key: 'metric', header: 'Metric', width: 22 },
|
|
1342
|
-
{ key: 'value', header: 'Value', width: 25 },
|
|
1343
|
-
],
|
|
1344
|
-
data: [
|
|
1345
|
-
{ metric: 'Model', value: modelInfo.modelName },
|
|
1346
|
-
{ metric: 'Dimensions', value: String(modelInfo.dimensions) },
|
|
1347
|
-
{ metric: 'Initial Load', value: `${loadTime}ms` },
|
|
1348
|
-
{ metric: 'Warm Embed', value: runTest ? `~2-3ms` : 'Skipped' },
|
|
1349
|
-
{ metric: 'Total Warmup', value: `${totalTime}ms` },
|
|
1350
|
-
{ metric: 'Status', value: output.success('Ready') },
|
|
1351
|
-
],
|
|
1352
|
-
});
|
|
1353
|
-
output.writeln();
|
|
1354
|
-
output.writeln(output.dim('Model is now cached for fast subsequent embeddings'));
|
|
1355
|
-
return { success: true, data: { loadTime, totalTime, dimensions: modelInfo.dimensions } };
|
|
1356
|
-
}
|
|
1357
|
-
catch (error) {
|
|
1358
|
-
spinner.fail('Warmup failed');
|
|
1359
|
-
output.printError(error instanceof Error ? error.message : String(error));
|
|
1360
|
-
return { success: false, exitCode: 1 };
|
|
1361
|
-
}
|
|
1362
|
-
},
|
|
1560
|
+
});
|
|
1561
|
+
}); }
|
|
1363
1562
|
};
|
|
1364
1563
|
// Benchmark subcommand - Performance testing
|
|
1365
|
-
|
|
1564
|
+
var benchmarkCommand = {
|
|
1366
1565
|
name: 'benchmark',
|
|
1367
1566
|
description: 'Run embedding performance benchmarks',
|
|
1368
1567
|
options: [
|
|
1369
|
-
{ name: 'iterations', short: 'n', type: 'number', description: 'Number of iterations', default: '10' },
|
|
1370
|
-
{ name: 'batch-size', short: 'b', type: 'number', description: 'Batch size for batch test', default: '5' },
|
|
1371
|
-
{ name: 'full', short: 'f', type: 'boolean', description: 'Run full benchmark suite', default: 'false' },
|
|
1568
|
+
{ name: 'iterations', short: 'n', type: 'number', description: 'Number of iterations', "default": '10' },
|
|
1569
|
+
{ name: 'batch-size', short: 'b', type: 'number', description: 'Batch size for batch test', "default": '5' },
|
|
1570
|
+
{ name: 'full', short: 'f', type: 'boolean', description: 'Run full benchmark suite', "default": 'false' },
|
|
1372
1571
|
],
|
|
1373
1572
|
examples: [
|
|
1374
1573
|
{ command: 'claude-flow embeddings benchmark', description: 'Quick benchmark' },
|
|
1375
1574
|
{ command: 'claude-flow embeddings benchmark -n 50 -f', description: 'Full benchmark' },
|
|
1376
1575
|
],
|
|
1377
|
-
action:
|
|
1378
|
-
|
|
1379
|
-
|
|
1380
|
-
|
|
1381
|
-
|
|
1382
|
-
|
|
1383
|
-
|
|
1384
|
-
|
|
1385
|
-
|
|
1386
|
-
|
|
1387
|
-
|
|
1388
|
-
|
|
1389
|
-
|
|
1390
|
-
|
|
1391
|
-
|
|
1392
|
-
|
|
1393
|
-
|
|
1394
|
-
|
|
1395
|
-
|
|
1396
|
-
|
|
1397
|
-
|
|
1398
|
-
|
|
1399
|
-
|
|
1400
|
-
|
|
1401
|
-
|
|
1402
|
-
|
|
1403
|
-
|
|
1404
|
-
|
|
1405
|
-
|
|
1406
|
-
|
|
1407
|
-
|
|
1408
|
-
|
|
1409
|
-
|
|
1410
|
-
|
|
1411
|
-
|
|
1412
|
-
|
|
1413
|
-
|
|
1414
|
-
|
|
1415
|
-
|
|
1416
|
-
|
|
1417
|
-
|
|
1418
|
-
|
|
1419
|
-
|
|
1420
|
-
|
|
1421
|
-
|
|
1422
|
-
|
|
1423
|
-
|
|
1424
|
-
|
|
1425
|
-
|
|
1426
|
-
|
|
1427
|
-
|
|
1428
|
-
|
|
1429
|
-
|
|
1430
|
-
|
|
1431
|
-
|
|
1432
|
-
|
|
1433
|
-
|
|
1434
|
-
|
|
1435
|
-
|
|
1436
|
-
|
|
1437
|
-
|
|
1438
|
-
|
|
1439
|
-
|
|
1440
|
-
|
|
1441
|
-
|
|
1442
|
-
|
|
1443
|
-
|
|
1444
|
-
|
|
1445
|
-
|
|
1446
|
-
|
|
1447
|
-
|
|
1448
|
-
|
|
1449
|
-
|
|
1450
|
-
|
|
1451
|
-
|
|
1452
|
-
|
|
1453
|
-
|
|
1454
|
-
|
|
1455
|
-
|
|
1456
|
-
|
|
1457
|
-
|
|
1576
|
+
action: function (ctx) { return __awaiter(void 0, void 0, Promise, function () {
|
|
1577
|
+
var iterations, batchSize, full, results, _a, loadEmbeddingModel, generateEmbedding_1, coldStart, modelInfo, coldTime, firstStart, firstTime, warmTimes, i, start, avgWarm, minWarm, maxWarm, batchTexts, seqStart, _i, batchTexts_1, text, seqTime, parallelTexts, parallelStart, parallelTime, speedup, cacheText, cacheTimes, i, start, avgCache, emb1, emb2, simTimes, i, start, avgSim, error_9;
|
|
1578
|
+
return __generator(this, function (_b) {
|
|
1579
|
+
switch (_b.label) {
|
|
1580
|
+
case 0:
|
|
1581
|
+
iterations = parseInt(ctx.flags.iterations || '10', 10);
|
|
1582
|
+
batchSize = parseInt(ctx.flags['batch-size'] || '5', 10);
|
|
1583
|
+
full = ctx.flags.full === true;
|
|
1584
|
+
output.writeln();
|
|
1585
|
+
output.writeln(output.bold('Embedding Performance Benchmark'));
|
|
1586
|
+
output.writeln(output.dim('─'.repeat(60)));
|
|
1587
|
+
results = [];
|
|
1588
|
+
_b.label = 1;
|
|
1589
|
+
case 1:
|
|
1590
|
+
_b.trys.push([1, 22, , 23]);
|
|
1591
|
+
return [4 /*yield*/, import('../memory/memory-initializer.js')];
|
|
1592
|
+
case 2:
|
|
1593
|
+
_a = _b.sent(), loadEmbeddingModel = _a.loadEmbeddingModel, generateEmbedding_1 = _a.generateEmbedding;
|
|
1594
|
+
// Test 1: Cold start (model load)
|
|
1595
|
+
output.writeln(output.dim('Testing cold start...'));
|
|
1596
|
+
coldStart = Date.now();
|
|
1597
|
+
return [4 /*yield*/, loadEmbeddingModel({ verbose: false })];
|
|
1598
|
+
case 3:
|
|
1599
|
+
modelInfo = _b.sent();
|
|
1600
|
+
coldTime = Date.now() - coldStart;
|
|
1601
|
+
results.push({
|
|
1602
|
+
test: 'Cold Start (model load)',
|
|
1603
|
+
time: coldTime + "ms",
|
|
1604
|
+
opsPerSec: '-'
|
|
1605
|
+
});
|
|
1606
|
+
firstStart = Date.now();
|
|
1607
|
+
return [4 /*yield*/, generateEmbedding_1('First embedding test')];
|
|
1608
|
+
case 4:
|
|
1609
|
+
_b.sent();
|
|
1610
|
+
firstTime = Date.now() - firstStart;
|
|
1611
|
+
results.push({
|
|
1612
|
+
test: 'First Embed',
|
|
1613
|
+
time: firstTime + "ms",
|
|
1614
|
+
opsPerSec: "" + (1000 / firstTime).toFixed(1)
|
|
1615
|
+
});
|
|
1616
|
+
// Test 3: Warm embeds (multiple iterations)
|
|
1617
|
+
output.writeln(output.dim("Testing " + iterations + " warm embeds..."));
|
|
1618
|
+
warmTimes = [];
|
|
1619
|
+
i = 0;
|
|
1620
|
+
_b.label = 5;
|
|
1621
|
+
case 5:
|
|
1622
|
+
if (!(i < iterations)) return [3 /*break*/, 8];
|
|
1623
|
+
start = Date.now();
|
|
1624
|
+
return [4 /*yield*/, generateEmbedding_1("Warm embedding test " + i + " with some content")];
|
|
1625
|
+
case 6:
|
|
1626
|
+
_b.sent();
|
|
1627
|
+
warmTimes.push(Date.now() - start);
|
|
1628
|
+
_b.label = 7;
|
|
1629
|
+
case 7:
|
|
1630
|
+
i++;
|
|
1631
|
+
return [3 /*break*/, 5];
|
|
1632
|
+
case 8:
|
|
1633
|
+
avgWarm = warmTimes.reduce(function (a, b) { return a + b; }, 0) / warmTimes.length;
|
|
1634
|
+
minWarm = Math.min.apply(Math, warmTimes);
|
|
1635
|
+
maxWarm = Math.max.apply(Math, warmTimes);
|
|
1636
|
+
results.push({
|
|
1637
|
+
test: "Warm Embed (n=" + iterations + ")",
|
|
1638
|
+
time: avgWarm.toFixed(1) + "ms avg (" + minWarm + "-" + maxWarm + ")",
|
|
1639
|
+
opsPerSec: "" + (1000 / avgWarm).toFixed(1)
|
|
1640
|
+
});
|
|
1641
|
+
// Test 4a: Sequential batch embed
|
|
1642
|
+
output.writeln(output.dim("Testing sequential batch of " + batchSize + "..."));
|
|
1643
|
+
batchTexts = Array.from({ length: batchSize }, function (_, i) { return "Batch text " + (i + 1) + " for testing"; });
|
|
1644
|
+
seqStart = Date.now();
|
|
1645
|
+
_i = 0, batchTexts_1 = batchTexts;
|
|
1646
|
+
_b.label = 9;
|
|
1647
|
+
case 9:
|
|
1648
|
+
if (!(_i < batchTexts_1.length)) return [3 /*break*/, 12];
|
|
1649
|
+
text = batchTexts_1[_i];
|
|
1650
|
+
return [4 /*yield*/, generateEmbedding_1(text)];
|
|
1651
|
+
case 10:
|
|
1652
|
+
_b.sent();
|
|
1653
|
+
_b.label = 11;
|
|
1654
|
+
case 11:
|
|
1655
|
+
_i++;
|
|
1656
|
+
return [3 /*break*/, 9];
|
|
1657
|
+
case 12:
|
|
1658
|
+
seqTime = Date.now() - seqStart;
|
|
1659
|
+
results.push({
|
|
1660
|
+
test: "Sequential (n=" + batchSize + ")",
|
|
1661
|
+
time: seqTime + "ms total (" + (seqTime / batchSize).toFixed(1) + "ms/item)",
|
|
1662
|
+
opsPerSec: "" + (1000 * batchSize / seqTime).toFixed(1)
|
|
1663
|
+
});
|
|
1664
|
+
// Test 4b: Parallel batch embed
|
|
1665
|
+
// Note: Local ONNX is CPU-bound so parallelism has limited benefit
|
|
1666
|
+
// Parallelism gives 2-4x speedup for API-based providers (OpenAI, etc.)
|
|
1667
|
+
output.writeln(output.dim("Testing parallel batch of " + batchSize + "..."));
|
|
1668
|
+
parallelTexts = Array.from({ length: batchSize }, function (_, i) { return "Parallel batch text " + (i + 1); });
|
|
1669
|
+
parallelStart = Date.now();
|
|
1670
|
+
return [4 /*yield*/, Promise.all(parallelTexts.map(function (text) { return generateEmbedding_1(text); }))];
|
|
1671
|
+
case 13:
|
|
1672
|
+
_b.sent();
|
|
1673
|
+
parallelTime = Date.now() - parallelStart;
|
|
1674
|
+
speedup = seqTime / parallelTime;
|
|
1675
|
+
results.push({
|
|
1676
|
+
test: "Parallel (n=" + batchSize + ")",
|
|
1677
|
+
time: parallelTime + "ms total (" + (parallelTime / batchSize).toFixed(1) + "ms/item)",
|
|
1678
|
+
opsPerSec: (1000 * batchSize / parallelTime).toFixed(1) + " (" + speedup.toFixed(2) + "x vs seq)"
|
|
1679
|
+
});
|
|
1680
|
+
if (!full) return [3 /*break*/, 21];
|
|
1681
|
+
output.writeln(output.dim('Testing cache hits...'));
|
|
1682
|
+
cacheText = 'Cached embedding test text';
|
|
1683
|
+
return [4 /*yield*/, generateEmbedding_1(cacheText)];
|
|
1684
|
+
case 14:
|
|
1685
|
+
_b.sent(); // Prime cache
|
|
1686
|
+
cacheTimes = [];
|
|
1687
|
+
i = 0;
|
|
1688
|
+
_b.label = 15;
|
|
1689
|
+
case 15:
|
|
1690
|
+
if (!(i < 10)) return [3 /*break*/, 18];
|
|
1691
|
+
start = Date.now();
|
|
1692
|
+
return [4 /*yield*/, generateEmbedding_1(cacheText)];
|
|
1693
|
+
case 16:
|
|
1694
|
+
_b.sent();
|
|
1458
1695
|
cacheTimes.push(Date.now() - start);
|
|
1459
|
-
|
|
1460
|
-
|
|
1461
|
-
|
|
1462
|
-
|
|
1463
|
-
|
|
1464
|
-
|
|
1465
|
-
|
|
1466
|
-
|
|
1467
|
-
|
|
1468
|
-
|
|
1469
|
-
|
|
1470
|
-
|
|
1471
|
-
|
|
1472
|
-
|
|
1473
|
-
|
|
1474
|
-
|
|
1475
|
-
|
|
1476
|
-
|
|
1477
|
-
|
|
1478
|
-
|
|
1479
|
-
|
|
1480
|
-
|
|
1481
|
-
|
|
1696
|
+
_b.label = 17;
|
|
1697
|
+
case 17:
|
|
1698
|
+
i++;
|
|
1699
|
+
return [3 /*break*/, 15];
|
|
1700
|
+
case 18:
|
|
1701
|
+
avgCache = cacheTimes.reduce(function (a, b) { return a + b; }, 0) / cacheTimes.length;
|
|
1702
|
+
results.push({
|
|
1703
|
+
test: 'Cache Hit',
|
|
1704
|
+
time: avgCache.toFixed(2) + "ms avg",
|
|
1705
|
+
opsPerSec: "" + (1000 / avgCache).toFixed(0)
|
|
1706
|
+
});
|
|
1707
|
+
// Test 6: Similarity computation
|
|
1708
|
+
output.writeln(output.dim('Testing similarity...'));
|
|
1709
|
+
return [4 /*yield*/, generateEmbedding_1('Hello world')];
|
|
1710
|
+
case 19:
|
|
1711
|
+
emb1 = (_b.sent()).embedding;
|
|
1712
|
+
return [4 /*yield*/, generateEmbedding_1('Hi there')];
|
|
1713
|
+
case 20:
|
|
1714
|
+
emb2 = (_b.sent()).embedding;
|
|
1715
|
+
simTimes = [];
|
|
1716
|
+
for (i = 0; i < 1000; i++) {
|
|
1717
|
+
start = performance.now();
|
|
1718
|
+
cosineSimilarity(emb1, emb2);
|
|
1719
|
+
simTimes.push(performance.now() - start);
|
|
1720
|
+
}
|
|
1721
|
+
avgSim = simTimes.reduce(function (a, b) { return a + b; }, 0) / simTimes.length;
|
|
1722
|
+
results.push({
|
|
1723
|
+
test: 'Cosine Similarity',
|
|
1724
|
+
time: (avgSim * 1000).toFixed(2) + "\u03BCs",
|
|
1725
|
+
opsPerSec: "" + (1000000 / (avgSim * 1000)).toFixed(0)
|
|
1726
|
+
});
|
|
1727
|
+
_b.label = 21;
|
|
1728
|
+
case 21:
|
|
1729
|
+
output.writeln();
|
|
1730
|
+
output.printTable({
|
|
1731
|
+
columns: [
|
|
1732
|
+
{ key: 'test', header: 'Test', width: 28 },
|
|
1733
|
+
{ key: 'time', header: 'Time', width: 32 },
|
|
1734
|
+
{ key: 'opsPerSec', header: 'Ops/sec', width: 12 },
|
|
1735
|
+
],
|
|
1736
|
+
data: results
|
|
1737
|
+
});
|
|
1738
|
+
output.writeln();
|
|
1739
|
+
output.writeln(output.bold('Summary:'));
|
|
1740
|
+
output.writeln(" Model: " + modelInfo.modelName + " (" + modelInfo.dimensions + "-dim)");
|
|
1741
|
+
output.writeln(" Cold start: " + coldTime + "ms");
|
|
1742
|
+
output.writeln(" Warm embed: ~" + avgWarm.toFixed(1) + "ms");
|
|
1743
|
+
output.writeln(" Throughput: ~" + (1000 / avgWarm).toFixed(0) + " embeds/sec");
|
|
1744
|
+
return [2 /*return*/, { success: true, data: { results: results, avgWarm: avgWarm, coldTime: coldTime } }];
|
|
1745
|
+
case 22:
|
|
1746
|
+
error_9 = _b.sent();
|
|
1747
|
+
output.printError(error_9 instanceof Error ? error_9.message : String(error_9));
|
|
1748
|
+
return [2 /*return*/, { success: false, exitCode: 1 }];
|
|
1749
|
+
case 23: return [2 /*return*/];
|
|
1482
1750
|
}
|
|
1483
|
-
|
|
1484
|
-
|
|
1485
|
-
columns: [
|
|
1486
|
-
{ key: 'test', header: 'Test', width: 28 },
|
|
1487
|
-
{ key: 'time', header: 'Time', width: 32 },
|
|
1488
|
-
{ key: 'opsPerSec', header: 'Ops/sec', width: 12 },
|
|
1489
|
-
],
|
|
1490
|
-
data: results,
|
|
1491
|
-
});
|
|
1492
|
-
output.writeln();
|
|
1493
|
-
output.writeln(output.bold('Summary:'));
|
|
1494
|
-
output.writeln(` Model: ${modelInfo.modelName} (${modelInfo.dimensions}-dim)`);
|
|
1495
|
-
output.writeln(` Cold start: ${coldTime}ms`);
|
|
1496
|
-
output.writeln(` Warm embed: ~${avgWarm.toFixed(1)}ms`);
|
|
1497
|
-
output.writeln(` Throughput: ~${(1000 / avgWarm).toFixed(0)} embeds/sec`);
|
|
1498
|
-
return { success: true, data: { results, avgWarm, coldTime } };
|
|
1499
|
-
}
|
|
1500
|
-
catch (error) {
|
|
1501
|
-
output.printError(error instanceof Error ? error.message : String(error));
|
|
1502
|
-
return { success: false, exitCode: 1 };
|
|
1503
|
-
}
|
|
1504
|
-
},
|
|
1751
|
+
});
|
|
1752
|
+
}); }
|
|
1505
1753
|
};
|
|
1506
1754
|
// Main embeddings command
|
|
1507
|
-
export
|
|
1755
|
+
export var embeddingsCommand = {
|
|
1508
1756
|
name: 'embeddings',
|
|
1509
1757
|
description: 'Vector embeddings, semantic search, similarity operations',
|
|
1510
1758
|
aliases: ['embed'],
|
|
@@ -1534,43 +1782,45 @@ export const embeddingsCommand = {
|
|
|
1534
1782
|
{ command: 'claude-flow embeddings hyperbolic -a convert', description: 'Hyperbolic space' },
|
|
1535
1783
|
{ command: 'claude-flow embed neural -f drift', description: 'Neural substrate' },
|
|
1536
1784
|
],
|
|
1537
|
-
action:
|
|
1538
|
-
|
|
1539
|
-
|
|
1540
|
-
|
|
1541
|
-
|
|
1542
|
-
|
|
1543
|
-
|
|
1544
|
-
|
|
1545
|
-
|
|
1546
|
-
|
|
1547
|
-
|
|
1548
|
-
|
|
1549
|
-
|
|
1550
|
-
|
|
1551
|
-
|
|
1552
|
-
|
|
1553
|
-
|
|
1554
|
-
|
|
1555
|
-
|
|
1556
|
-
|
|
1557
|
-
|
|
1558
|
-
|
|
1559
|
-
|
|
1560
|
-
|
|
1561
|
-
|
|
1562
|
-
|
|
1563
|
-
|
|
1564
|
-
|
|
1565
|
-
|
|
1566
|
-
|
|
1567
|
-
|
|
1568
|
-
|
|
1569
|
-
|
|
1570
|
-
|
|
1571
|
-
|
|
1572
|
-
|
|
1573
|
-
|
|
1785
|
+
action: function () { return __awaiter(void 0, void 0, Promise, function () {
|
|
1786
|
+
return __generator(this, function (_a) {
|
|
1787
|
+
output.writeln();
|
|
1788
|
+
output.writeln(output.bold('RuFlo Embeddings'));
|
|
1789
|
+
output.writeln(output.dim('Vector embeddings and semantic search'));
|
|
1790
|
+
output.writeln();
|
|
1791
|
+
output.writeln('Core Commands:');
|
|
1792
|
+
output.printList([
|
|
1793
|
+
'init - Initialize ONNX models and hyperbolic config',
|
|
1794
|
+
'generate - Generate embeddings for text',
|
|
1795
|
+
'search - Semantic similarity search',
|
|
1796
|
+
'compare - Compare similarity between texts',
|
|
1797
|
+
'collections - Manage embedding collections',
|
|
1798
|
+
'index - Manage HNSW indexes',
|
|
1799
|
+
'providers - List available providers',
|
|
1800
|
+
]);
|
|
1801
|
+
output.writeln();
|
|
1802
|
+
output.writeln('Advanced Features:');
|
|
1803
|
+
output.printList([
|
|
1804
|
+
'chunk - Document chunking with overlap',
|
|
1805
|
+
'normalize - L2/L1/minmax/zscore normalization',
|
|
1806
|
+
'hyperbolic - Poincaré ball embeddings',
|
|
1807
|
+
'neural - Neural substrate (drift, memory, swarm)',
|
|
1808
|
+
'models - List/download ONNX models',
|
|
1809
|
+
'cache - Manage persistent SQLite cache',
|
|
1810
|
+
]);
|
|
1811
|
+
output.writeln();
|
|
1812
|
+
output.writeln('Performance:');
|
|
1813
|
+
output.printList([
|
|
1814
|
+
'HNSW indexing: 150x-12,500x faster search',
|
|
1815
|
+
'Agentic Flow: 75x faster than Transformers.js (~3ms)',
|
|
1816
|
+
'Persistent cache: SQLite-backed, survives restarts',
|
|
1817
|
+
'Hyperbolic: Better hierarchical representation',
|
|
1818
|
+
]);
|
|
1819
|
+
output.writeln();
|
|
1820
|
+
output.writeln(output.dim('Created with ❤️ by ruv.io'));
|
|
1821
|
+
return [2 /*return*/, { success: true }];
|
|
1822
|
+
});
|
|
1823
|
+
}); }
|
|
1574
1824
|
};
|
|
1575
1825
|
export default embeddingsCommand;
|
|
1576
1826
|
//# sourceMappingURL=embeddings.js.map
|