@claude-flow/cli 3.0.0-alpha.6 → 3.0.0-alpha.61
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/analysis/analyze-code-quality.md +181 -0
- package/.claude/agents/analysis/code-analyzer.md +210 -0
- package/.claude/agents/architecture/arch-system-design.md +157 -0
- package/.claude/agents/consensus/byzantine-coordinator.md +63 -0
- package/.claude/agents/consensus/crdt-synchronizer.md +997 -0
- package/.claude/agents/consensus/gossip-coordinator.md +63 -0
- package/.claude/agents/consensus/performance-benchmarker.md +851 -0
- package/.claude/agents/consensus/quorum-manager.md +823 -0
- package/.claude/agents/consensus/raft-manager.md +63 -0
- package/.claude/agents/consensus/security-manager.md +622 -0
- package/.claude/agents/core/coder.md +453 -0
- package/.claude/agents/core/planner.md +375 -0
- package/.claude/agents/core/researcher.md +369 -0
- package/.claude/agents/core/reviewer.md +520 -0
- package/.claude/agents/core/tester.md +512 -0
- package/.claude/agents/custom/test-long-runner.md +44 -0
- package/.claude/agents/data/data-ml-model.md +445 -0
- package/.claude/agents/development/dev-backend-api.md +346 -0
- package/.claude/agents/devops/ops-cicd-github.md +165 -0
- package/.claude/agents/documentation/docs-api-openapi.md +355 -0
- package/.claude/agents/flow-nexus/app-store.md +88 -0
- package/.claude/agents/flow-nexus/authentication.md +69 -0
- package/.claude/agents/flow-nexus/challenges.md +81 -0
- package/.claude/agents/flow-nexus/neural-network.md +88 -0
- package/.claude/agents/flow-nexus/payments.md +83 -0
- package/.claude/agents/flow-nexus/sandbox.md +76 -0
- package/.claude/agents/flow-nexus/swarm.md +76 -0
- package/.claude/agents/flow-nexus/user-tools.md +96 -0
- package/.claude/agents/flow-nexus/workflow.md +84 -0
- package/.claude/agents/github/code-review-swarm.md +377 -0
- package/.claude/agents/github/github-modes.md +173 -0
- package/.claude/agents/github/issue-tracker.md +576 -0
- package/.claude/agents/github/multi-repo-swarm.md +553 -0
- package/.claude/agents/github/pr-manager.md +438 -0
- package/.claude/agents/github/project-board-sync.md +509 -0
- package/.claude/agents/github/release-manager.md +605 -0
- package/.claude/agents/github/release-swarm.md +583 -0
- package/.claude/agents/github/repo-architect.md +398 -0
- package/.claude/agents/github/swarm-issue.md +573 -0
- package/.claude/agents/github/swarm-pr.md +428 -0
- package/.claude/agents/github/sync-coordinator.md +452 -0
- package/.claude/agents/github/workflow-automation.md +903 -0
- package/.claude/agents/goal/agent.md +816 -0
- package/.claude/agents/goal/goal-planner.md +73 -0
- package/.claude/agents/optimization/benchmark-suite.md +665 -0
- package/.claude/agents/optimization/load-balancer.md +431 -0
- package/.claude/agents/optimization/performance-monitor.md +672 -0
- package/.claude/agents/optimization/resource-allocator.md +674 -0
- package/.claude/agents/optimization/topology-optimizer.md +808 -0
- package/.claude/agents/payments/agentic-payments.md +126 -0
- package/.claude/agents/sona/sona-learning-optimizer.md +254 -0
- package/.claude/agents/sparc/architecture.md +699 -0
- package/.claude/agents/sparc/pseudocode.md +520 -0
- package/.claude/agents/sparc/refinement.md +802 -0
- package/.claude/agents/sparc/specification.md +478 -0
- package/.claude/agents/specialized/spec-mobile-react-native.md +227 -0
- package/.claude/agents/sublinear/consensus-coordinator.md +338 -0
- package/.claude/agents/sublinear/matrix-optimizer.md +185 -0
- package/.claude/agents/sublinear/pagerank-analyzer.md +299 -0
- package/.claude/agents/sublinear/performance-optimizer.md +368 -0
- package/.claude/agents/sublinear/trading-predictor.md +246 -0
- package/.claude/agents/swarm/adaptive-coordinator.md +1127 -0
- package/.claude/agents/swarm/hierarchical-coordinator.md +710 -0
- package/.claude/agents/swarm/mesh-coordinator.md +963 -0
- package/.claude/agents/templates/automation-smart-agent.md +205 -0
- package/.claude/agents/templates/base-template-generator.md +268 -0
- package/.claude/agents/templates/coordinator-swarm-init.md +90 -0
- package/.claude/agents/templates/github-pr-manager.md +177 -0
- package/.claude/agents/templates/implementer-sparc-coder.md +259 -0
- package/.claude/agents/templates/memory-coordinator.md +187 -0
- package/.claude/agents/templates/orchestrator-task.md +139 -0
- package/.claude/agents/templates/performance-analyzer.md +199 -0
- package/.claude/agents/templates/sparc-coordinator.md +514 -0
- package/.claude/agents/testing/production-validator.md +395 -0
- package/.claude/agents/testing/tdd-london-swarm.md +244 -0
- package/.claude/agents/v3/adr-architect.md +184 -0
- package/.claude/agents/v3/claims-authorizer.md +208 -0
- package/.claude/agents/v3/collective-intelligence-coordinator.md +993 -0
- package/.claude/agents/v3/ddd-domain-expert.md +220 -0
- package/.claude/agents/v3/memory-specialist.md +995 -0
- package/.claude/agents/v3/performance-engineer.md +1233 -0
- package/.claude/agents/v3/reasoningbank-learner.md +213 -0
- package/.claude/agents/v3/security-architect.md +867 -0
- package/.claude/agents/v3/security-auditor.md +771 -0
- package/.claude/agents/v3/sparc-orchestrator.md +182 -0
- package/.claude/agents/v3/swarm-memory-manager.md +157 -0
- package/.claude/agents/v3/v3-integration-architect.md +205 -0
- package/.claude/commands/agents/README.md +50 -0
- package/.claude/commands/agents/agent-capabilities.md +140 -0
- package/.claude/commands/agents/agent-coordination.md +28 -0
- package/.claude/commands/agents/agent-spawning.md +28 -0
- package/.claude/commands/agents/agent-types.md +216 -0
- package/.claude/commands/agents/health.md +139 -0
- package/.claude/commands/agents/list.md +100 -0
- package/.claude/commands/agents/logs.md +130 -0
- package/.claude/commands/agents/metrics.md +122 -0
- package/.claude/commands/agents/pool.md +127 -0
- package/.claude/commands/agents/spawn.md +140 -0
- package/.claude/commands/agents/status.md +115 -0
- package/.claude/commands/agents/stop.md +102 -0
- package/.claude/commands/analysis/COMMAND_COMPLIANCE_REPORT.md +54 -0
- package/.claude/commands/analysis/README.md +9 -0
- package/.claude/commands/analysis/bottleneck-detect.md +162 -0
- package/.claude/commands/analysis/performance-bottlenecks.md +59 -0
- package/.claude/commands/analysis/performance-report.md +25 -0
- package/.claude/commands/analysis/token-efficiency.md +45 -0
- package/.claude/commands/analysis/token-usage.md +25 -0
- package/.claude/commands/automation/README.md +9 -0
- package/.claude/commands/automation/auto-agent.md +122 -0
- package/.claude/commands/automation/self-healing.md +106 -0
- package/.claude/commands/automation/session-memory.md +90 -0
- package/.claude/commands/automation/smart-agents.md +73 -0
- package/.claude/commands/automation/smart-spawn.md +25 -0
- package/.claude/commands/automation/workflow-select.md +25 -0
- package/.claude/commands/claude-flow-help.md +103 -0
- package/.claude/commands/claude-flow-memory.md +107 -0
- package/.claude/commands/claude-flow-swarm.md +205 -0
- package/.claude/commands/coordination/README.md +9 -0
- package/.claude/commands/coordination/agent-spawn.md +25 -0
- package/.claude/commands/coordination/init.md +44 -0
- package/.claude/commands/coordination/orchestrate.md +43 -0
- package/.claude/commands/coordination/spawn.md +45 -0
- package/.claude/commands/coordination/swarm-init.md +85 -0
- package/.claude/commands/coordination/task-orchestrate.md +25 -0
- package/.claude/commands/flow-nexus/app-store.md +124 -0
- package/.claude/commands/flow-nexus/challenges.md +120 -0
- package/.claude/commands/flow-nexus/login-registration.md +65 -0
- package/.claude/commands/flow-nexus/neural-network.md +134 -0
- package/.claude/commands/flow-nexus/payments.md +116 -0
- package/.claude/commands/flow-nexus/sandbox.md +83 -0
- package/.claude/commands/flow-nexus/swarm.md +87 -0
- package/.claude/commands/flow-nexus/user-tools.md +152 -0
- package/.claude/commands/flow-nexus/workflow.md +115 -0
- package/.claude/commands/github/README.md +11 -0
- package/.claude/commands/github/code-review-swarm.md +514 -0
- package/.claude/commands/github/code-review.md +25 -0
- package/.claude/commands/github/github-modes.md +147 -0
- package/.claude/commands/github/github-swarm.md +121 -0
- package/.claude/commands/github/issue-tracker.md +292 -0
- package/.claude/commands/github/issue-triage.md +25 -0
- package/.claude/commands/github/multi-repo-swarm.md +519 -0
- package/.claude/commands/github/pr-enhance.md +26 -0
- package/.claude/commands/github/pr-manager.md +170 -0
- package/.claude/commands/github/project-board-sync.md +471 -0
- package/.claude/commands/github/release-manager.md +338 -0
- package/.claude/commands/github/release-swarm.md +544 -0
- package/.claude/commands/github/repo-analyze.md +25 -0
- package/.claude/commands/github/repo-architect.md +367 -0
- package/.claude/commands/github/swarm-issue.md +482 -0
- package/.claude/commands/github/swarm-pr.md +285 -0
- package/.claude/commands/github/sync-coordinator.md +301 -0
- package/.claude/commands/github/workflow-automation.md +442 -0
- package/.claude/commands/hive-mind/README.md +17 -0
- package/.claude/commands/hive-mind/hive-mind-consensus.md +8 -0
- package/.claude/commands/hive-mind/hive-mind-init.md +18 -0
- package/.claude/commands/hive-mind/hive-mind-memory.md +8 -0
- package/.claude/commands/hive-mind/hive-mind-metrics.md +8 -0
- package/.claude/commands/hive-mind/hive-mind-resume.md +8 -0
- package/.claude/commands/hive-mind/hive-mind-sessions.md +8 -0
- package/.claude/commands/hive-mind/hive-mind-spawn.md +21 -0
- package/.claude/commands/hive-mind/hive-mind-status.md +8 -0
- package/.claude/commands/hive-mind/hive-mind-stop.md +8 -0
- package/.claude/commands/hive-mind/hive-mind-wizard.md +8 -0
- package/.claude/commands/hive-mind/hive-mind.md +27 -0
- package/.claude/commands/hooks/README.md +11 -0
- package/.claude/commands/hooks/overview.md +58 -0
- package/.claude/commands/hooks/post-edit.md +117 -0
- package/.claude/commands/hooks/post-task.md +112 -0
- package/.claude/commands/hooks/pre-edit.md +113 -0
- package/.claude/commands/hooks/pre-task.md +111 -0
- package/.claude/commands/hooks/session-end.md +118 -0
- package/.claude/commands/hooks/setup.md +103 -0
- package/.claude/commands/memory/README.md +9 -0
- package/.claude/commands/memory/memory-persist.md +25 -0
- package/.claude/commands/memory/memory-search.md +25 -0
- package/.claude/commands/memory/memory-usage.md +25 -0
- package/.claude/commands/memory/neural.md +47 -0
- package/.claude/commands/monitoring/README.md +9 -0
- package/.claude/commands/monitoring/agent-metrics.md +25 -0
- package/.claude/commands/monitoring/agents.md +44 -0
- package/.claude/commands/monitoring/real-time-view.md +25 -0
- package/.claude/commands/monitoring/status.md +46 -0
- package/.claude/commands/monitoring/swarm-monitor.md +25 -0
- package/.claude/commands/optimization/README.md +9 -0
- package/.claude/commands/optimization/auto-topology.md +62 -0
- package/.claude/commands/optimization/cache-manage.md +25 -0
- package/.claude/commands/optimization/parallel-execute.md +25 -0
- package/.claude/commands/optimization/parallel-execution.md +50 -0
- package/.claude/commands/optimization/topology-optimize.md +25 -0
- package/.claude/commands/pair/README.md +261 -0
- package/.claude/commands/pair/commands.md +546 -0
- package/.claude/commands/pair/config.md +510 -0
- package/.claude/commands/pair/examples.md +512 -0
- package/.claude/commands/pair/modes.md +348 -0
- package/.claude/commands/pair/session.md +407 -0
- package/.claude/commands/pair/start.md +209 -0
- package/.claude/commands/sparc/analyzer.md +52 -0
- package/.claude/commands/sparc/architect.md +53 -0
- package/.claude/commands/sparc/ask.md +97 -0
- package/.claude/commands/sparc/batch-executor.md +54 -0
- package/.claude/commands/sparc/code.md +89 -0
- package/.claude/commands/sparc/coder.md +54 -0
- package/.claude/commands/sparc/debug.md +83 -0
- package/.claude/commands/sparc/debugger.md +54 -0
- package/.claude/commands/sparc/designer.md +53 -0
- package/.claude/commands/sparc/devops.md +109 -0
- package/.claude/commands/sparc/docs-writer.md +80 -0
- package/.claude/commands/sparc/documenter.md +54 -0
- package/.claude/commands/sparc/innovator.md +54 -0
- package/.claude/commands/sparc/integration.md +83 -0
- package/.claude/commands/sparc/mcp.md +117 -0
- package/.claude/commands/sparc/memory-manager.md +54 -0
- package/.claude/commands/sparc/optimizer.md +54 -0
- package/.claude/commands/sparc/orchestrator.md +132 -0
- package/.claude/commands/sparc/post-deployment-monitoring-mode.md +83 -0
- package/.claude/commands/sparc/refinement-optimization-mode.md +83 -0
- package/.claude/commands/sparc/researcher.md +54 -0
- package/.claude/commands/sparc/reviewer.md +54 -0
- package/.claude/commands/sparc/security-review.md +80 -0
- package/.claude/commands/sparc/sparc-modes.md +174 -0
- package/.claude/commands/sparc/sparc.md +111 -0
- package/.claude/commands/sparc/spec-pseudocode.md +80 -0
- package/.claude/commands/sparc/supabase-admin.md +348 -0
- package/.claude/commands/sparc/swarm-coordinator.md +54 -0
- package/.claude/commands/sparc/tdd.md +54 -0
- package/.claude/commands/sparc/tester.md +54 -0
- package/.claude/commands/sparc/tutorial.md +79 -0
- package/.claude/commands/sparc/workflow-manager.md +54 -0
- package/.claude/commands/sparc.md +166 -0
- package/.claude/commands/stream-chain/pipeline.md +121 -0
- package/.claude/commands/stream-chain/run.md +70 -0
- package/.claude/commands/swarm/README.md +15 -0
- package/.claude/commands/swarm/analysis.md +95 -0
- package/.claude/commands/swarm/development.md +96 -0
- package/.claude/commands/swarm/examples.md +168 -0
- package/.claude/commands/swarm/maintenance.md +102 -0
- package/.claude/commands/swarm/optimization.md +117 -0
- package/.claude/commands/swarm/research.md +136 -0
- package/.claude/commands/swarm/swarm-analysis.md +8 -0
- package/.claude/commands/swarm/swarm-background.md +8 -0
- package/.claude/commands/swarm/swarm-init.md +19 -0
- package/.claude/commands/swarm/swarm-modes.md +8 -0
- package/.claude/commands/swarm/swarm-monitor.md +8 -0
- package/.claude/commands/swarm/swarm-spawn.md +19 -0
- package/.claude/commands/swarm/swarm-status.md +8 -0
- package/.claude/commands/swarm/swarm-strategies.md +8 -0
- package/.claude/commands/swarm/swarm.md +87 -0
- package/.claude/commands/swarm/testing.md +131 -0
- package/.claude/commands/training/README.md +9 -0
- package/.claude/commands/training/model-update.md +25 -0
- package/.claude/commands/training/neural-patterns.md +74 -0
- package/.claude/commands/training/neural-train.md +25 -0
- package/.claude/commands/training/pattern-learn.md +25 -0
- package/.claude/commands/training/specialization.md +63 -0
- package/.claude/commands/truth/start.md +143 -0
- package/.claude/commands/verify/check.md +50 -0
- package/.claude/commands/verify/start.md +128 -0
- package/.claude/commands/workflows/README.md +9 -0
- package/.claude/commands/workflows/development.md +78 -0
- package/.claude/commands/workflows/research.md +63 -0
- package/.claude/commands/workflows/workflow-create.md +25 -0
- package/.claude/commands/workflows/workflow-execute.md +25 -0
- package/.claude/commands/workflows/workflow-export.md +25 -0
- package/.claude/helpers/README.md +97 -0
- package/.claude/helpers/adr-compliance.sh +186 -0
- package/.claude/helpers/auto-commit.sh +178 -0
- package/.claude/helpers/checkpoint-manager.sh +251 -0
- package/.claude/helpers/daemon-manager.sh +252 -0
- package/.claude/helpers/ddd-tracker.sh +144 -0
- package/.claude/helpers/github-safe.js +106 -0
- package/.claude/helpers/github-setup.sh +28 -0
- package/.claude/helpers/guidance-hook.sh +13 -0
- package/.claude/helpers/guidance-hooks.sh +102 -0
- package/.claude/helpers/health-monitor.sh +108 -0
- package/.claude/helpers/learning-hooks.sh +329 -0
- package/.claude/helpers/learning-optimizer.sh +127 -0
- package/.claude/helpers/learning-service.mjs +1144 -0
- package/.claude/helpers/memory.js +83 -0
- package/.claude/helpers/metrics-db.mjs +488 -0
- package/.claude/helpers/pattern-consolidator.sh +86 -0
- package/.claude/helpers/perf-worker.sh +160 -0
- package/.claude/helpers/post-commit +16 -0
- package/.claude/helpers/pre-commit +26 -0
- package/.claude/helpers/quick-start.sh +19 -0
- package/.claude/helpers/router.js +66 -0
- package/.claude/helpers/security-scanner.sh +127 -0
- package/.claude/helpers/session.js +127 -0
- package/.claude/helpers/setup-mcp.sh +18 -0
- package/.claude/helpers/standard-checkpoint-hooks.sh +189 -0
- package/.claude/helpers/statusline-hook.sh +21 -0
- package/.claude/helpers/statusline.js +316 -0
- package/.claude/helpers/swarm-comms.sh +353 -0
- package/.claude/helpers/swarm-hooks.sh +761 -0
- package/.claude/helpers/swarm-monitor.sh +211 -0
- package/.claude/helpers/sync-v3-metrics.sh +245 -0
- package/.claude/helpers/update-v3-progress.sh +166 -0
- package/.claude/helpers/v3-quick-status.sh +58 -0
- package/.claude/helpers/v3.sh +111 -0
- package/.claude/helpers/validate-v3-config.sh +216 -0
- package/.claude/helpers/worker-manager.sh +170 -0
- package/.claude/settings.json +259 -0
- package/.claude/skills/agentdb-advanced/SKILL.md +550 -0
- package/.claude/skills/agentdb-learning/SKILL.md +545 -0
- package/.claude/skills/agentdb-memory-patterns/SKILL.md +339 -0
- package/.claude/skills/agentdb-optimization/SKILL.md +509 -0
- package/.claude/skills/agentdb-vector-search/SKILL.md +339 -0
- package/.claude/skills/agentic-jujutsu/SKILL.md +645 -0
- package/.claude/skills/flow-nexus-neural/SKILL.md +738 -0
- package/.claude/skills/flow-nexus-platform/SKILL.md +1157 -0
- package/.claude/skills/flow-nexus-swarm/SKILL.md +610 -0
- package/.claude/skills/github-code-review/SKILL.md +1140 -0
- package/.claude/skills/github-multi-repo/SKILL.md +874 -0
- package/.claude/skills/github-project-management/SKILL.md +1277 -0
- package/.claude/skills/github-release-management/SKILL.md +1081 -0
- package/.claude/skills/github-workflow-automation/SKILL.md +1065 -0
- package/.claude/skills/hive-mind-advanced/SKILL.md +712 -0
- package/.claude/skills/hooks-automation/SKILL.md +1201 -0
- package/.claude/skills/pair-programming/SKILL.md +1202 -0
- package/.claude/skills/performance-analysis/SKILL.md +563 -0
- package/.claude/skills/reasoningbank-agentdb/SKILL.md +446 -0
- package/.claude/skills/reasoningbank-intelligence/SKILL.md +201 -0
- package/{.claude-flow → .claude/skills/skill-builder/.claude-flow}/metrics/performance.json +3 -3
- package/.claude/skills/skill-builder/.claude-flow/metrics/task-metrics.json +10 -0
- package/.claude/skills/skill-builder/SKILL.md +910 -0
- package/.claude/skills/sparc-methodology/SKILL.md +1115 -0
- package/.claude/skills/stream-chain/SKILL.md +563 -0
- package/.claude/skills/swarm-advanced/SKILL.md +973 -0
- package/.claude/skills/swarm-orchestration/SKILL.md +179 -0
- package/.claude/skills/v3-cli-modernization/SKILL.md +872 -0
- package/.claude/skills/v3-core-implementation/SKILL.md +797 -0
- package/.claude/skills/v3-ddd-architecture/SKILL.md +442 -0
- package/.claude/skills/v3-integration-deep/SKILL.md +241 -0
- package/.claude/skills/v3-mcp-optimization/SKILL.md +777 -0
- package/.claude/skills/v3-memory-unification/SKILL.md +174 -0
- package/.claude/skills/v3-performance-optimization/SKILL.md +390 -0
- package/.claude/skills/v3-security-overhaul/SKILL.md +82 -0
- package/.claude/skills/v3-swarm-coordination/SKILL.md +340 -0
- package/.claude/skills/verification-quality/SKILL.md +649 -0
- package/.claude/skills/worker-benchmarks/skill.md +135 -0
- package/.claude/skills/worker-integration/skill.md +154 -0
- package/README.md +428 -6
- package/bin/cli.js +142 -6
- package/bin/mcp-server.js +188 -0
- package/dist/src/commands/agent.d.ts.map +1 -1
- package/dist/src/commands/agent.js +42 -26
- package/dist/src/commands/agent.js.map +1 -1
- package/dist/src/commands/analyze.d.ts +19 -0
- package/dist/src/commands/analyze.d.ts.map +1 -0
- package/dist/src/commands/analyze.js +1823 -0
- package/dist/src/commands/analyze.js.map +1 -0
- package/dist/src/commands/claims.d.ts +10 -0
- package/dist/src/commands/claims.d.ts.map +1 -0
- package/dist/src/commands/claims.js +288 -0
- package/dist/src/commands/claims.js.map +1 -0
- package/dist/src/commands/completions.d.ts +10 -0
- package/dist/src/commands/completions.d.ts.map +1 -0
- package/dist/src/commands/completions.js +539 -0
- package/dist/src/commands/completions.js.map +1 -0
- package/dist/src/commands/daemon.d.ts +8 -0
- package/dist/src/commands/daemon.d.ts.map +1 -0
- package/dist/src/commands/daemon.js +593 -0
- package/dist/src/commands/daemon.js.map +1 -0
- package/dist/src/commands/deployment.d.ts +10 -0
- package/dist/src/commands/deployment.d.ts.map +1 -0
- package/dist/src/commands/deployment.js +289 -0
- package/dist/src/commands/deployment.js.map +1 -0
- package/dist/src/commands/doctor.d.ts +10 -0
- package/dist/src/commands/doctor.d.ts.map +1 -0
- package/dist/src/commands/doctor.js +448 -0
- package/dist/src/commands/doctor.js.map +1 -0
- package/dist/src/commands/embeddings.d.ts +18 -0
- package/dist/src/commands/embeddings.d.ts.map +1 -0
- package/dist/src/commands/embeddings.js +616 -0
- package/dist/src/commands/embeddings.js.map +1 -0
- package/dist/src/commands/hive-mind.d.ts.map +1 -1
- package/dist/src/commands/hive-mind.js +252 -35
- 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 +800 -6
- package/dist/src/commands/hooks.js.map +1 -1
- package/dist/src/commands/index.d.ts +52 -14
- package/dist/src/commands/index.d.ts.map +1 -1
- package/dist/src/commands/index.js +191 -38
- package/dist/src/commands/index.js.map +1 -1
- package/dist/src/commands/init.d.ts.map +1 -1
- package/dist/src/commands/init.js +80 -9
- package/dist/src/commands/init.js.map +1 -1
- package/dist/src/commands/issues.d.ts +21 -0
- package/dist/src/commands/issues.d.ts.map +1 -0
- package/dist/src/commands/issues.js +567 -0
- package/dist/src/commands/issues.js.map +1 -0
- package/dist/src/commands/mcp.js +3 -3
- 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 +223 -4
- package/dist/src/commands/memory.js.map +1 -1
- package/dist/src/commands/neural.d.ts +10 -0
- package/dist/src/commands/neural.d.ts.map +1 -0
- package/dist/src/commands/neural.js +224 -0
- package/dist/src/commands/neural.js.map +1 -0
- package/dist/src/commands/performance.d.ts +10 -0
- package/dist/src/commands/performance.d.ts.map +1 -0
- package/dist/src/commands/performance.js +262 -0
- package/dist/src/commands/performance.js.map +1 -0
- package/dist/src/commands/plugins.d.ts +11 -0
- package/dist/src/commands/plugins.d.ts.map +1 -0
- package/dist/src/commands/plugins.js +630 -0
- package/dist/src/commands/plugins.js.map +1 -0
- package/dist/src/commands/progress.d.ts +11 -0
- package/dist/src/commands/progress.d.ts.map +1 -0
- package/dist/src/commands/progress.js +259 -0
- package/dist/src/commands/progress.js.map +1 -0
- package/dist/src/commands/providers.d.ts +10 -0
- package/dist/src/commands/providers.d.ts.map +1 -0
- package/dist/src/commands/providers.js +232 -0
- package/dist/src/commands/providers.js.map +1 -0
- package/dist/src/commands/route.d.ts +16 -0
- package/dist/src/commands/route.d.ts.map +1 -0
- package/dist/src/commands/route.js +813 -0
- package/dist/src/commands/route.js.map +1 -0
- package/dist/src/commands/security.d.ts +10 -0
- package/dist/src/commands/security.d.ts.map +1 -0
- package/dist/src/commands/security.js +261 -0
- package/dist/src/commands/security.js.map +1 -0
- package/dist/src/commands/start.d.ts.map +1 -1
- package/dist/src/commands/start.js +22 -2
- package/dist/src/commands/start.js.map +1 -1
- package/dist/src/commands/swarm.d.ts.map +1 -1
- package/dist/src/commands/swarm.js +185 -32
- package/dist/src/commands/swarm.js.map +1 -1
- package/dist/src/commands/transfer-store.d.ts +13 -0
- package/dist/src/commands/transfer-store.d.ts.map +1 -0
- package/dist/src/commands/transfer-store.js +428 -0
- package/dist/src/commands/transfer-store.js.map +1 -0
- package/dist/src/index.d.ts +3 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +69 -10
- package/dist/src/index.js.map +1 -1
- package/dist/src/init/claudemd-generator.d.ts.map +1 -1
- package/dist/src/init/claudemd-generator.js +407 -405
- package/dist/src/init/claudemd-generator.js.map +1 -1
- package/dist/src/init/executor.d.ts.map +1 -1
- package/dist/src/init/executor.js +142 -31
- package/dist/src/init/executor.js.map +1 -1
- package/dist/src/init/helpers-generator.js +1 -1
- package/dist/src/init/helpers-generator.js.map +1 -1
- package/dist/src/init/mcp-generator.d.ts +9 -0
- package/dist/src/init/mcp-generator.d.ts.map +1 -1
- package/dist/src/init/mcp-generator.js +57 -28
- 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 +116 -62
- package/dist/src/init/settings-generator.js.map +1 -1
- package/dist/src/init/statusline-generator.d.ts +6 -0
- package/dist/src/init/statusline-generator.d.ts.map +1 -1
- package/dist/src/init/statusline-generator.js +252 -89
- package/dist/src/init/statusline-generator.js.map +1 -1
- package/dist/src/init/types.d.ts +6 -0
- package/dist/src/init/types.d.ts.map +1 -1
- package/dist/src/init/types.js +8 -2
- package/dist/src/init/types.js.map +1 -1
- package/dist/src/mcp-client.d.ts.map +1 -1
- package/dist/src/mcp-client.js +17 -1
- package/dist/src/mcp-client.js.map +1 -1
- package/dist/src/mcp-server.d.ts +6 -1
- package/dist/src/mcp-server.d.ts.map +1 -1
- package/dist/src/mcp-server.js +169 -38
- package/dist/src/mcp-server.js.map +1 -1
- package/dist/src/mcp-tools/agent-tools.d.ts +1 -1
- package/dist/src/mcp-tools/agent-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/agent-tools.js +350 -14
- package/dist/src/mcp-tools/agent-tools.js.map +1 -1
- package/dist/src/mcp-tools/analyze-tools.d.ts +38 -0
- package/dist/src/mcp-tools/analyze-tools.d.ts.map +1 -0
- package/dist/src/mcp-tools/analyze-tools.js +317 -0
- package/dist/src/mcp-tools/analyze-tools.js.map +1 -0
- package/dist/src/mcp-tools/config-tools.d.ts +1 -1
- package/dist/src/mcp-tools/config-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/config-tools.js +262 -15
- package/dist/src/mcp-tools/config-tools.js.map +1 -1
- package/dist/src/mcp-tools/hive-mind-tools.d.ts +8 -0
- package/dist/src/mcp-tools/hive-mind-tools.d.ts.map +1 -0
- package/dist/src/mcp-tools/hive-mind-tools.js +447 -0
- package/dist/src/mcp-tools/hive-mind-tools.js.map +1 -0
- package/dist/src/mcp-tools/hooks-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/hooks-tools.js +195 -31
- package/dist/src/mcp-tools/hooks-tools.js.map +1 -1
- package/dist/src/mcp-tools/index.d.ts +6 -0
- package/dist/src/mcp-tools/index.d.ts.map +1 -1
- package/dist/src/mcp-tools/index.js +6 -0
- package/dist/src/mcp-tools/index.js.map +1 -1
- package/dist/src/mcp-tools/progress-tools.d.ts +14 -0
- package/dist/src/mcp-tools/progress-tools.d.ts.map +1 -0
- package/dist/src/mcp-tools/progress-tools.js +343 -0
- package/dist/src/mcp-tools/progress-tools.js.map +1 -0
- package/dist/src/mcp-tools/session-tools.d.ts +1 -1
- package/dist/src/mcp-tools/session-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/session-tools.js +237 -22
- package/dist/src/mcp-tools/session-tools.js.map +1 -1
- package/dist/src/mcp-tools/task-tools.d.ts +1 -1
- package/dist/src/mcp-tools/task-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/task-tools.js +219 -17
- package/dist/src/mcp-tools/task-tools.js.map +1 -1
- package/dist/src/mcp-tools/transfer-tools.d.ts +14 -0
- package/dist/src/mcp-tools/transfer-tools.d.ts.map +1 -0
- package/dist/src/mcp-tools/transfer-tools.js +396 -0
- package/dist/src/mcp-tools/transfer-tools.js.map +1 -0
- package/dist/src/mcp-tools/workflow-tools.d.ts +8 -0
- package/dist/src/mcp-tools/workflow-tools.d.ts.map +1 -0
- package/dist/src/mcp-tools/workflow-tools.js +481 -0
- package/dist/src/mcp-tools/workflow-tools.js.map +1 -0
- package/dist/src/output.d.ts +16 -0
- package/dist/src/output.d.ts.map +1 -1
- package/dist/src/output.js +42 -0
- package/dist/src/output.js.map +1 -1
- package/dist/src/plugins/store/discovery.d.ts +73 -0
- package/dist/src/plugins/store/discovery.d.ts.map +1 -0
- package/dist/src/plugins/store/discovery.js +568 -0
- package/dist/src/plugins/store/discovery.js.map +1 -0
- package/dist/src/plugins/store/index.d.ts +76 -0
- package/dist/src/plugins/store/index.d.ts.map +1 -0
- package/dist/src/plugins/store/index.js +141 -0
- package/dist/src/plugins/store/index.js.map +1 -0
- package/dist/src/plugins/store/search.d.ts +46 -0
- package/dist/src/plugins/store/search.d.ts.map +1 -0
- package/dist/src/plugins/store/search.js +230 -0
- package/dist/src/plugins/store/search.js.map +1 -0
- package/dist/src/plugins/store/types.d.ts +274 -0
- package/dist/src/plugins/store/types.d.ts.map +1 -0
- package/dist/src/plugins/store/types.js +7 -0
- package/dist/src/plugins/store/types.js.map +1 -0
- package/dist/src/plugins/tests/demo-plugin-store.d.ts +7 -0
- package/dist/src/plugins/tests/demo-plugin-store.d.ts.map +1 -0
- package/dist/src/plugins/tests/demo-plugin-store.js +126 -0
- package/dist/src/plugins/tests/demo-plugin-store.js.map +1 -0
- package/dist/src/plugins/tests/standalone-test.d.ts +12 -0
- package/dist/src/plugins/tests/standalone-test.d.ts.map +1 -0
- package/dist/src/plugins/tests/standalone-test.js +188 -0
- package/dist/src/plugins/tests/standalone-test.js.map +1 -0
- package/dist/src/plugins/tests/test-plugin-store.d.ts +7 -0
- package/dist/src/plugins/tests/test-plugin-store.d.ts.map +1 -0
- package/dist/src/plugins/tests/test-plugin-store.js +206 -0
- package/dist/src/plugins/tests/test-plugin-store.js.map +1 -0
- package/dist/src/ruvector/ast-analyzer.d.ts +67 -0
- package/dist/src/ruvector/ast-analyzer.d.ts.map +1 -0
- package/dist/src/ruvector/ast-analyzer.js +277 -0
- package/dist/src/ruvector/ast-analyzer.js.map +1 -0
- package/dist/src/ruvector/coverage-router.d.ts +160 -0
- package/dist/src/ruvector/coverage-router.d.ts.map +1 -0
- package/dist/src/ruvector/coverage-router.js +529 -0
- package/dist/src/ruvector/coverage-router.js.map +1 -0
- package/dist/src/ruvector/coverage-tools.d.ts +33 -0
- package/dist/src/ruvector/coverage-tools.d.ts.map +1 -0
- package/dist/src/ruvector/coverage-tools.js +157 -0
- package/dist/src/ruvector/coverage-tools.js.map +1 -0
- package/dist/src/ruvector/diff-classifier.d.ts +175 -0
- package/dist/src/ruvector/diff-classifier.d.ts.map +1 -0
- package/dist/src/ruvector/diff-classifier.js +698 -0
- package/dist/src/ruvector/diff-classifier.js.map +1 -0
- package/dist/src/ruvector/graph-analyzer.d.ts +187 -0
- package/dist/src/ruvector/graph-analyzer.d.ts.map +1 -0
- package/dist/src/ruvector/graph-analyzer.js +929 -0
- package/dist/src/ruvector/graph-analyzer.js.map +1 -0
- package/dist/src/ruvector/index.d.ts +27 -0
- package/dist/src/ruvector/index.d.ts.map +1 -0
- package/dist/src/ruvector/index.js +53 -0
- package/dist/src/ruvector/index.js.map +1 -0
- package/dist/src/ruvector/q-learning-router.d.ts +211 -0
- package/dist/src/ruvector/q-learning-router.d.ts.map +1 -0
- package/dist/src/ruvector/q-learning-router.js +681 -0
- package/dist/src/ruvector/q-learning-router.js.map +1 -0
- package/dist/src/ruvector/vector-db.d.ts +69 -0
- package/dist/src/ruvector/vector-db.d.ts.map +1 -0
- package/dist/src/ruvector/vector-db.js +243 -0
- package/dist/src/ruvector/vector-db.js.map +1 -0
- package/dist/src/services/claim-service.d.ts +204 -0
- package/dist/src/services/claim-service.d.ts.map +1 -0
- package/dist/src/services/claim-service.js +818 -0
- package/dist/src/services/claim-service.js.map +1 -0
- package/dist/src/services/container-worker-pool.d.ts +197 -0
- package/dist/src/services/container-worker-pool.d.ts.map +1 -0
- package/dist/src/services/container-worker-pool.js +581 -0
- package/dist/src/services/container-worker-pool.js.map +1 -0
- package/dist/src/services/headless-worker-executor.d.ts +304 -0
- package/dist/src/services/headless-worker-executor.d.ts.map +1 -0
- package/dist/src/services/headless-worker-executor.js +997 -0
- package/dist/src/services/headless-worker-executor.js.map +1 -0
- package/dist/src/services/index.d.ts +13 -0
- package/dist/src/services/index.d.ts.map +1 -0
- package/dist/src/services/index.js +11 -0
- package/dist/src/services/index.js.map +1 -0
- package/dist/src/services/worker-daemon.d.ts +203 -0
- package/dist/src/services/worker-daemon.d.ts.map +1 -0
- package/dist/src/services/worker-daemon.js +745 -0
- package/dist/src/services/worker-daemon.js.map +1 -0
- package/dist/src/services/worker-queue.d.ts +194 -0
- package/dist/src/services/worker-queue.d.ts.map +1 -0
- package/dist/src/services/worker-queue.js +511 -0
- package/dist/src/services/worker-queue.js.map +1 -0
- package/dist/src/suggest.d.ts +53 -0
- package/dist/src/suggest.d.ts.map +1 -0
- package/dist/src/suggest.js +200 -0
- package/dist/src/suggest.js.map +1 -0
- package/dist/src/transfer/anonymization/index.d.ts +25 -0
- package/dist/src/transfer/anonymization/index.d.ts.map +1 -0
- package/dist/src/transfer/anonymization/index.js +175 -0
- package/dist/src/transfer/anonymization/index.js.map +1 -0
- package/dist/src/transfer/deploy-seraphine.d.ts +13 -0
- package/dist/src/transfer/deploy-seraphine.d.ts.map +1 -0
- package/dist/src/transfer/deploy-seraphine.js +205 -0
- package/dist/src/transfer/deploy-seraphine.js.map +1 -0
- package/dist/src/transfer/export.d.ts +25 -0
- package/dist/src/transfer/export.d.ts.map +1 -0
- package/dist/src/transfer/export.js +113 -0
- package/dist/src/transfer/export.js.map +1 -0
- package/dist/src/transfer/index.d.ts +12 -0
- package/dist/src/transfer/index.d.ts.map +1 -0
- package/dist/src/transfer/index.js +31 -0
- package/dist/src/transfer/index.js.map +1 -0
- package/dist/src/transfer/ipfs/client.d.ts +31 -0
- package/dist/src/transfer/ipfs/client.d.ts.map +1 -0
- package/dist/src/transfer/ipfs/client.js +74 -0
- package/dist/src/transfer/ipfs/client.js.map +1 -0
- package/dist/src/transfer/ipfs/upload.d.ts +95 -0
- package/dist/src/transfer/ipfs/upload.d.ts.map +1 -0
- package/dist/src/transfer/ipfs/upload.js +410 -0
- package/dist/src/transfer/ipfs/upload.js.map +1 -0
- package/dist/src/transfer/models/seraphine.d.ts +72 -0
- package/dist/src/transfer/models/seraphine.d.ts.map +1 -0
- package/dist/src/transfer/models/seraphine.js +373 -0
- package/dist/src/transfer/models/seraphine.js.map +1 -0
- package/dist/src/transfer/serialization/cfp.d.ts +49 -0
- package/dist/src/transfer/serialization/cfp.d.ts.map +1 -0
- package/dist/src/transfer/serialization/cfp.js +180 -0
- package/dist/src/transfer/serialization/cfp.js.map +1 -0
- package/dist/src/transfer/store/discovery.d.ts +84 -0
- package/dist/src/transfer/store/discovery.d.ts.map +1 -0
- package/dist/src/transfer/store/discovery.js +275 -0
- package/dist/src/transfer/store/discovery.js.map +1 -0
- package/dist/src/transfer/store/download.d.ts +70 -0
- package/dist/src/transfer/store/download.d.ts.map +1 -0
- package/dist/src/transfer/store/download.js +295 -0
- package/dist/src/transfer/store/download.js.map +1 -0
- package/dist/src/transfer/store/index.d.ts +84 -0
- package/dist/src/transfer/store/index.d.ts.map +1 -0
- package/dist/src/transfer/store/index.js +153 -0
- package/dist/src/transfer/store/index.js.map +1 -0
- package/dist/src/transfer/store/publish.d.ts +76 -0
- package/dist/src/transfer/store/publish.d.ts.map +1 -0
- package/dist/src/transfer/store/publish.js +262 -0
- package/dist/src/transfer/store/publish.js.map +1 -0
- package/dist/src/transfer/store/registry.d.ts +58 -0
- package/dist/src/transfer/store/registry.d.ts.map +1 -0
- package/dist/src/transfer/store/registry.js +285 -0
- package/dist/src/transfer/store/registry.js.map +1 -0
- package/dist/src/transfer/store/search.d.ts +54 -0
- package/dist/src/transfer/store/search.d.ts.map +1 -0
- package/dist/src/transfer/store/search.js +232 -0
- package/dist/src/transfer/store/search.js.map +1 -0
- package/dist/src/transfer/store/tests/standalone-test.d.ts +12 -0
- package/dist/src/transfer/store/tests/standalone-test.d.ts.map +1 -0
- package/dist/src/transfer/store/tests/standalone-test.js +190 -0
- package/dist/src/transfer/store/tests/standalone-test.js.map +1 -0
- package/dist/src/transfer/store/types.d.ts +193 -0
- package/dist/src/transfer/store/types.d.ts.map +1 -0
- package/dist/src/transfer/store/types.js +6 -0
- package/dist/src/transfer/store/types.js.map +1 -0
- package/dist/src/transfer/test-seraphine.d.ts +6 -0
- package/dist/src/transfer/test-seraphine.d.ts.map +1 -0
- package/dist/src/transfer/test-seraphine.js +105 -0
- package/dist/src/transfer/test-seraphine.js.map +1 -0
- package/dist/src/transfer/tests/test-store.d.ts +7 -0
- package/dist/src/transfer/tests/test-store.d.ts.map +1 -0
- package/dist/src/transfer/tests/test-store.js +214 -0
- package/dist/src/transfer/tests/test-store.js.map +1 -0
- package/dist/src/transfer/types.d.ts +245 -0
- package/dist/src/transfer/types.d.ts.map +1 -0
- package/dist/src/transfer/types.js +6 -0
- package/dist/src/transfer/types.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +37 -9
- package/.agentic-flow/intelligence.json +0 -17
- package/.claude-flow/metrics/task-metrics.json +0 -10
- package/__tests__/README.md +0 -140
- package/__tests__/TEST_SUMMARY.md +0 -144
- package/__tests__/cli.test.ts +0 -558
- package/__tests__/commands.test.ts +0 -726
- package/__tests__/config-adapter.test.ts +0 -362
- package/__tests__/config-loading.test.ts +0 -106
- package/__tests__/coverage/.tmp/coverage-0.json +0 -1
- package/__tests__/coverage/.tmp/coverage-1.json +0 -1
- package/__tests__/coverage/.tmp/coverage-2.json +0 -1
- package/__tests__/coverage/.tmp/coverage-3.json +0 -1
- package/__tests__/coverage/.tmp/coverage-4.json +0 -1
- package/__tests__/coverage/.tmp/coverage-5.json +0 -1
- package/__tests__/mcp-client.test.ts +0 -480
- package/__tests__/p1-commands.test.ts +0 -1064
- package/agents/architect.yaml +0 -11
- package/agents/coder.yaml +0 -11
- package/agents/reviewer.yaml +0 -10
- package/agents/security-architect.yaml +0 -10
- package/agents/tester.yaml +0 -10
- package/docs/CONFIG_LOADING.md +0 -236
- package/docs/IMPLEMENTATION_COMPLETE.md +0 -421
- package/docs/MCP_CLIENT_GUIDE.md +0 -620
- package/docs/REFACTORING_SUMMARY.md +0 -247
- package/src/commands/agent.ts +0 -941
- package/src/commands/config.ts +0 -452
- package/src/commands/hive-mind.ts +0 -762
- package/src/commands/hooks.ts +0 -2603
- package/src/commands/index.ts +0 -115
- package/src/commands/init.ts +0 -597
- package/src/commands/mcp.ts +0 -753
- package/src/commands/memory.ts +0 -1161
- package/src/commands/migrate.ts +0 -447
- package/src/commands/process.ts +0 -695
- package/src/commands/session.ts +0 -891
- package/src/commands/start.ts +0 -457
- package/src/commands/status.ts +0 -736
- package/src/commands/swarm.ts +0 -648
- package/src/commands/task.ts +0 -792
- package/src/commands/workflow.ts +0 -742
- package/src/config-adapter.ts +0 -210
- package/src/index.ts +0 -400
- package/src/infrastructure/in-memory-repositories.ts +0 -310
- package/src/init/claudemd-generator.ts +0 -631
- package/src/init/executor.ts +0 -762
- package/src/init/helpers-generator.ts +0 -628
- package/src/init/index.ts +0 -60
- package/src/init/mcp-generator.ts +0 -83
- package/src/init/settings-generator.ts +0 -274
- package/src/init/statusline-generator.ts +0 -211
- package/src/init/types.ts +0 -447
- package/src/mcp-client.ts +0 -229
- package/src/mcp-server.ts +0 -577
- package/src/mcp-tools/agent-tools.ts +0 -92
- package/src/mcp-tools/config-tools.ts +0 -88
- package/src/mcp-tools/hooks-tools.ts +0 -1849
- package/src/mcp-tools/index.ts +0 -14
- package/src/mcp-tools/memory-tools.ts +0 -270
- package/src/mcp-tools/session-tools.ts +0 -102
- package/src/mcp-tools/swarm-tools.ts +0 -105
- package/src/mcp-tools/task-tools.ts +0 -102
- package/src/mcp-tools/types.ts +0 -33
- package/src/output.ts +0 -593
- package/src/parser.ts +0 -417
- package/src/prompt.ts +0 -619
- package/src/types.ts +0 -287
- package/tsconfig.json +0 -16
- package/tsconfig.tsbuildinfo +0 -1
- package/vitest.config.ts +0 -13
- /package/{tmp.json → .claude/agents/tmp.json} +0 -0
- /package/{.claude-flow → .claude/skills/skill-builder/.claude-flow}/metrics/agent-metrics.json +0 -0
|
@@ -0,0 +1,1144 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Claude Flow V3 - Persistent Learning Service
|
|
4
|
+
*
|
|
5
|
+
* Connects ReasoningBank to AgentDB with HNSW indexing and ONNX embeddings.
|
|
6
|
+
*
|
|
7
|
+
* Features:
|
|
8
|
+
* - Persistent pattern storage via AgentDB
|
|
9
|
+
* - HNSW indexing for 150x-12,500x faster search
|
|
10
|
+
* - ONNX embeddings via agentic-flow@alpha
|
|
11
|
+
* - Session-level pattern loading and consolidation
|
|
12
|
+
* - Short-term → Long-term pattern promotion
|
|
13
|
+
*
|
|
14
|
+
* Performance Targets:
|
|
15
|
+
* - Pattern search: <1ms (HNSW)
|
|
16
|
+
* - Embedding generation: <10ms (ONNX)
|
|
17
|
+
* - Pattern storage: <5ms
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
import { createRequire } from 'module';
|
|
21
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';
|
|
22
|
+
import { join, dirname } from 'path';
|
|
23
|
+
import { fileURLToPath } from 'url';
|
|
24
|
+
import { execSync, spawn } from 'child_process';
|
|
25
|
+
import Database from 'better-sqlite3';
|
|
26
|
+
|
|
27
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
28
|
+
const __dirname = dirname(__filename);
|
|
29
|
+
const PROJECT_ROOT = join(__dirname, '../..');
|
|
30
|
+
const DATA_DIR = join(PROJECT_ROOT, '.claude-flow/learning');
|
|
31
|
+
const DB_PATH = join(DATA_DIR, 'patterns.db');
|
|
32
|
+
const METRICS_PATH = join(DATA_DIR, 'learning-metrics.json');
|
|
33
|
+
|
|
34
|
+
// Ensure data directory exists
|
|
35
|
+
if (!existsSync(DATA_DIR)) {
|
|
36
|
+
mkdirSync(DATA_DIR, { recursive: true });
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// =============================================================================
|
|
40
|
+
// Configuration
|
|
41
|
+
// =============================================================================
|
|
42
|
+
|
|
43
|
+
const CONFIG = {
|
|
44
|
+
// HNSW parameters
|
|
45
|
+
hnsw: {
|
|
46
|
+
M: 16, // Max connections per layer
|
|
47
|
+
efConstruction: 200, // Construction time accuracy
|
|
48
|
+
efSearch: 100, // Search time accuracy
|
|
49
|
+
metric: 'cosine', // Distance metric
|
|
50
|
+
},
|
|
51
|
+
|
|
52
|
+
// Pattern management
|
|
53
|
+
patterns: {
|
|
54
|
+
shortTermMaxAge: 24 * 60 * 60 * 1000, // 24 hours
|
|
55
|
+
promotionThreshold: 3, // Uses before promotion to long-term
|
|
56
|
+
qualityThreshold: 0.6, // Min quality for storage
|
|
57
|
+
maxShortTerm: 500, // Max short-term patterns
|
|
58
|
+
maxLongTerm: 2000, // Max long-term patterns
|
|
59
|
+
dedupThreshold: 0.95, // Similarity for dedup
|
|
60
|
+
},
|
|
61
|
+
|
|
62
|
+
// Embedding
|
|
63
|
+
embedding: {
|
|
64
|
+
dimension: 384, // MiniLM-L6 dimension
|
|
65
|
+
model: 'all-MiniLM-L6-v2', // ONNX model
|
|
66
|
+
batchSize: 32, // Batch size for embedding
|
|
67
|
+
},
|
|
68
|
+
|
|
69
|
+
// Consolidation
|
|
70
|
+
consolidation: {
|
|
71
|
+
interval: 30 * 60 * 1000, // 30 minutes
|
|
72
|
+
pruneAge: 30 * 24 * 60 * 60 * 1000, // 30 days
|
|
73
|
+
minUsageForKeep: 2, // Min uses to keep old pattern
|
|
74
|
+
},
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
// =============================================================================
|
|
78
|
+
// Database Schema
|
|
79
|
+
// =============================================================================
|
|
80
|
+
|
|
81
|
+
function initializeDatabase(db) {
|
|
82
|
+
db.exec(`
|
|
83
|
+
-- Short-term patterns (session-level)
|
|
84
|
+
CREATE TABLE IF NOT EXISTS short_term_patterns (
|
|
85
|
+
id TEXT PRIMARY KEY,
|
|
86
|
+
strategy TEXT NOT NULL,
|
|
87
|
+
domain TEXT DEFAULT 'general',
|
|
88
|
+
embedding BLOB NOT NULL,
|
|
89
|
+
quality REAL DEFAULT 0.5,
|
|
90
|
+
usage_count INTEGER DEFAULT 0,
|
|
91
|
+
success_count INTEGER DEFAULT 0,
|
|
92
|
+
created_at INTEGER NOT NULL,
|
|
93
|
+
updated_at INTEGER NOT NULL,
|
|
94
|
+
session_id TEXT,
|
|
95
|
+
trajectory_id TEXT,
|
|
96
|
+
metadata TEXT
|
|
97
|
+
);
|
|
98
|
+
|
|
99
|
+
-- Long-term patterns (promoted from short-term)
|
|
100
|
+
CREATE TABLE IF NOT EXISTS long_term_patterns (
|
|
101
|
+
id TEXT PRIMARY KEY,
|
|
102
|
+
strategy TEXT NOT NULL,
|
|
103
|
+
domain TEXT DEFAULT 'general',
|
|
104
|
+
embedding BLOB NOT NULL,
|
|
105
|
+
quality REAL DEFAULT 0.5,
|
|
106
|
+
usage_count INTEGER DEFAULT 0,
|
|
107
|
+
success_count INTEGER DEFAULT 0,
|
|
108
|
+
created_at INTEGER NOT NULL,
|
|
109
|
+
updated_at INTEGER NOT NULL,
|
|
110
|
+
promoted_at INTEGER,
|
|
111
|
+
source_pattern_id TEXT,
|
|
112
|
+
quality_history TEXT,
|
|
113
|
+
metadata TEXT
|
|
114
|
+
);
|
|
115
|
+
|
|
116
|
+
-- HNSW index metadata
|
|
117
|
+
CREATE TABLE IF NOT EXISTS hnsw_index (
|
|
118
|
+
id INTEGER PRIMARY KEY,
|
|
119
|
+
pattern_type TEXT NOT NULL, -- 'short_term' or 'long_term'
|
|
120
|
+
pattern_id TEXT NOT NULL,
|
|
121
|
+
vector_id INTEGER NOT NULL,
|
|
122
|
+
created_at INTEGER NOT NULL,
|
|
123
|
+
UNIQUE(pattern_type, pattern_id)
|
|
124
|
+
);
|
|
125
|
+
|
|
126
|
+
-- Learning trajectories
|
|
127
|
+
CREATE TABLE IF NOT EXISTS trajectories (
|
|
128
|
+
id TEXT PRIMARY KEY,
|
|
129
|
+
session_id TEXT NOT NULL,
|
|
130
|
+
domain TEXT DEFAULT 'general',
|
|
131
|
+
steps TEXT NOT NULL,
|
|
132
|
+
quality_score REAL,
|
|
133
|
+
verdict TEXT,
|
|
134
|
+
started_at INTEGER NOT NULL,
|
|
135
|
+
ended_at INTEGER,
|
|
136
|
+
distilled_pattern_id TEXT
|
|
137
|
+
);
|
|
138
|
+
|
|
139
|
+
-- Learning metrics
|
|
140
|
+
CREATE TABLE IF NOT EXISTS learning_metrics (
|
|
141
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
142
|
+
timestamp INTEGER NOT NULL,
|
|
143
|
+
metric_type TEXT NOT NULL,
|
|
144
|
+
metric_name TEXT NOT NULL,
|
|
145
|
+
metric_value REAL NOT NULL,
|
|
146
|
+
metadata TEXT
|
|
147
|
+
);
|
|
148
|
+
|
|
149
|
+
-- Session state
|
|
150
|
+
CREATE TABLE IF NOT EXISTS session_state (
|
|
151
|
+
key TEXT PRIMARY KEY,
|
|
152
|
+
value TEXT NOT NULL,
|
|
153
|
+
updated_at INTEGER NOT NULL
|
|
154
|
+
);
|
|
155
|
+
|
|
156
|
+
-- Create indexes
|
|
157
|
+
CREATE INDEX IF NOT EXISTS idx_short_term_domain ON short_term_patterns(domain);
|
|
158
|
+
CREATE INDEX IF NOT EXISTS idx_short_term_quality ON short_term_patterns(quality DESC);
|
|
159
|
+
CREATE INDEX IF NOT EXISTS idx_short_term_usage ON short_term_patterns(usage_count DESC);
|
|
160
|
+
CREATE INDEX IF NOT EXISTS idx_long_term_domain ON long_term_patterns(domain);
|
|
161
|
+
CREATE INDEX IF NOT EXISTS idx_long_term_quality ON long_term_patterns(quality DESC);
|
|
162
|
+
CREATE INDEX IF NOT EXISTS idx_trajectories_session ON trajectories(session_id);
|
|
163
|
+
CREATE INDEX IF NOT EXISTS idx_metrics_type ON learning_metrics(metric_type, timestamp);
|
|
164
|
+
`);
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
// =============================================================================
|
|
168
|
+
// HNSW Index (In-Memory with SQLite persistence)
|
|
169
|
+
// =============================================================================
|
|
170
|
+
|
|
171
|
+
class HNSWIndex {
|
|
172
|
+
constructor(config) {
|
|
173
|
+
this.config = config;
|
|
174
|
+
this.vectors = new Map(); // id -> Float32Array
|
|
175
|
+
this.idToVector = new Map(); // patternId -> vectorId
|
|
176
|
+
this.vectorToId = new Map(); // vectorId -> patternId
|
|
177
|
+
this.nextVectorId = 0;
|
|
178
|
+
this.dimension = config.embedding.dimension;
|
|
179
|
+
|
|
180
|
+
// Graph structure for HNSW
|
|
181
|
+
this.layers = []; // Multi-layer graph
|
|
182
|
+
this.entryPoint = null;
|
|
183
|
+
this.maxLevel = 0;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
// Add vector to index
|
|
187
|
+
add(patternId, embedding) {
|
|
188
|
+
const vectorId = this.nextVectorId++;
|
|
189
|
+
const vector = embedding instanceof Float32Array
|
|
190
|
+
? embedding
|
|
191
|
+
: new Float32Array(embedding);
|
|
192
|
+
|
|
193
|
+
this.vectors.set(vectorId, vector);
|
|
194
|
+
this.idToVector.set(patternId, vectorId);
|
|
195
|
+
this.vectorToId.set(vectorId, patternId);
|
|
196
|
+
|
|
197
|
+
// Simple HNSW insertion (simplified for performance)
|
|
198
|
+
this._insertIntoGraph(vectorId, vector);
|
|
199
|
+
|
|
200
|
+
return vectorId;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
// Search for k nearest neighbors
|
|
204
|
+
search(queryEmbedding, k = 5) {
|
|
205
|
+
const query = queryEmbedding instanceof Float32Array
|
|
206
|
+
? queryEmbedding
|
|
207
|
+
: new Float32Array(queryEmbedding);
|
|
208
|
+
|
|
209
|
+
if (this.vectors.size === 0) return { results: [], searchTimeMs: 0 };
|
|
210
|
+
|
|
211
|
+
const startTime = performance.now();
|
|
212
|
+
|
|
213
|
+
// HNSW search with early termination
|
|
214
|
+
const candidates = this._searchGraph(query, k * 2);
|
|
215
|
+
|
|
216
|
+
// Sort by similarity and take top k
|
|
217
|
+
const results = candidates
|
|
218
|
+
.map(({ vectorId, distance }) => ({
|
|
219
|
+
patternId: this.vectorToId.get(vectorId),
|
|
220
|
+
similarity: 1 - distance,
|
|
221
|
+
vectorId,
|
|
222
|
+
}))
|
|
223
|
+
.sort((a, b) => b.similarity - a.similarity)
|
|
224
|
+
.slice(0, k);
|
|
225
|
+
|
|
226
|
+
const searchTime = performance.now() - startTime;
|
|
227
|
+
|
|
228
|
+
return { results, searchTimeMs: searchTime };
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
// Remove vector from index
|
|
232
|
+
remove(patternId) {
|
|
233
|
+
const vectorId = this.idToVector.get(patternId);
|
|
234
|
+
if (vectorId === undefined) return false;
|
|
235
|
+
|
|
236
|
+
this.vectors.delete(vectorId);
|
|
237
|
+
this.idToVector.delete(patternId);
|
|
238
|
+
this.vectorToId.delete(vectorId);
|
|
239
|
+
this._removeFromGraph(vectorId);
|
|
240
|
+
|
|
241
|
+
return true;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
// Get index size
|
|
245
|
+
size() {
|
|
246
|
+
return this.vectors.size;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
// Cosine similarity
|
|
250
|
+
_cosineSimilarity(a, b) {
|
|
251
|
+
let dot = 0, normA = 0, normB = 0;
|
|
252
|
+
for (let i = 0; i < a.length; i++) {
|
|
253
|
+
dot += a[i] * b[i];
|
|
254
|
+
normA += a[i] * a[i];
|
|
255
|
+
normB += b[i] * b[i];
|
|
256
|
+
}
|
|
257
|
+
const denom = Math.sqrt(normA) * Math.sqrt(normB);
|
|
258
|
+
return denom > 0 ? dot / denom : 0;
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
// Cosine distance
|
|
262
|
+
_cosineDistance(a, b) {
|
|
263
|
+
return 1 - this._cosineSimilarity(a, b);
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
// Insert into graph (simplified HNSW)
|
|
267
|
+
_insertIntoGraph(vectorId, vector) {
|
|
268
|
+
if (this.entryPoint === null) {
|
|
269
|
+
this.entryPoint = vectorId;
|
|
270
|
+
this.layers.push(new Map([[vectorId, new Set()]]));
|
|
271
|
+
return;
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
// For simplicity, use single-layer graph with neighbor limit
|
|
275
|
+
if (this.layers.length === 0) {
|
|
276
|
+
this.layers.push(new Map());
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
const layer = this.layers[0];
|
|
280
|
+
layer.set(vectorId, new Set());
|
|
281
|
+
|
|
282
|
+
// Find M nearest neighbors and connect
|
|
283
|
+
const neighbors = this._findNearest(vector, this.config.hnsw.M);
|
|
284
|
+
for (const { vectorId: neighborId } of neighbors) {
|
|
285
|
+
layer.get(vectorId).add(neighborId);
|
|
286
|
+
layer.get(neighborId)?.add(vectorId);
|
|
287
|
+
|
|
288
|
+
// Prune if too many connections
|
|
289
|
+
if (layer.get(neighborId)?.size > this.config.hnsw.M * 2) {
|
|
290
|
+
this._pruneConnections(neighborId);
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
// Search graph for nearest neighbors
|
|
296
|
+
_searchGraph(query, k) {
|
|
297
|
+
if (this.vectors.size <= k) {
|
|
298
|
+
// Brute force for small index
|
|
299
|
+
return Array.from(this.vectors.entries())
|
|
300
|
+
.map(([vectorId, vector]) => ({
|
|
301
|
+
vectorId,
|
|
302
|
+
distance: this._cosineDistance(query, vector),
|
|
303
|
+
}))
|
|
304
|
+
.sort((a, b) => a.distance - b.distance);
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
// Greedy search from entry point
|
|
308
|
+
const visited = new Set();
|
|
309
|
+
const candidates = new Map();
|
|
310
|
+
const results = [];
|
|
311
|
+
|
|
312
|
+
let current = this.entryPoint;
|
|
313
|
+
let currentDist = this._cosineDistance(query, this.vectors.get(current));
|
|
314
|
+
|
|
315
|
+
candidates.set(current, currentDist);
|
|
316
|
+
results.push({ vectorId: current, distance: currentDist });
|
|
317
|
+
|
|
318
|
+
const layer = this.layers[0];
|
|
319
|
+
let improved = true;
|
|
320
|
+
let iterations = 0;
|
|
321
|
+
const maxIterations = this.config.hnsw.efSearch;
|
|
322
|
+
|
|
323
|
+
while (improved && iterations < maxIterations) {
|
|
324
|
+
improved = false;
|
|
325
|
+
iterations++;
|
|
326
|
+
|
|
327
|
+
// Get best unvisited candidate
|
|
328
|
+
let bestCandidate = null;
|
|
329
|
+
let bestDist = Infinity;
|
|
330
|
+
|
|
331
|
+
for (const [id, dist] of candidates) {
|
|
332
|
+
if (!visited.has(id) && dist < bestDist) {
|
|
333
|
+
bestDist = dist;
|
|
334
|
+
bestCandidate = id;
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
if (bestCandidate === null) break;
|
|
339
|
+
|
|
340
|
+
visited.add(bestCandidate);
|
|
341
|
+
const neighbors = layer.get(bestCandidate) || new Set();
|
|
342
|
+
|
|
343
|
+
for (const neighborId of neighbors) {
|
|
344
|
+
if (visited.has(neighborId)) continue;
|
|
345
|
+
|
|
346
|
+
const neighborVector = this.vectors.get(neighborId);
|
|
347
|
+
if (!neighborVector) continue;
|
|
348
|
+
|
|
349
|
+
const dist = this._cosineDistance(query, neighborVector);
|
|
350
|
+
|
|
351
|
+
if (!candidates.has(neighborId) || candidates.get(neighborId) > dist) {
|
|
352
|
+
candidates.set(neighborId, dist);
|
|
353
|
+
results.push({ vectorId: neighborId, distance: dist });
|
|
354
|
+
improved = true;
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
return results.sort((a, b) => a.distance - b.distance).slice(0, k);
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
// Find k nearest by brute force
|
|
363
|
+
_findNearest(query, k) {
|
|
364
|
+
return Array.from(this.vectors.entries())
|
|
365
|
+
.map(([vectorId, vector]) => ({
|
|
366
|
+
vectorId,
|
|
367
|
+
distance: this._cosineDistance(query, vector),
|
|
368
|
+
}))
|
|
369
|
+
.sort((a, b) => a.distance - b.distance)
|
|
370
|
+
.slice(0, k);
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
// Prune excess connections
|
|
374
|
+
_pruneConnections(vectorId) {
|
|
375
|
+
const layer = this.layers[0];
|
|
376
|
+
const connections = layer.get(vectorId);
|
|
377
|
+
if (!connections || connections.size <= this.config.hnsw.M) return;
|
|
378
|
+
|
|
379
|
+
const vector = this.vectors.get(vectorId);
|
|
380
|
+
const scored = Array.from(connections)
|
|
381
|
+
.map(neighborId => ({
|
|
382
|
+
neighborId,
|
|
383
|
+
distance: this._cosineDistance(vector, this.vectors.get(neighborId)),
|
|
384
|
+
}))
|
|
385
|
+
.sort((a, b) => a.distance - b.distance);
|
|
386
|
+
|
|
387
|
+
// Keep only M nearest
|
|
388
|
+
const toRemove = scored.slice(this.config.hnsw.M);
|
|
389
|
+
for (const { neighborId } of toRemove) {
|
|
390
|
+
connections.delete(neighborId);
|
|
391
|
+
layer.get(neighborId)?.delete(vectorId);
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
// Remove from graph
|
|
396
|
+
_removeFromGraph(vectorId) {
|
|
397
|
+
const layer = this.layers[0];
|
|
398
|
+
const connections = layer.get(vectorId);
|
|
399
|
+
|
|
400
|
+
if (connections) {
|
|
401
|
+
for (const neighborId of connections) {
|
|
402
|
+
layer.get(neighborId)?.delete(vectorId);
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
layer.delete(vectorId);
|
|
407
|
+
|
|
408
|
+
if (this.entryPoint === vectorId) {
|
|
409
|
+
this.entryPoint = layer.size > 0 ? layer.keys().next().value : null;
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
// Serialize index for persistence
|
|
414
|
+
serialize() {
|
|
415
|
+
return {
|
|
416
|
+
vectors: Array.from(this.vectors.entries()).map(([id, vec]) => [id, Array.from(vec)]),
|
|
417
|
+
idToVector: Array.from(this.idToVector.entries()),
|
|
418
|
+
vectorToId: Array.from(this.vectorToId.entries()),
|
|
419
|
+
nextVectorId: this.nextVectorId,
|
|
420
|
+
entryPoint: this.entryPoint,
|
|
421
|
+
layers: this.layers.map(layer =>
|
|
422
|
+
Array.from(layer.entries()).map(([k, v]) => [k, Array.from(v)])
|
|
423
|
+
),
|
|
424
|
+
};
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
// Deserialize index
|
|
428
|
+
static deserialize(data, config) {
|
|
429
|
+
const index = new HNSWIndex(config);
|
|
430
|
+
|
|
431
|
+
if (!data) return index;
|
|
432
|
+
|
|
433
|
+
index.vectors = new Map(data.vectors?.map(([id, vec]) => [id, new Float32Array(vec)]) || []);
|
|
434
|
+
index.idToVector = new Map(data.idToVector || []);
|
|
435
|
+
index.vectorToId = new Map(data.vectorToId || []);
|
|
436
|
+
index.nextVectorId = data.nextVectorId || 0;
|
|
437
|
+
index.entryPoint = data.entryPoint;
|
|
438
|
+
index.layers = (data.layers || []).map(layer =>
|
|
439
|
+
new Map(layer.map(([k, v]) => [k, new Set(v)]))
|
|
440
|
+
);
|
|
441
|
+
|
|
442
|
+
return index;
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
// =============================================================================
|
|
447
|
+
// Embedding Service (ONNX via agentic-flow@alpha OptimizedEmbedder)
|
|
448
|
+
// =============================================================================
|
|
449
|
+
|
|
450
|
+
class EmbeddingService {
|
|
451
|
+
constructor(config) {
|
|
452
|
+
this.config = config;
|
|
453
|
+
this.initialized = false;
|
|
454
|
+
this.embedder = null;
|
|
455
|
+
this.embeddingCache = new Map();
|
|
456
|
+
this.cacheMaxSize = 1000;
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
async initialize() {
|
|
460
|
+
if (this.initialized) return;
|
|
461
|
+
|
|
462
|
+
try {
|
|
463
|
+
// Dynamically import agentic-flow OptimizedEmbedder
|
|
464
|
+
const agenticFlowPath = join(PROJECT_ROOT, 'node_modules/agentic-flow/dist/embeddings/optimized-embedder.js');
|
|
465
|
+
|
|
466
|
+
if (existsSync(agenticFlowPath)) {
|
|
467
|
+
const { getOptimizedEmbedder } = await import(agenticFlowPath);
|
|
468
|
+
this.embedder = getOptimizedEmbedder({
|
|
469
|
+
modelId: 'all-MiniLM-L6-v2',
|
|
470
|
+
dimension: this.config.embedding.dimension,
|
|
471
|
+
cacheSize: 256,
|
|
472
|
+
autoDownload: false, // Model should already be downloaded
|
|
473
|
+
});
|
|
474
|
+
|
|
475
|
+
await this.embedder.init();
|
|
476
|
+
this.useAgenticFlow = true;
|
|
477
|
+
console.log('[Embedding] Initialized: agentic-flow OptimizedEmbedder (ONNX)');
|
|
478
|
+
} else {
|
|
479
|
+
this.useAgenticFlow = false;
|
|
480
|
+
console.log('[Embedding] agentic-flow not found, using fallback hash embeddings');
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
this.initialized = true;
|
|
484
|
+
} catch (e) {
|
|
485
|
+
this.useAgenticFlow = false;
|
|
486
|
+
this.initialized = true;
|
|
487
|
+
console.log(`[Embedding] Using fallback hash-based embeddings: ${e.message}`);
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
async embed(text) {
|
|
492
|
+
if (!this.initialized) await this.initialize();
|
|
493
|
+
|
|
494
|
+
// Check cache
|
|
495
|
+
const cacheKey = text.slice(0, 200);
|
|
496
|
+
if (this.embeddingCache.has(cacheKey)) {
|
|
497
|
+
return this.embeddingCache.get(cacheKey);
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
let embedding;
|
|
501
|
+
|
|
502
|
+
if (this.useAgenticFlow && this.embedder) {
|
|
503
|
+
try {
|
|
504
|
+
// Use agentic-flow OptimizedEmbedder
|
|
505
|
+
embedding = await this.embedder.embed(text.slice(0, 500));
|
|
506
|
+
} catch (e) {
|
|
507
|
+
console.log(`[Embedding] ONNX failed, using fallback: ${e.message}`);
|
|
508
|
+
embedding = this._fallbackEmbed(text);
|
|
509
|
+
}
|
|
510
|
+
} else {
|
|
511
|
+
embedding = this._fallbackEmbed(text);
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
// Cache result
|
|
515
|
+
if (this.embeddingCache.size >= this.cacheMaxSize) {
|
|
516
|
+
const firstKey = this.embeddingCache.keys().next().value;
|
|
517
|
+
this.embeddingCache.delete(firstKey);
|
|
518
|
+
}
|
|
519
|
+
this.embeddingCache.set(cacheKey, embedding);
|
|
520
|
+
|
|
521
|
+
return embedding;
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
async embedBatch(texts) {
|
|
525
|
+
if (this.useAgenticFlow && this.embedder) {
|
|
526
|
+
try {
|
|
527
|
+
return await this.embedder.embedBatch(texts.map(t => t.slice(0, 500)));
|
|
528
|
+
} catch (e) {
|
|
529
|
+
// Fallback to sequential
|
|
530
|
+
return Promise.all(texts.map(t => this.embed(t)));
|
|
531
|
+
}
|
|
532
|
+
}
|
|
533
|
+
return Promise.all(texts.map(t => this.embed(t)));
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
// Fallback: deterministic hash-based embedding
|
|
537
|
+
_fallbackEmbed(text) {
|
|
538
|
+
const embedding = new Float32Array(this.config.embedding.dimension);
|
|
539
|
+
const normalized = text.toLowerCase().trim();
|
|
540
|
+
|
|
541
|
+
// Create deterministic embedding from text
|
|
542
|
+
for (let i = 0; i < embedding.length; i++) {
|
|
543
|
+
let hash = 0;
|
|
544
|
+
for (let j = 0; j < normalized.length; j++) {
|
|
545
|
+
hash = ((hash << 5) - hash + normalized.charCodeAt(j) * (i + 1)) | 0;
|
|
546
|
+
}
|
|
547
|
+
embedding[i] = (Math.sin(hash) + 1) / 2;
|
|
548
|
+
}
|
|
549
|
+
|
|
550
|
+
// Normalize
|
|
551
|
+
let norm = 0;
|
|
552
|
+
for (let i = 0; i < embedding.length; i++) {
|
|
553
|
+
norm += embedding[i] * embedding[i];
|
|
554
|
+
}
|
|
555
|
+
norm = Math.sqrt(norm);
|
|
556
|
+
if (norm > 0) {
|
|
557
|
+
for (let i = 0; i < embedding.length; i++) {
|
|
558
|
+
embedding[i] /= norm;
|
|
559
|
+
}
|
|
560
|
+
}
|
|
561
|
+
|
|
562
|
+
return embedding;
|
|
563
|
+
}
|
|
564
|
+
}
|
|
565
|
+
|
|
566
|
+
// =============================================================================
|
|
567
|
+
// Learning Service
|
|
568
|
+
// =============================================================================
|
|
569
|
+
|
|
570
|
+
class LearningService {
|
|
571
|
+
constructor() {
|
|
572
|
+
this.db = null;
|
|
573
|
+
this.shortTermIndex = null;
|
|
574
|
+
this.longTermIndex = null;
|
|
575
|
+
this.embeddingService = null;
|
|
576
|
+
this.sessionId = null;
|
|
577
|
+
this.metrics = {
|
|
578
|
+
patternsStored: 0,
|
|
579
|
+
patternsRetrieved: 0,
|
|
580
|
+
searchTimeTotal: 0,
|
|
581
|
+
searchCount: 0,
|
|
582
|
+
promotions: 0,
|
|
583
|
+
consolidations: 0,
|
|
584
|
+
};
|
|
585
|
+
}
|
|
586
|
+
|
|
587
|
+
async initialize(sessionId = null) {
|
|
588
|
+
this.sessionId = sessionId || `session_${Date.now()}`;
|
|
589
|
+
|
|
590
|
+
// Initialize database
|
|
591
|
+
this.db = new Database(DB_PATH);
|
|
592
|
+
initializeDatabase(this.db);
|
|
593
|
+
|
|
594
|
+
// Initialize embedding service
|
|
595
|
+
this.embeddingService = new EmbeddingService(CONFIG);
|
|
596
|
+
await this.embeddingService.initialize();
|
|
597
|
+
|
|
598
|
+
// Initialize HNSW indexes
|
|
599
|
+
this.shortTermIndex = new HNSWIndex(CONFIG);
|
|
600
|
+
this.longTermIndex = new HNSWIndex(CONFIG);
|
|
601
|
+
|
|
602
|
+
// Load existing patterns into indexes
|
|
603
|
+
await this._loadIndexes();
|
|
604
|
+
|
|
605
|
+
// Record session start
|
|
606
|
+
this._setState('current_session', this.sessionId);
|
|
607
|
+
this._setState('session_start', Date.now().toString());
|
|
608
|
+
|
|
609
|
+
console.log(`[Learning] Initialized session ${this.sessionId}`);
|
|
610
|
+
console.log(`[Learning] Short-term patterns: ${this.shortTermIndex.size()}`);
|
|
611
|
+
console.log(`[Learning] Long-term patterns: ${this.longTermIndex.size()}`);
|
|
612
|
+
|
|
613
|
+
return {
|
|
614
|
+
sessionId: this.sessionId,
|
|
615
|
+
shortTermPatterns: this.shortTermIndex.size(),
|
|
616
|
+
longTermPatterns: this.longTermIndex.size(),
|
|
617
|
+
};
|
|
618
|
+
}
|
|
619
|
+
|
|
620
|
+
// Store a new pattern
|
|
621
|
+
async storePattern(strategy, domain = 'general', metadata = {}) {
|
|
622
|
+
const now = Date.now();
|
|
623
|
+
const id = `pat_${now}_${Math.random().toString(36).slice(2, 9)}`;
|
|
624
|
+
|
|
625
|
+
// Generate embedding
|
|
626
|
+
const embedding = await this.embeddingService.embed(strategy);
|
|
627
|
+
|
|
628
|
+
// Check for duplicates
|
|
629
|
+
const { results } = this.shortTermIndex.search(embedding, 1);
|
|
630
|
+
if (results.length > 0 && results[0].similarity > CONFIG.patterns.dedupThreshold) {
|
|
631
|
+
// Update existing pattern instead
|
|
632
|
+
const existingId = results[0].patternId;
|
|
633
|
+
this._updatePatternUsage(existingId, 'short_term');
|
|
634
|
+
return { id: existingId, action: 'updated', similarity: results[0].similarity };
|
|
635
|
+
}
|
|
636
|
+
|
|
637
|
+
// Store in database
|
|
638
|
+
const stmt = this.db.prepare(`
|
|
639
|
+
INSERT INTO short_term_patterns
|
|
640
|
+
(id, strategy, domain, embedding, quality, usage_count, created_at, updated_at, session_id, metadata)
|
|
641
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
642
|
+
`);
|
|
643
|
+
|
|
644
|
+
stmt.run(
|
|
645
|
+
id, strategy, domain,
|
|
646
|
+
Buffer.from(embedding.buffer),
|
|
647
|
+
metadata.quality || 0.5,
|
|
648
|
+
1, now, now,
|
|
649
|
+
this.sessionId,
|
|
650
|
+
JSON.stringify(metadata)
|
|
651
|
+
);
|
|
652
|
+
|
|
653
|
+
// Add to HNSW index
|
|
654
|
+
this.shortTermIndex.add(id, embedding);
|
|
655
|
+
|
|
656
|
+
this.metrics.patternsStored++;
|
|
657
|
+
|
|
658
|
+
// Check if we need to prune
|
|
659
|
+
this._pruneShortTerm();
|
|
660
|
+
|
|
661
|
+
return { id, action: 'created', embedding: Array.from(embedding).slice(0, 5) };
|
|
662
|
+
}
|
|
663
|
+
|
|
664
|
+
// Search for similar patterns
|
|
665
|
+
async searchPatterns(query, k = 5, includeShortTerm = true) {
|
|
666
|
+
const embedding = typeof query === 'string'
|
|
667
|
+
? await this.embeddingService.embed(query)
|
|
668
|
+
: query;
|
|
669
|
+
|
|
670
|
+
const results = [];
|
|
671
|
+
|
|
672
|
+
// Search long-term first (higher quality)
|
|
673
|
+
const longTermResults = this.longTermIndex.search(embedding, k);
|
|
674
|
+
results.push(...longTermResults.results.map(r => ({ ...r, type: 'long_term' })));
|
|
675
|
+
|
|
676
|
+
// Search short-term if needed
|
|
677
|
+
if (includeShortTerm) {
|
|
678
|
+
const shortTermResults = this.shortTermIndex.search(embedding, k);
|
|
679
|
+
results.push(...shortTermResults.results.map(r => ({ ...r, type: 'short_term' })));
|
|
680
|
+
}
|
|
681
|
+
|
|
682
|
+
// Sort by similarity and dedupe
|
|
683
|
+
results.sort((a, b) => b.similarity - a.similarity);
|
|
684
|
+
const seen = new Set();
|
|
685
|
+
const deduped = results.filter(r => {
|
|
686
|
+
if (seen.has(r.patternId)) return false;
|
|
687
|
+
seen.add(r.patternId);
|
|
688
|
+
return true;
|
|
689
|
+
}).slice(0, k);
|
|
690
|
+
|
|
691
|
+
// Get full pattern data
|
|
692
|
+
const patterns = deduped.map(r => {
|
|
693
|
+
const table = r.type === 'long_term' ? 'long_term_patterns' : 'short_term_patterns';
|
|
694
|
+
const row = this.db.prepare(`SELECT * FROM ${table} WHERE id = ?`).get(r.patternId);
|
|
695
|
+
return {
|
|
696
|
+
...r,
|
|
697
|
+
strategy: row?.strategy,
|
|
698
|
+
domain: row?.domain,
|
|
699
|
+
quality: row?.quality,
|
|
700
|
+
usageCount: row?.usage_count,
|
|
701
|
+
};
|
|
702
|
+
});
|
|
703
|
+
|
|
704
|
+
this.metrics.patternsRetrieved += patterns.length;
|
|
705
|
+
this.metrics.searchCount++;
|
|
706
|
+
this.metrics.searchTimeTotal += longTermResults.searchTimeMs;
|
|
707
|
+
|
|
708
|
+
return {
|
|
709
|
+
patterns,
|
|
710
|
+
searchTimeMs: longTermResults.searchTimeMs,
|
|
711
|
+
totalLongTerm: this.longTermIndex.size(),
|
|
712
|
+
totalShortTerm: this.shortTermIndex.size(),
|
|
713
|
+
};
|
|
714
|
+
}
|
|
715
|
+
|
|
716
|
+
// Record pattern usage (for promotion)
|
|
717
|
+
recordPatternUsage(patternId, success = true) {
|
|
718
|
+
// Try short-term first
|
|
719
|
+
let updated = this._updatePatternUsage(patternId, 'short_term', success);
|
|
720
|
+
if (!updated) {
|
|
721
|
+
updated = this._updatePatternUsage(patternId, 'long_term', success);
|
|
722
|
+
}
|
|
723
|
+
|
|
724
|
+
// Check for promotion
|
|
725
|
+
if (updated) {
|
|
726
|
+
this._checkPromotion(patternId);
|
|
727
|
+
}
|
|
728
|
+
|
|
729
|
+
return updated;
|
|
730
|
+
}
|
|
731
|
+
|
|
732
|
+
// Promote patterns from short-term to long-term
|
|
733
|
+
_checkPromotion(patternId) {
|
|
734
|
+
const row = this.db.prepare(`
|
|
735
|
+
SELECT * FROM short_term_patterns WHERE id = ?
|
|
736
|
+
`).get(patternId);
|
|
737
|
+
|
|
738
|
+
if (!row) return false;
|
|
739
|
+
|
|
740
|
+
// Check promotion criteria
|
|
741
|
+
const shouldPromote =
|
|
742
|
+
row.usage_count >= CONFIG.patterns.promotionThreshold &&
|
|
743
|
+
row.quality >= CONFIG.patterns.qualityThreshold;
|
|
744
|
+
|
|
745
|
+
if (!shouldPromote) return false;
|
|
746
|
+
|
|
747
|
+
const now = Date.now();
|
|
748
|
+
|
|
749
|
+
// Insert into long-term
|
|
750
|
+
this.db.prepare(`
|
|
751
|
+
INSERT INTO long_term_patterns
|
|
752
|
+
(id, strategy, domain, embedding, quality, usage_count, success_count,
|
|
753
|
+
created_at, updated_at, promoted_at, source_pattern_id, quality_history, metadata)
|
|
754
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
755
|
+
`).run(
|
|
756
|
+
`lt_${patternId}`,
|
|
757
|
+
row.strategy,
|
|
758
|
+
row.domain,
|
|
759
|
+
row.embedding,
|
|
760
|
+
row.quality,
|
|
761
|
+
row.usage_count,
|
|
762
|
+
row.success_count,
|
|
763
|
+
row.created_at,
|
|
764
|
+
now,
|
|
765
|
+
now,
|
|
766
|
+
patternId,
|
|
767
|
+
JSON.stringify([row.quality]),
|
|
768
|
+
row.metadata
|
|
769
|
+
);
|
|
770
|
+
|
|
771
|
+
// Add to long-term index
|
|
772
|
+
this.longTermIndex.add(`lt_${patternId}`, this._bufferToFloat32Array(row.embedding));
|
|
773
|
+
|
|
774
|
+
// Remove from short-term
|
|
775
|
+
this.db.prepare('DELETE FROM short_term_patterns WHERE id = ?').run(patternId);
|
|
776
|
+
this.shortTermIndex.remove(patternId);
|
|
777
|
+
|
|
778
|
+
this.metrics.promotions++;
|
|
779
|
+
console.log(`[Learning] Promoted pattern ${patternId} to long-term`);
|
|
780
|
+
|
|
781
|
+
return true;
|
|
782
|
+
}
|
|
783
|
+
|
|
784
|
+
// Update pattern usage
|
|
785
|
+
_updatePatternUsage(patternId, table, success = true) {
|
|
786
|
+
const tableName = table === 'long_term' ? 'long_term_patterns' : 'short_term_patterns';
|
|
787
|
+
|
|
788
|
+
const result = this.db.prepare(`
|
|
789
|
+
UPDATE ${tableName}
|
|
790
|
+
SET usage_count = usage_count + 1,
|
|
791
|
+
success_count = success_count + ?,
|
|
792
|
+
quality = (quality * usage_count + ?) / (usage_count + 1),
|
|
793
|
+
updated_at = ?
|
|
794
|
+
WHERE id = ?
|
|
795
|
+
`).run(success ? 1 : 0, success ? 1.0 : 0.0, Date.now(), patternId);
|
|
796
|
+
|
|
797
|
+
return result.changes > 0;
|
|
798
|
+
}
|
|
799
|
+
|
|
800
|
+
// Consolidate patterns (dedup, prune, merge)
|
|
801
|
+
async consolidate() {
|
|
802
|
+
const startTime = Date.now();
|
|
803
|
+
const stats = {
|
|
804
|
+
duplicatesRemoved: 0,
|
|
805
|
+
patternsProned: 0,
|
|
806
|
+
patternsMerged: 0,
|
|
807
|
+
};
|
|
808
|
+
|
|
809
|
+
// 1. Remove old short-term patterns
|
|
810
|
+
const oldThreshold = Date.now() - CONFIG.patterns.shortTermMaxAge;
|
|
811
|
+
const pruned = this.db.prepare(`
|
|
812
|
+
DELETE FROM short_term_patterns
|
|
813
|
+
WHERE created_at < ? AND usage_count < ?
|
|
814
|
+
`).run(oldThreshold, CONFIG.patterns.promotionThreshold);
|
|
815
|
+
stats.patternsProned = pruned.changes;
|
|
816
|
+
|
|
817
|
+
// 2. Rebuild indexes
|
|
818
|
+
await this._loadIndexes();
|
|
819
|
+
|
|
820
|
+
// 3. Remove duplicates in long-term
|
|
821
|
+
const longTermPatterns = this.db.prepare('SELECT * FROM long_term_patterns').all();
|
|
822
|
+
for (let i = 0; i < longTermPatterns.length; i++) {
|
|
823
|
+
for (let j = i + 1; j < longTermPatterns.length; j++) {
|
|
824
|
+
const sim = this._cosineSimilarity(
|
|
825
|
+
this._bufferToFloat32Array(longTermPatterns[i].embedding),
|
|
826
|
+
this._bufferToFloat32Array(longTermPatterns[j].embedding)
|
|
827
|
+
);
|
|
828
|
+
|
|
829
|
+
if (sim > CONFIG.patterns.dedupThreshold) {
|
|
830
|
+
// Keep the higher quality one
|
|
831
|
+
const toRemove = longTermPatterns[i].quality >= longTermPatterns[j].quality
|
|
832
|
+
? longTermPatterns[j].id
|
|
833
|
+
: longTermPatterns[i].id;
|
|
834
|
+
|
|
835
|
+
this.db.prepare('DELETE FROM long_term_patterns WHERE id = ?').run(toRemove);
|
|
836
|
+
stats.duplicatesRemoved++;
|
|
837
|
+
}
|
|
838
|
+
}
|
|
839
|
+
}
|
|
840
|
+
|
|
841
|
+
// 4. Prune old long-term patterns
|
|
842
|
+
const pruneAge = Date.now() - CONFIG.consolidation.pruneAge;
|
|
843
|
+
const oldPruned = this.db.prepare(`
|
|
844
|
+
DELETE FROM long_term_patterns
|
|
845
|
+
WHERE updated_at < ? AND usage_count < ?
|
|
846
|
+
`).run(pruneAge, CONFIG.consolidation.minUsageForKeep);
|
|
847
|
+
stats.patternsProned += oldPruned.changes;
|
|
848
|
+
|
|
849
|
+
// Rebuild indexes after changes
|
|
850
|
+
await this._loadIndexes();
|
|
851
|
+
|
|
852
|
+
this.metrics.consolidations++;
|
|
853
|
+
|
|
854
|
+
const duration = Date.now() - startTime;
|
|
855
|
+
console.log(`[Learning] Consolidation complete in ${duration}ms:`, stats);
|
|
856
|
+
|
|
857
|
+
return { ...stats, durationMs: duration };
|
|
858
|
+
}
|
|
859
|
+
|
|
860
|
+
// Export learning data for session end
|
|
861
|
+
async exportSession() {
|
|
862
|
+
const sessionPatterns = this.db.prepare(`
|
|
863
|
+
SELECT * FROM short_term_patterns WHERE session_id = ?
|
|
864
|
+
`).all(this.sessionId);
|
|
865
|
+
|
|
866
|
+
const trajectories = this.db.prepare(`
|
|
867
|
+
SELECT * FROM trajectories WHERE session_id = ?
|
|
868
|
+
`).all(this.sessionId);
|
|
869
|
+
|
|
870
|
+
return {
|
|
871
|
+
sessionId: this.sessionId,
|
|
872
|
+
patterns: sessionPatterns.length,
|
|
873
|
+
trajectories: trajectories.length,
|
|
874
|
+
metrics: this.metrics,
|
|
875
|
+
shortTermTotal: this.shortTermIndex.size(),
|
|
876
|
+
longTermTotal: this.longTermIndex.size(),
|
|
877
|
+
};
|
|
878
|
+
}
|
|
879
|
+
|
|
880
|
+
// Get learning statistics
|
|
881
|
+
getStats() {
|
|
882
|
+
const shortTermCount = this.db.prepare('SELECT COUNT(*) as count FROM short_term_patterns').get().count;
|
|
883
|
+
const longTermCount = this.db.prepare('SELECT COUNT(*) as count FROM long_term_patterns').get().count;
|
|
884
|
+
const trajectoryCount = this.db.prepare('SELECT COUNT(*) as count FROM trajectories').get().count;
|
|
885
|
+
|
|
886
|
+
const avgQuality = this.db.prepare(`
|
|
887
|
+
SELECT AVG(quality) as avg FROM (
|
|
888
|
+
SELECT quality FROM short_term_patterns
|
|
889
|
+
UNION ALL
|
|
890
|
+
SELECT quality FROM long_term_patterns
|
|
891
|
+
)
|
|
892
|
+
`).get().avg || 0;
|
|
893
|
+
|
|
894
|
+
return {
|
|
895
|
+
shortTermPatterns: shortTermCount,
|
|
896
|
+
longTermPatterns: longTermCount,
|
|
897
|
+
trajectories: trajectoryCount,
|
|
898
|
+
avgQuality,
|
|
899
|
+
avgSearchTimeMs: this.metrics.searchCount > 0
|
|
900
|
+
? this.metrics.searchTimeTotal / this.metrics.searchCount
|
|
901
|
+
: 0,
|
|
902
|
+
...this.metrics,
|
|
903
|
+
};
|
|
904
|
+
}
|
|
905
|
+
|
|
906
|
+
// Load indexes from database
|
|
907
|
+
async _loadIndexes() {
|
|
908
|
+
// Load short-term patterns
|
|
909
|
+
this.shortTermIndex = new HNSWIndex(CONFIG);
|
|
910
|
+
const shortTermPatterns = this.db.prepare('SELECT id, embedding FROM short_term_patterns').all();
|
|
911
|
+
for (const row of shortTermPatterns) {
|
|
912
|
+
const embedding = this._bufferToFloat32Array(row.embedding);
|
|
913
|
+
if (embedding) {
|
|
914
|
+
this.shortTermIndex.add(row.id, embedding);
|
|
915
|
+
}
|
|
916
|
+
}
|
|
917
|
+
|
|
918
|
+
// Load long-term patterns
|
|
919
|
+
this.longTermIndex = new HNSWIndex(CONFIG);
|
|
920
|
+
const longTermPatterns = this.db.prepare('SELECT id, embedding FROM long_term_patterns').all();
|
|
921
|
+
for (const row of longTermPatterns) {
|
|
922
|
+
const embedding = this._bufferToFloat32Array(row.embedding);
|
|
923
|
+
if (embedding) {
|
|
924
|
+
this.longTermIndex.add(row.id, embedding);
|
|
925
|
+
}
|
|
926
|
+
}
|
|
927
|
+
}
|
|
928
|
+
|
|
929
|
+
// Prune short-term patterns if over limit
|
|
930
|
+
_pruneShortTerm() {
|
|
931
|
+
const count = this.db.prepare('SELECT COUNT(*) as count FROM short_term_patterns').get().count;
|
|
932
|
+
|
|
933
|
+
if (count <= CONFIG.patterns.maxShortTerm) return;
|
|
934
|
+
|
|
935
|
+
// Remove lowest quality patterns
|
|
936
|
+
const toRemove = count - CONFIG.patterns.maxShortTerm;
|
|
937
|
+
const ids = this.db.prepare(`
|
|
938
|
+
SELECT id FROM short_term_patterns
|
|
939
|
+
ORDER BY quality ASC, usage_count ASC
|
|
940
|
+
LIMIT ?
|
|
941
|
+
`).all(toRemove).map(r => r.id);
|
|
942
|
+
|
|
943
|
+
for (const id of ids) {
|
|
944
|
+
this.db.prepare('DELETE FROM short_term_patterns WHERE id = ?').run(id);
|
|
945
|
+
this.shortTermIndex.remove(id);
|
|
946
|
+
}
|
|
947
|
+
}
|
|
948
|
+
|
|
949
|
+
// Get/set state
|
|
950
|
+
_getState(key) {
|
|
951
|
+
const row = this.db.prepare('SELECT value FROM session_state WHERE key = ?').get(key);
|
|
952
|
+
return row?.value;
|
|
953
|
+
}
|
|
954
|
+
|
|
955
|
+
_setState(key, value) {
|
|
956
|
+
this.db.prepare(`
|
|
957
|
+
INSERT OR REPLACE INTO session_state (key, value, updated_at)
|
|
958
|
+
VALUES (?, ?, ?)
|
|
959
|
+
`).run(key, value, Date.now());
|
|
960
|
+
}
|
|
961
|
+
|
|
962
|
+
// Cosine similarity helper
|
|
963
|
+
_cosineSimilarity(a, b) {
|
|
964
|
+
let dot = 0, normA = 0, normB = 0;
|
|
965
|
+
for (let i = 0; i < a.length; i++) {
|
|
966
|
+
dot += a[i] * b[i];
|
|
967
|
+
normA += a[i] * a[i];
|
|
968
|
+
normB += b[i] * b[i];
|
|
969
|
+
}
|
|
970
|
+
const denom = Math.sqrt(normA) * Math.sqrt(normB);
|
|
971
|
+
return denom > 0 ? dot / denom : 0;
|
|
972
|
+
}
|
|
973
|
+
|
|
974
|
+
// Close database
|
|
975
|
+
close() {
|
|
976
|
+
if (this.db) {
|
|
977
|
+
this.db.close();
|
|
978
|
+
this.db = null;
|
|
979
|
+
}
|
|
980
|
+
}
|
|
981
|
+
|
|
982
|
+
// Helper: Safely convert SQLite Buffer to Float32Array
|
|
983
|
+
// Handles byte alignment issues that cause "byte length should be multiple of 4"
|
|
984
|
+
_bufferToFloat32Array(buffer) {
|
|
985
|
+
if (!buffer) return null;
|
|
986
|
+
|
|
987
|
+
// If it's already a Float32Array, return it
|
|
988
|
+
if (buffer instanceof Float32Array) return buffer;
|
|
989
|
+
|
|
990
|
+
// Get the expected number of floats based on embedding dimension
|
|
991
|
+
const numFloats = this.config?.embedding?.dimension || CONFIG.embedding.dimension;
|
|
992
|
+
const expectedBytes = numFloats * 4;
|
|
993
|
+
|
|
994
|
+
// Create a properly aligned Uint8Array copy
|
|
995
|
+
const uint8 = new Uint8Array(expectedBytes);
|
|
996
|
+
const sourceLength = Math.min(buffer.length, expectedBytes);
|
|
997
|
+
|
|
998
|
+
// Copy bytes from Buffer to Uint8Array
|
|
999
|
+
for (let i = 0; i < sourceLength; i++) {
|
|
1000
|
+
uint8[i] = buffer[i];
|
|
1001
|
+
}
|
|
1002
|
+
|
|
1003
|
+
// Create Float32Array from the aligned buffer
|
|
1004
|
+
return new Float32Array(uint8.buffer);
|
|
1005
|
+
}
|
|
1006
|
+
}
|
|
1007
|
+
|
|
1008
|
+
// =============================================================================
|
|
1009
|
+
// CLI Interface
|
|
1010
|
+
// =============================================================================
|
|
1011
|
+
|
|
1012
|
+
async function main() {
|
|
1013
|
+
const command = process.argv[2] || 'help';
|
|
1014
|
+
const service = new LearningService();
|
|
1015
|
+
|
|
1016
|
+
try {
|
|
1017
|
+
switch (command) {
|
|
1018
|
+
case 'init':
|
|
1019
|
+
case 'start': {
|
|
1020
|
+
const sessionId = process.argv[3];
|
|
1021
|
+
const result = await service.initialize(sessionId);
|
|
1022
|
+
console.log(JSON.stringify(result, null, 2));
|
|
1023
|
+
break;
|
|
1024
|
+
}
|
|
1025
|
+
|
|
1026
|
+
case 'store': {
|
|
1027
|
+
await service.initialize();
|
|
1028
|
+
const strategy = process.argv[3];
|
|
1029
|
+
const domain = process.argv[4] || 'general';
|
|
1030
|
+
if (!strategy) {
|
|
1031
|
+
console.error('Usage: learning-service.mjs store <strategy> [domain]');
|
|
1032
|
+
process.exit(1);
|
|
1033
|
+
}
|
|
1034
|
+
const result = await service.storePattern(strategy, domain);
|
|
1035
|
+
console.log(JSON.stringify(result, null, 2));
|
|
1036
|
+
break;
|
|
1037
|
+
}
|
|
1038
|
+
|
|
1039
|
+
case 'search': {
|
|
1040
|
+
await service.initialize();
|
|
1041
|
+
const query = process.argv[3];
|
|
1042
|
+
const k = parseInt(process.argv[4]) || 5;
|
|
1043
|
+
if (!query) {
|
|
1044
|
+
console.error('Usage: learning-service.mjs search <query> [k]');
|
|
1045
|
+
process.exit(1);
|
|
1046
|
+
}
|
|
1047
|
+
const result = await service.searchPatterns(query, k);
|
|
1048
|
+
console.log(JSON.stringify(result, null, 2));
|
|
1049
|
+
break;
|
|
1050
|
+
}
|
|
1051
|
+
|
|
1052
|
+
case 'consolidate': {
|
|
1053
|
+
await service.initialize();
|
|
1054
|
+
const result = await service.consolidate();
|
|
1055
|
+
console.log(JSON.stringify(result, null, 2));
|
|
1056
|
+
break;
|
|
1057
|
+
}
|
|
1058
|
+
|
|
1059
|
+
case 'export': {
|
|
1060
|
+
await service.initialize();
|
|
1061
|
+
const result = await service.exportSession();
|
|
1062
|
+
console.log(JSON.stringify(result, null, 2));
|
|
1063
|
+
break;
|
|
1064
|
+
}
|
|
1065
|
+
|
|
1066
|
+
case 'stats': {
|
|
1067
|
+
await service.initialize();
|
|
1068
|
+
const stats = service.getStats();
|
|
1069
|
+
console.log(JSON.stringify(stats, null, 2));
|
|
1070
|
+
break;
|
|
1071
|
+
}
|
|
1072
|
+
|
|
1073
|
+
case 'benchmark': {
|
|
1074
|
+
await service.initialize();
|
|
1075
|
+
|
|
1076
|
+
console.log('[Benchmark] Starting HNSW performance test...');
|
|
1077
|
+
|
|
1078
|
+
// Store test patterns
|
|
1079
|
+
const testPatterns = [
|
|
1080
|
+
'Implement authentication with JWT tokens',
|
|
1081
|
+
'Fix memory leak in event handler',
|
|
1082
|
+
'Optimize database query performance',
|
|
1083
|
+
'Add unit tests for user service',
|
|
1084
|
+
'Refactor component to use hooks',
|
|
1085
|
+
];
|
|
1086
|
+
|
|
1087
|
+
for (const strategy of testPatterns) {
|
|
1088
|
+
await service.storePattern(strategy, 'code');
|
|
1089
|
+
}
|
|
1090
|
+
|
|
1091
|
+
// Benchmark search
|
|
1092
|
+
const searchTimes = [];
|
|
1093
|
+
for (let i = 0; i < 100; i++) {
|
|
1094
|
+
const start = performance.now();
|
|
1095
|
+
await service.searchPatterns('implement authentication', 3);
|
|
1096
|
+
searchTimes.push(performance.now() - start);
|
|
1097
|
+
}
|
|
1098
|
+
|
|
1099
|
+
const avgSearch = searchTimes.reduce((a, b) => a + b) / searchTimes.length;
|
|
1100
|
+
const p95Search = searchTimes.sort((a, b) => a - b)[Math.floor(searchTimes.length * 0.95)];
|
|
1101
|
+
|
|
1102
|
+
console.log(JSON.stringify({
|
|
1103
|
+
avgSearchMs: avgSearch.toFixed(3),
|
|
1104
|
+
p95SearchMs: p95Search.toFixed(3),
|
|
1105
|
+
totalPatterns: service.getStats().shortTermPatterns + service.getStats().longTermPatterns,
|
|
1106
|
+
hnswActive: true,
|
|
1107
|
+
searchImprovementEstimate: `${Math.round(50 / Math.max(avgSearch, 0.1))}x`,
|
|
1108
|
+
}, null, 2));
|
|
1109
|
+
break;
|
|
1110
|
+
}
|
|
1111
|
+
|
|
1112
|
+
case 'help':
|
|
1113
|
+
default:
|
|
1114
|
+
console.log(`
|
|
1115
|
+
Claude Flow V3 Learning Service
|
|
1116
|
+
|
|
1117
|
+
Usage: learning-service.mjs <command> [args]
|
|
1118
|
+
|
|
1119
|
+
Commands:
|
|
1120
|
+
init [sessionId] Initialize learning service
|
|
1121
|
+
store <strategy> [domain] Store a new pattern
|
|
1122
|
+
search <query> [k] Search for similar patterns
|
|
1123
|
+
consolidate Consolidate and prune patterns
|
|
1124
|
+
export Export session learning data
|
|
1125
|
+
stats Get learning statistics
|
|
1126
|
+
benchmark Run HNSW performance benchmark
|
|
1127
|
+
help Show this help message
|
|
1128
|
+
`);
|
|
1129
|
+
}
|
|
1130
|
+
} finally {
|
|
1131
|
+
service.close();
|
|
1132
|
+
}
|
|
1133
|
+
}
|
|
1134
|
+
|
|
1135
|
+
// Export for programmatic use
|
|
1136
|
+
export { LearningService, HNSWIndex, EmbeddingService, CONFIG };
|
|
1137
|
+
|
|
1138
|
+
// Run CLI if executed directly
|
|
1139
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
1140
|
+
main().catch(e => {
|
|
1141
|
+
console.error('Error:', e.message);
|
|
1142
|
+
process.exit(1);
|
|
1143
|
+
});
|
|
1144
|
+
}
|