agentic-flow 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents/MIGRATION_SUMMARY.md +222 -0
- package/.claude/agents/README.md +89 -0
- package/.claude/agents/analysis/code-analyzer.md +209 -0
- package/.claude/agents/analysis/code-review/analyze-code-quality.md +180 -0
- package/.claude/agents/architecture/system-design/arch-system-design.md +156 -0
- package/.claude/agents/base-template-generator.md +42 -0
- package/.claude/agents/consensus/README.md +253 -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 +211 -0
- package/.claude/agents/core/planner.md +116 -0
- package/.claude/agents/core/researcher.md +136 -0
- package/.claude/agents/core/reviewer.md +272 -0
- package/.claude/agents/core/tester.md +266 -0
- package/.claude/agents/data/ml/data-ml-model.md +193 -0
- package/.claude/agents/development/backend/dev-backend-api.md +142 -0
- package/.claude/agents/devops/ci-cd/ops-cicd-github.md +164 -0
- package/.claude/agents/documentation/api-docs/docs-api-openapi.md +174 -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 +538 -0
- package/.claude/agents/github/github-modes.md +173 -0
- package/.claude/agents/github/issue-tracker.md +319 -0
- package/.claude/agents/github/multi-repo-swarm.md +553 -0
- package/.claude/agents/github/pr-manager.md +191 -0
- package/.claude/agents/github/project-board-sync.md +509 -0
- package/.claude/agents/github/release-manager.md +367 -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 +635 -0
- package/.claude/agents/goal/agent.md +816 -0
- package/.claude/agents/goal/goal-planner.md +73 -0
- package/.claude/agents/optimization/README.md +250 -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/sparc/architecture.md +472 -0
- package/.claude/agents/sparc/pseudocode.md +318 -0
- package/.claude/agents/sparc/refinement.md +525 -0
- package/.claude/agents/sparc/specification.md +276 -0
- package/.claude/agents/specialized/mobile/spec-mobile-react-native.md +226 -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/README.md +190 -0
- package/.claude/agents/swarm/adaptive-coordinator.md +396 -0
- package/.claude/agents/swarm/hierarchical-coordinator.md +256 -0
- package/.claude/agents/swarm/mesh-coordinator.md +392 -0
- package/.claude/agents/templates/automation-smart-agent.md +205 -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/migration-plan.md +746 -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 +183 -0
- package/.claude/agents/test-neural.md +14 -0
- package/.claude/agents/testing/unit/tdd-london-swarm.md +244 -0
- package/.claude/agents/testing/validation/production-validator.md +395 -0
- package/.claude/commands/agents/README.md +10 -0
- package/.claude/commands/agents/agent-capabilities.md +21 -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 +26 -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/memory/usage.md +46 -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 +27 -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/checkpoint-manager.sh +251 -0
- package/.claude/helpers/github-safe.js +106 -0
- package/.claude/helpers/github-setup.sh +28 -0
- package/.claude/helpers/quick-start.sh +19 -0
- package/.claude/helpers/setup-mcp.sh +18 -0
- package/.claude/helpers/standard-checkpoint-hooks.sh +179 -0
- package/.claude/mcp.json +13 -0
- package/.claude/settings-backup.json +130 -0
- package/.claude/settings-optimized.json +116 -0
- package/.claude/settings-simple.json +78 -0
- package/.claude/settings.json +114 -0
- package/.claude/settings.local.json +14 -0
- package/README.md +1280 -0
- package/dist/agents/claudeAgent.js +73 -0
- package/dist/agents/claudeFlowAgent.js +115 -0
- package/dist/agents/codeReviewAgent.js +34 -0
- package/dist/agents/dataAgent.js +34 -0
- package/dist/agents/directApiAgent.js +260 -0
- package/dist/agents/webResearchAgent.js +35 -0
- package/dist/cli/mcp.js +135 -0
- package/dist/cli-proxy.js +246 -0
- package/dist/cli.js +158 -0
- package/dist/config/claudeFlow.js +67 -0
- package/dist/config/tools.js +33 -0
- package/dist/coordination/parallelSwarm.js +226 -0
- package/dist/examples/multi-agent-orchestration.js +45 -0
- package/dist/examples/parallel-swarm-deployment.js +171 -0
- package/dist/examples/use-goal-planner.js +52 -0
- package/dist/health.js +46 -0
- package/dist/index-with-proxy.js +101 -0
- package/dist/index.js +167 -0
- package/dist/mcp/claudeFlowSdkServer.js +202 -0
- package/dist/mcp/fastmcp/servers/claude-flow-sdk.js +198 -0
- package/dist/mcp/fastmcp/servers/http-streaming-updated.js +421 -0
- package/dist/mcp/fastmcp/servers/poc-stdio.js +82 -0
- package/dist/mcp/fastmcp/servers/stdio-full.js +421 -0
- package/dist/mcp/fastmcp/tools/agent/add-agent.js +107 -0
- package/dist/mcp/fastmcp/tools/agent/add-command.js +117 -0
- package/dist/mcp/fastmcp/tools/agent/execute.js +56 -0
- package/dist/mcp/fastmcp/tools/agent/list.js +82 -0
- package/dist/mcp/fastmcp/tools/agent/parallel.js +63 -0
- package/dist/mcp/fastmcp/tools/memory/retrieve.js +38 -0
- package/dist/mcp/fastmcp/tools/memory/search.js +41 -0
- package/dist/mcp/fastmcp/tools/memory/store.js +56 -0
- package/dist/mcp/fastmcp/tools/swarm/init.js +41 -0
- package/dist/mcp/fastmcp/tools/swarm/orchestrate.js +47 -0
- package/dist/mcp/fastmcp/tools/swarm/spawn.js +40 -0
- package/dist/mcp/fastmcp/types/index.js +2 -0
- package/dist/proxy/anthropic-to-openrouter.js +246 -0
- package/dist/router/providers/anthropic.js +89 -0
- package/dist/router/providers/onnx-local-optimized.js +167 -0
- package/dist/router/providers/onnx-local.js +294 -0
- package/dist/router/providers/onnx-phi4.js +190 -0
- package/dist/router/providers/onnx.js +242 -0
- package/dist/router/providers/openrouter.js +242 -0
- package/dist/router/router.js +283 -0
- package/dist/router/test-integration.js +140 -0
- package/dist/router/test-onnx-benchmark.js +145 -0
- package/dist/router/test-onnx-integration.js +128 -0
- package/dist/router/test-onnx-local.js +37 -0
- package/dist/router/test-onnx.js +148 -0
- package/dist/router/test-openrouter.js +121 -0
- package/dist/router/test-phi4.js +137 -0
- package/dist/router/types.js +2 -0
- package/dist/utils/agentLoader.js +106 -0
- package/dist/utils/cli.js +128 -0
- package/dist/utils/logger.js +41 -0
- package/dist/utils/mcpCommands.js +214 -0
- package/dist/utils/model-downloader.js +182 -0
- package/dist/utils/retry.js +54 -0
- package/docs/.claude-flow/metrics/agent-metrics.json +1 -0
- package/docs/.claude-flow/metrics/performance.json +9 -0
- package/docs/.claude-flow/metrics/task-metrics.json +10 -0
- package/docs/CHANGELOG.md +155 -0
- package/docs/CLAUDE.md +352 -0
- package/docs/COMPLETE_VALIDATION_SUMMARY.md +405 -0
- package/docs/INDEX.md +183 -0
- package/docs/LICENSE +21 -0
- package/docs/ONNX_CLI_USAGE.md +344 -0
- package/docs/ONNX_ENV_VARS.md +564 -0
- package/docs/ONNX_INTEGRATION.md +422 -0
- package/docs/ONNX_OPTIMIZATION_GUIDE.md +665 -0
- package/docs/ONNX_OPTIMIZATION_SUMMARY.md +374 -0
- package/docs/ONNX_VS_CLAUDE_QUALITY.md +442 -0
- package/docs/OPENROUTER_DEPLOYMENT.md +495 -0
- package/docs/architecture/EXECUTIVE_SUMMARY.md +310 -0
- package/docs/architecture/IMPROVEMENT_PLAN.md +11 -0
- package/docs/architecture/INTEGRATION-STATUS.md +290 -0
- package/docs/architecture/MULTI_MODEL_ROUTER_PLAN.md +620 -0
- package/docs/architecture/QUICK_WINS.md +333 -0
- package/docs/architecture/README.md +15 -0
- package/docs/architecture/RESEARCH_SUMMARY.md +652 -0
- package/docs/archived/FASTMCP_COMPLETE.md +428 -0
- package/docs/archived/FASTMCP_INTEGRATION_STATUS.md +288 -0
- package/docs/archived/FLOW-NEXUS-COMPLETE.md +269 -0
- package/docs/archived/INTEGRATION_CONFIRMED.md +351 -0
- package/docs/archived/ONNX_FINAL_REPORT.md +312 -0
- package/docs/archived/ONNX_IMPLEMENTATION_COMPLETE.md +215 -0
- package/docs/archived/ONNX_IMPLEMENTATION_SUMMARY.md +197 -0
- package/docs/archived/ONNX_SUCCESS_REPORT.md +271 -0
- package/docs/archived/OPENROUTER_PROXY_COMPLETE.md +494 -0
- package/docs/archived/PACKAGE-COMPLETE.md +138 -0
- package/docs/archived/README.md +27 -0
- package/docs/archived/RESEARCH_COMPLETE.txt +335 -0
- package/docs/archived/SDK-SETUP-COMPLETE.md +252 -0
- package/docs/guides/ALTERNATIVE_LLM_MODELS.md +524 -0
- package/docs/guides/DOCKER_AGENT_USAGE.md +352 -0
- package/docs/guides/IMPLEMENTATION_EXAMPLES.md +960 -0
- package/docs/guides/NPM-PUBLISH.md +218 -0
- package/docs/guides/README.md +17 -0
- package/docs/guides/agent-sdk.md +234 -0
- package/docs/integrations/CLAUDE_AGENTS_INTEGRATION.md +356 -0
- package/docs/integrations/CLAUDE_FLOW_INTEGRATION.md +535 -0
- package/docs/integrations/FASTMCP_CLI_INTEGRATION.md +503 -0
- package/docs/integrations/FLOW-NEXUS-INTEGRATION.md +319 -0
- package/docs/integrations/README.md +18 -0
- package/docs/integrations/fastmcp-implementation-plan.md +2516 -0
- package/docs/integrations/fastmcp-poc-integration.md +198 -0
- package/docs/router/ONNX_PHI4_RESEARCH.md +220 -0
- package/docs/router/ONNX_RUNTIME_INTEGRATION_PLAN.md +866 -0
- package/docs/router/PHI4_HYPEROPTIMIZATION_PLAN.md +2488 -0
- package/docs/router/README.md +552 -0
- package/docs/router/ROUTER_CONFIG_REFERENCE.md +577 -0
- package/docs/router/ROUTER_USER_GUIDE.md +865 -0
- package/docs/validation/DOCKER_MCP_VALIDATION.md +358 -0
- package/docs/validation/DOCKER_OPENROUTER_VALIDATION.md +443 -0
- package/docs/validation/FINAL_SYSTEM_VALIDATION.md +458 -0
- package/docs/validation/FINAL_VALIDATION_SUMMARY.md +409 -0
- package/docs/validation/MCP_CLI_TOOLS_VALIDATION.md +266 -0
- package/docs/validation/MODEL_VALIDATION_REPORT.md +386 -0
- package/docs/validation/OPENROUTER_VALIDATION_COMPLETE.md +382 -0
- package/docs/validation/README.md +20 -0
- package/docs/validation/ROUTER_VALIDATION.md +311 -0
- package/package.json +140 -0
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
// CLI argument parsing and help utilities
|
|
2
|
+
export function parseArgs() {
|
|
3
|
+
const args = process.argv.slice(2);
|
|
4
|
+
const options = {
|
|
5
|
+
mode: 'parallel'
|
|
6
|
+
};
|
|
7
|
+
// Check for MCP command first
|
|
8
|
+
if (args[0] === 'mcp') {
|
|
9
|
+
options.mode = 'mcp';
|
|
10
|
+
options.mcpCommand = args[1] || 'start'; // default to start
|
|
11
|
+
options.mcpServer = args[2] || 'all'; // default to all servers
|
|
12
|
+
return options;
|
|
13
|
+
}
|
|
14
|
+
for (let i = 0; i < args.length; i++) {
|
|
15
|
+
const arg = args[i];
|
|
16
|
+
switch (arg) {
|
|
17
|
+
case '--help':
|
|
18
|
+
case '-h':
|
|
19
|
+
options.help = true;
|
|
20
|
+
break;
|
|
21
|
+
case '--agent':
|
|
22
|
+
case '-a':
|
|
23
|
+
options.mode = 'agent';
|
|
24
|
+
options.agent = args[++i];
|
|
25
|
+
break;
|
|
26
|
+
case '--task':
|
|
27
|
+
case '-t':
|
|
28
|
+
options.task = args[++i];
|
|
29
|
+
break;
|
|
30
|
+
case '--model':
|
|
31
|
+
case '-m':
|
|
32
|
+
options.model = args[++i];
|
|
33
|
+
break;
|
|
34
|
+
case '--provider':
|
|
35
|
+
case '-p':
|
|
36
|
+
options.provider = args[++i];
|
|
37
|
+
break;
|
|
38
|
+
case '--stream':
|
|
39
|
+
case '-s':
|
|
40
|
+
options.stream = true;
|
|
41
|
+
break;
|
|
42
|
+
case '--list':
|
|
43
|
+
case '-l':
|
|
44
|
+
options.mode = 'list';
|
|
45
|
+
break;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return options;
|
|
49
|
+
}
|
|
50
|
+
export function printHelp() {
|
|
51
|
+
console.log(`
|
|
52
|
+
🤖 Agentic Flow - AI Agent Orchestration CLI
|
|
53
|
+
|
|
54
|
+
USAGE:
|
|
55
|
+
npx agentic-flow [COMMAND] [OPTIONS]
|
|
56
|
+
|
|
57
|
+
COMMANDS:
|
|
58
|
+
mcp <command> [server] Manage MCP servers (start, stop, status, list)
|
|
59
|
+
--list, -l List all available agents
|
|
60
|
+
--agent, -a <name> Run specific agent mode
|
|
61
|
+
(default) Run parallel mode (3 agents)
|
|
62
|
+
|
|
63
|
+
MCP COMMANDS:
|
|
64
|
+
npx agentic-flow mcp start [server] Start MCP server(s)
|
|
65
|
+
npx agentic-flow mcp stop [server] Stop MCP server(s)
|
|
66
|
+
npx agentic-flow mcp status [server] Check MCP server status
|
|
67
|
+
npx agentic-flow mcp list List all available MCP tools
|
|
68
|
+
|
|
69
|
+
Available servers: claude-flow, flow-nexus, agentic-payments, all (default)
|
|
70
|
+
|
|
71
|
+
OPTIONS:
|
|
72
|
+
--task, -t <task> Task description for agent mode
|
|
73
|
+
--model, -m <model> Model to use (supports OpenRouter models)
|
|
74
|
+
--provider, -p <name> Provider to use (anthropic, openrouter, onnx)
|
|
75
|
+
--stream, -s Enable real-time streaming output
|
|
76
|
+
--help, -h Show this help message
|
|
77
|
+
|
|
78
|
+
EXAMPLES:
|
|
79
|
+
# MCP Server Management
|
|
80
|
+
npx agentic-flow mcp start # Start all MCP servers
|
|
81
|
+
npx agentic-flow mcp start claude-flow # Start specific server
|
|
82
|
+
npx agentic-flow mcp list # List all 203+ MCP tools
|
|
83
|
+
npx agentic-flow mcp status # Check server status
|
|
84
|
+
|
|
85
|
+
# Agent Execution
|
|
86
|
+
npx agentic-flow --list # List all 150+ agents
|
|
87
|
+
npx agentic-flow --agent researcher --task "Analyze AI trends"
|
|
88
|
+
npx agentic-flow --agent coder --task "Build REST API" --model "meta-llama/llama-3.1-8b-instruct"
|
|
89
|
+
npx agentic-flow --agent coder --task "Create hello world" --provider onnx
|
|
90
|
+
npx agentic-flow --agent coder --task "Build REST API" --stream
|
|
91
|
+
|
|
92
|
+
# Parallel Mode
|
|
93
|
+
npx agentic-flow # Run 3 agents in parallel (requires TOPIC, DIFF, DATASET)
|
|
94
|
+
|
|
95
|
+
ENVIRONMENT VARIABLES:
|
|
96
|
+
ANTHROPIC_API_KEY Anthropic API key (for Claude models)
|
|
97
|
+
OPENROUTER_API_KEY OpenRouter API key (for alternative models)
|
|
98
|
+
USE_ONNX Set to 'true' to force ONNX local inference
|
|
99
|
+
AGENT Agent name for agent mode
|
|
100
|
+
TASK Task description for agent mode
|
|
101
|
+
MODEL Model override for agent mode
|
|
102
|
+
PROVIDER Provider to use (anthropic, openrouter, onnx)
|
|
103
|
+
TOPIC Research topic for parallel mode
|
|
104
|
+
DIFF Code diff for parallel mode
|
|
105
|
+
DATASET Dataset hint for parallel mode
|
|
106
|
+
ENABLE_STREAMING Enable streaming (true/false)
|
|
107
|
+
HEALTH_PORT Health check port (default: 8080)
|
|
108
|
+
|
|
109
|
+
MCP TOOLS (203+ available):
|
|
110
|
+
• claude-flow-sdk: 6 in-process tools (memory, swarm coordination)
|
|
111
|
+
• claude-flow: 101 tools (neural networks, GitHub, workflows, DAA)
|
|
112
|
+
• flow-nexus: 96 cloud tools (sandboxes, distributed swarms, templates)
|
|
113
|
+
• agentic-payments: Payment authorization and multi-agent consensus
|
|
114
|
+
|
|
115
|
+
For more information, visit: https://github.com/ruvnet/agentic-flow
|
|
116
|
+
`);
|
|
117
|
+
}
|
|
118
|
+
export function validateOptions(options) {
|
|
119
|
+
if (options.mode === 'agent') {
|
|
120
|
+
if (!options.agent && !process.env.AGENT) {
|
|
121
|
+
return 'Agent mode requires --agent <name> or AGENT env variable';
|
|
122
|
+
}
|
|
123
|
+
if (!options.task && !process.env.TASK) {
|
|
124
|
+
return 'Agent mode requires --task <description> or TASK env variable';
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
return null;
|
|
128
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
class Logger {
|
|
2
|
+
context = {};
|
|
3
|
+
setContext(ctx) {
|
|
4
|
+
this.context = { ...this.context, ...ctx };
|
|
5
|
+
}
|
|
6
|
+
log(level, message, data) {
|
|
7
|
+
const timestamp = new Date().toISOString();
|
|
8
|
+
const logEntry = {
|
|
9
|
+
timestamp,
|
|
10
|
+
level,
|
|
11
|
+
message,
|
|
12
|
+
...this.context,
|
|
13
|
+
...data
|
|
14
|
+
};
|
|
15
|
+
// Structured JSON logging for production
|
|
16
|
+
if (process.env.NODE_ENV === 'production') {
|
|
17
|
+
console.log(JSON.stringify(logEntry));
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
// Human-readable for development
|
|
21
|
+
const prefix = `[${timestamp}] ${level.toUpperCase()}`;
|
|
22
|
+
const contextStr = Object.keys({ ...this.context, ...data }).length > 0
|
|
23
|
+
? ` ${JSON.stringify({ ...this.context, ...data })}`
|
|
24
|
+
: '';
|
|
25
|
+
console.log(`${prefix}: ${message}${contextStr}`);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
debug(message, data) {
|
|
29
|
+
this.log('debug', message, data);
|
|
30
|
+
}
|
|
31
|
+
info(message, data) {
|
|
32
|
+
this.log('info', message, data);
|
|
33
|
+
}
|
|
34
|
+
warn(message, data) {
|
|
35
|
+
this.log('warn', message, data);
|
|
36
|
+
}
|
|
37
|
+
error(message, data) {
|
|
38
|
+
this.log('error', message, data);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
export const logger = new Logger();
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
// MCP server management commands
|
|
2
|
+
import { spawn, exec } from 'child_process';
|
|
3
|
+
import { promisify } from 'util';
|
|
4
|
+
const execAsync = promisify(exec);
|
|
5
|
+
const MCP_SERVERS = {
|
|
6
|
+
'claude-flow': {
|
|
7
|
+
name: 'claude-flow',
|
|
8
|
+
command: 'npx',
|
|
9
|
+
args: ['claude-flow@alpha', 'mcp', 'start'],
|
|
10
|
+
description: '101 tools (neural networks, GitHub, workflows, DAA)',
|
|
11
|
+
toolCount: 101
|
|
12
|
+
},
|
|
13
|
+
'flow-nexus': {
|
|
14
|
+
name: 'flow-nexus',
|
|
15
|
+
command: 'npx',
|
|
16
|
+
args: ['flow-nexus@latest', 'mcp', 'start'],
|
|
17
|
+
description: '96 cloud tools (sandboxes, distributed swarms, templates)',
|
|
18
|
+
toolCount: 96
|
|
19
|
+
},
|
|
20
|
+
'agentic-payments': {
|
|
21
|
+
name: 'agentic-payments',
|
|
22
|
+
command: 'npx',
|
|
23
|
+
args: ['-y', 'agentic-payments', 'mcp'],
|
|
24
|
+
description: 'Payment authorization and multi-agent consensus',
|
|
25
|
+
toolCount: 10
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
export async function handleMCPCommand(command, server = 'all') {
|
|
29
|
+
switch (command) {
|
|
30
|
+
case 'start':
|
|
31
|
+
await startMCPServers(server);
|
|
32
|
+
break;
|
|
33
|
+
case 'stop':
|
|
34
|
+
await stopMCPServers(server);
|
|
35
|
+
break;
|
|
36
|
+
case 'status':
|
|
37
|
+
await checkMCPStatus(server);
|
|
38
|
+
break;
|
|
39
|
+
case 'list':
|
|
40
|
+
await listMCPTools(server);
|
|
41
|
+
break;
|
|
42
|
+
default:
|
|
43
|
+
console.error(`❌ Unknown MCP command: ${command}`);
|
|
44
|
+
console.error('Available commands: start, stop, status, list');
|
|
45
|
+
process.exit(1);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
async function startMCPServers(server) {
|
|
49
|
+
console.log(`\n🚀 Starting MCP Server(s): ${server}\n`);
|
|
50
|
+
const serversToStart = server === 'all'
|
|
51
|
+
? Object.keys(MCP_SERVERS)
|
|
52
|
+
: [server];
|
|
53
|
+
for (const serverName of serversToStart) {
|
|
54
|
+
const config = MCP_SERVERS[serverName];
|
|
55
|
+
if (!config) {
|
|
56
|
+
console.error(`❌ Unknown server: ${serverName}`);
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
console.log(`📦 ${config.name}`);
|
|
60
|
+
console.log(` ${config.description}`);
|
|
61
|
+
console.log(` Command: ${config.command} ${config.args.join(' ')}`);
|
|
62
|
+
console.log(` Status: Starting as subprocess...\n`);
|
|
63
|
+
// Start server in background
|
|
64
|
+
const child = spawn(config.command, config.args, {
|
|
65
|
+
detached: true,
|
|
66
|
+
stdio: 'inherit',
|
|
67
|
+
env: {
|
|
68
|
+
...process.env,
|
|
69
|
+
MCP_AUTO_START: 'true'
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
child.unref(); // Allow parent to exit independently
|
|
73
|
+
}
|
|
74
|
+
console.log(`\n✅ MCP server(s) started in background`);
|
|
75
|
+
console.log(`💡 Tip: Use 'npx agentic-flow mcp status' to check server status\n`);
|
|
76
|
+
}
|
|
77
|
+
async function stopMCPServers(server) {
|
|
78
|
+
console.log(`\n🛑 Stopping MCP Server(s): ${server}\n`);
|
|
79
|
+
const serversToStop = server === 'all'
|
|
80
|
+
? Object.keys(MCP_SERVERS)
|
|
81
|
+
: [server];
|
|
82
|
+
for (const serverName of serversToStop) {
|
|
83
|
+
const config = MCP_SERVERS[serverName];
|
|
84
|
+
if (!config) {
|
|
85
|
+
console.error(`❌ Unknown server: ${serverName}`);
|
|
86
|
+
continue;
|
|
87
|
+
}
|
|
88
|
+
try {
|
|
89
|
+
// Try to kill processes by name
|
|
90
|
+
const killCommand = process.platform === 'win32'
|
|
91
|
+
? `taskkill /F /IM node.exe /FI "WINDOWTITLE eq ${serverName}*"`
|
|
92
|
+
: `pkill -f "${serverName}"`;
|
|
93
|
+
await execAsync(killCommand);
|
|
94
|
+
console.log(`✅ Stopped ${config.name}`);
|
|
95
|
+
}
|
|
96
|
+
catch (error) {
|
|
97
|
+
if (error.code === 1) {
|
|
98
|
+
console.log(`⚠️ ${config.name} not running`);
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
console.error(`❌ Error stopping ${config.name}:`, error.message);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
console.log();
|
|
106
|
+
}
|
|
107
|
+
async function checkMCPStatus(server) {
|
|
108
|
+
console.log(`\n📊 MCP Server Status: ${server}\n`);
|
|
109
|
+
const serversToCheck = server === 'all'
|
|
110
|
+
? Object.keys(MCP_SERVERS)
|
|
111
|
+
: [server];
|
|
112
|
+
for (const serverName of serversToCheck) {
|
|
113
|
+
const config = MCP_SERVERS[serverName];
|
|
114
|
+
if (!config) {
|
|
115
|
+
console.error(`❌ Unknown server: ${serverName}`);
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
console.log(`📦 ${config.name}`);
|
|
119
|
+
console.log(` Description: ${config.description}`);
|
|
120
|
+
console.log(` Tool Count: ${config.toolCount}`);
|
|
121
|
+
try {
|
|
122
|
+
// Check if process is running
|
|
123
|
+
const checkCommand = process.platform === 'win32'
|
|
124
|
+
? `tasklist /FI "IMAGENAME eq node.exe" /FO CSV | findstr /C:"${serverName}"`
|
|
125
|
+
: `pgrep -f "${serverName}"`;
|
|
126
|
+
const { stdout } = await execAsync(checkCommand);
|
|
127
|
+
const isRunning = stdout.trim().length > 0;
|
|
128
|
+
console.log(` Status: ${isRunning ? '✅ Running' : '⚠️ Not running'}`);
|
|
129
|
+
}
|
|
130
|
+
catch (error) {
|
|
131
|
+
console.log(` Status: ⚠️ Not running`);
|
|
132
|
+
}
|
|
133
|
+
console.log();
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
async function listMCPTools(server) {
|
|
137
|
+
console.log(`\n📋 MCP Tools Available\n`);
|
|
138
|
+
const serversToList = server === 'all'
|
|
139
|
+
? Object.keys(MCP_SERVERS)
|
|
140
|
+
: [server];
|
|
141
|
+
let totalTools = 0;
|
|
142
|
+
for (const serverName of serversToList) {
|
|
143
|
+
const config = MCP_SERVERS[serverName];
|
|
144
|
+
if (!config) {
|
|
145
|
+
console.error(`❌ Unknown server: ${serverName}`);
|
|
146
|
+
continue;
|
|
147
|
+
}
|
|
148
|
+
console.log(`\n📦 ${config.name.toUpperCase()} (${config.toolCount} tools)`);
|
|
149
|
+
console.log(` ${config.description}`);
|
|
150
|
+
console.log();
|
|
151
|
+
totalTools += config.toolCount;
|
|
152
|
+
// Show example tools based on server
|
|
153
|
+
const examples = getExampleTools(serverName);
|
|
154
|
+
examples.forEach(tool => {
|
|
155
|
+
console.log(` • ${tool}`);
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
// Add in-SDK tools
|
|
159
|
+
console.log(`\n📦 CLAUDE-FLOW-SDK (6 in-process tools)`);
|
|
160
|
+
console.log(` Fast, zero-latency tools running in-process`);
|
|
161
|
+
console.log();
|
|
162
|
+
console.log(` • memory_store - Store values in persistent memory`);
|
|
163
|
+
console.log(` • memory_retrieve - Retrieve values from memory`);
|
|
164
|
+
console.log(` • memory_list - List all memory keys`);
|
|
165
|
+
console.log(` • swarm_init - Initialize agent swarms`);
|
|
166
|
+
console.log(` • agent_spawn - Spawn specialized agents`);
|
|
167
|
+
console.log(` • coordination_sync - Synchronize agent coordination`);
|
|
168
|
+
totalTools += 6;
|
|
169
|
+
console.log(`\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━`);
|
|
170
|
+
console.log(`📊 TOTAL: ${totalTools} MCP tools available`);
|
|
171
|
+
console.log(`━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n`);
|
|
172
|
+
console.log(`💡 Usage: Tools are automatically available to agents`);
|
|
173
|
+
console.log(` npx agentic-flow --agent coder --task "Your task"\n`);
|
|
174
|
+
}
|
|
175
|
+
function getExampleTools(serverName) {
|
|
176
|
+
switch (serverName) {
|
|
177
|
+
case 'claude-flow':
|
|
178
|
+
return [
|
|
179
|
+
'swarm_init - Initialize multi-agent swarms',
|
|
180
|
+
'agent_spawn - Create specialized AI agents',
|
|
181
|
+
'task_orchestrate - Orchestrate complex tasks',
|
|
182
|
+
'neural_train - Train neural networks with WASM',
|
|
183
|
+
'github_repo_analyze - Analyze GitHub repositories',
|
|
184
|
+
'workflow_create - Create automated workflows',
|
|
185
|
+
'daa_agent_create - Create autonomous agents',
|
|
186
|
+
'performance_report - Generate performance metrics',
|
|
187
|
+
'... and 93 more tools'
|
|
188
|
+
];
|
|
189
|
+
case 'flow-nexus':
|
|
190
|
+
return [
|
|
191
|
+
'sandbox_create - Create isolated E2B sandboxes',
|
|
192
|
+
'sandbox_execute - Execute code in sandboxes',
|
|
193
|
+
'swarm_init - Initialize cloud-based swarms',
|
|
194
|
+
'neural_train - Distributed neural training',
|
|
195
|
+
'workflow_create - Event-driven workflows',
|
|
196
|
+
'template_deploy - Deploy project templates',
|
|
197
|
+
'user_login - Authenticate Flow Nexus users',
|
|
198
|
+
'storage_upload - Cloud file storage',
|
|
199
|
+
'... and 88 more tools'
|
|
200
|
+
];
|
|
201
|
+
case 'agentic-payments':
|
|
202
|
+
return [
|
|
203
|
+
'create_active_mandate - Create payment authorization',
|
|
204
|
+
'sign_mandate - Sign with Ed25519 cryptography',
|
|
205
|
+
'verify_mandate - Verify payment signatures',
|
|
206
|
+
'revoke_mandate - Revoke authorizations',
|
|
207
|
+
'verify_consensus - Multi-agent consensus',
|
|
208
|
+
'generate_agent_identity - Create agent identities',
|
|
209
|
+
'... and 4 more tools'
|
|
210
|
+
];
|
|
211
|
+
default:
|
|
212
|
+
return [];
|
|
213
|
+
}
|
|
214
|
+
}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Automatic Model Downloader for ONNX Phi-4
|
|
3
|
+
*
|
|
4
|
+
* Downloads Phi-4 ONNX model from HuggingFace on first use
|
|
5
|
+
*/
|
|
6
|
+
import { createWriteStream, existsSync, mkdirSync } from 'fs';
|
|
7
|
+
import { dirname } from 'path';
|
|
8
|
+
import { createHash } from 'crypto';
|
|
9
|
+
import { readFileSync } from 'fs';
|
|
10
|
+
export class ModelDownloader {
|
|
11
|
+
baseUrl = 'https://huggingface.co';
|
|
12
|
+
/**
|
|
13
|
+
* Phi-4 Mini ONNX INT4 quantized model (CPU optimized)
|
|
14
|
+
* Size: ~52MB model + ~4.86GB data = ~4.9GB total
|
|
15
|
+
* Note: Requires TWO files - model.onnx and model.onnx.data
|
|
16
|
+
*/
|
|
17
|
+
phi4Model = {
|
|
18
|
+
repo: 'microsoft/Phi-4-mini-instruct-onnx',
|
|
19
|
+
filename: 'cpu_and_mobile/cpu-int4-rtn-block-32-acc-level-4/model.onnx',
|
|
20
|
+
localPath: './models/phi-4-mini/cpu_and_mobile/cpu-int4-rtn-block-32-acc-level-4/model.onnx'
|
|
21
|
+
};
|
|
22
|
+
phi4ModelData = {
|
|
23
|
+
repo: 'microsoft/Phi-4-mini-instruct-onnx',
|
|
24
|
+
filename: 'cpu_and_mobile/cpu-int4-rtn-block-32-acc-level-4/model.onnx.data',
|
|
25
|
+
localPath: './models/phi-4-mini/cpu_and_mobile/cpu-int4-rtn-block-32-acc-level-4/model.onnx.data'
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Check if model exists locally
|
|
29
|
+
*/
|
|
30
|
+
isModelDownloaded(modelPath) {
|
|
31
|
+
const path = modelPath || this.phi4Model.localPath;
|
|
32
|
+
return existsSync(path);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Get model download URL
|
|
36
|
+
*/
|
|
37
|
+
getDownloadUrl(model) {
|
|
38
|
+
return `${this.baseUrl}/${model.repo}/resolve/main/${model.filename}`;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Download model with progress tracking
|
|
42
|
+
*/
|
|
43
|
+
async downloadModel(modelInfo, onProgress) {
|
|
44
|
+
const model = modelInfo || this.phi4Model;
|
|
45
|
+
// Check if already downloaded
|
|
46
|
+
if (this.isModelDownloaded(model.localPath)) {
|
|
47
|
+
console.log(`✅ Model already exists at ${model.localPath}`);
|
|
48
|
+
return model.localPath;
|
|
49
|
+
}
|
|
50
|
+
// Create directory
|
|
51
|
+
const dir = dirname(model.localPath);
|
|
52
|
+
if (!existsSync(dir)) {
|
|
53
|
+
mkdirSync(dir, { recursive: true });
|
|
54
|
+
}
|
|
55
|
+
const url = this.getDownloadUrl(model);
|
|
56
|
+
console.log(`📦 Downloading Phi-4 ONNX model from HuggingFace...`);
|
|
57
|
+
console.log(` URL: ${url}`);
|
|
58
|
+
console.log(` Destination: ${model.localPath}`);
|
|
59
|
+
try {
|
|
60
|
+
const response = await fetch(url);
|
|
61
|
+
if (!response.ok) {
|
|
62
|
+
throw new Error(`Download failed: ${response.statusText}`);
|
|
63
|
+
}
|
|
64
|
+
const totalSize = parseInt(response.headers.get('content-length') || '0', 10);
|
|
65
|
+
let downloadedSize = 0;
|
|
66
|
+
if (!response.body) {
|
|
67
|
+
throw new Error('Response body is null');
|
|
68
|
+
}
|
|
69
|
+
const fileStream = createWriteStream(model.localPath);
|
|
70
|
+
// Track progress
|
|
71
|
+
const reader = response.body.getReader();
|
|
72
|
+
const chunks = [];
|
|
73
|
+
while (true) {
|
|
74
|
+
const { done, value } = await reader.read();
|
|
75
|
+
if (done)
|
|
76
|
+
break;
|
|
77
|
+
if (value) {
|
|
78
|
+
chunks.push(value);
|
|
79
|
+
downloadedSize += value.length;
|
|
80
|
+
if (onProgress && totalSize > 0) {
|
|
81
|
+
onProgress({
|
|
82
|
+
downloaded: downloadedSize,
|
|
83
|
+
total: totalSize,
|
|
84
|
+
percentage: (downloadedSize / totalSize) * 100
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
// Write chunk
|
|
88
|
+
fileStream.write(value);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
fileStream.end();
|
|
92
|
+
// Wait for file stream to finish
|
|
93
|
+
await new Promise((resolve, reject) => {
|
|
94
|
+
fileStream.on('finish', () => resolve());
|
|
95
|
+
fileStream.on('error', reject);
|
|
96
|
+
});
|
|
97
|
+
console.log(`✅ Model downloaded successfully`);
|
|
98
|
+
console.log(` Size: ${(downloadedSize / (1024 * 1024)).toFixed(2)} MB`);
|
|
99
|
+
console.log(` Path: ${model.localPath}`);
|
|
100
|
+
return model.localPath;
|
|
101
|
+
}
|
|
102
|
+
catch (error) {
|
|
103
|
+
console.error(`❌ Model download failed:`, error);
|
|
104
|
+
throw new Error(`Failed to download model: ${error}`);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Download Phi-4 ONNX model if needed (downloads BOTH .onnx and .onnx.data files)
|
|
109
|
+
*/
|
|
110
|
+
async ensurePhi4Model(onProgress) {
|
|
111
|
+
const mainFileExists = this.isModelDownloaded(this.phi4Model.localPath);
|
|
112
|
+
const dataFileExists = this.isModelDownloaded(this.phi4ModelData.localPath);
|
|
113
|
+
if (mainFileExists && dataFileExists) {
|
|
114
|
+
return this.phi4Model.localPath;
|
|
115
|
+
}
|
|
116
|
+
console.log(`🔍 Phi-4-mini ONNX model not found locally`);
|
|
117
|
+
console.log(`📥 Starting automatic download...`);
|
|
118
|
+
console.log(` This is a one-time download (~4.9GB total)`);
|
|
119
|
+
console.log(` Model: microsoft/Phi-4-mini-instruct-onnx (INT4 quantized)`);
|
|
120
|
+
console.log(` Files: model.onnx (~52MB) + model.onnx.data (~4.86GB)`);
|
|
121
|
+
console.log(``);
|
|
122
|
+
// Download main model file if missing
|
|
123
|
+
if (!mainFileExists) {
|
|
124
|
+
console.log(`📦 Downloading model.onnx...`);
|
|
125
|
+
await this.downloadModel(this.phi4Model, onProgress);
|
|
126
|
+
console.log(``);
|
|
127
|
+
}
|
|
128
|
+
// Download data file if missing
|
|
129
|
+
if (!dataFileExists) {
|
|
130
|
+
console.log(`📦 Downloading model.onnx.data (this is the large 4.86GB file)...`);
|
|
131
|
+
await this.downloadModel(this.phi4ModelData, onProgress);
|
|
132
|
+
}
|
|
133
|
+
return this.phi4Model.localPath;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Verify model file integrity (optional)
|
|
137
|
+
*/
|
|
138
|
+
async verifyModel(modelPath, expectedSha256) {
|
|
139
|
+
if (!expectedSha256) {
|
|
140
|
+
return true; // Skip verification if no hash provided
|
|
141
|
+
}
|
|
142
|
+
try {
|
|
143
|
+
const fileBuffer = readFileSync(modelPath);
|
|
144
|
+
const hash = createHash('sha256').update(fileBuffer).digest('hex');
|
|
145
|
+
if (hash !== expectedSha256) {
|
|
146
|
+
console.error(`❌ Model verification failed`);
|
|
147
|
+
console.error(` Expected: ${expectedSha256}`);
|
|
148
|
+
console.error(` Got: ${hash}`);
|
|
149
|
+
return false;
|
|
150
|
+
}
|
|
151
|
+
console.log(`✅ Model verification passed`);
|
|
152
|
+
return true;
|
|
153
|
+
}
|
|
154
|
+
catch (error) {
|
|
155
|
+
console.error(`❌ Model verification error:`, error);
|
|
156
|
+
return false;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Get model info
|
|
161
|
+
*/
|
|
162
|
+
getModelInfo() {
|
|
163
|
+
return this.phi4Model;
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Format download progress for display
|
|
167
|
+
*/
|
|
168
|
+
static formatProgress(progress) {
|
|
169
|
+
const mb = (bytes) => (bytes / (1024 * 1024)).toFixed(2);
|
|
170
|
+
return `${progress.percentage.toFixed(1)}% (${mb(progress.downloaded)}/${mb(progress.total)} MB)`;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Global singleton instance
|
|
175
|
+
*/
|
|
176
|
+
export const modelDownloader = new ModelDownloader();
|
|
177
|
+
/**
|
|
178
|
+
* Convenience function for downloading Phi-4 model
|
|
179
|
+
*/
|
|
180
|
+
export async function ensurePhi4Model(onProgress) {
|
|
181
|
+
return modelDownloader.ensurePhi4Model(onProgress);
|
|
182
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
// Retry utility with exponential backoff
|
|
2
|
+
import { logger } from './logger.js';
|
|
3
|
+
const defaultOptions = {
|
|
4
|
+
maxAttempts: 3,
|
|
5
|
+
baseDelay: 1000,
|
|
6
|
+
maxDelay: 10000,
|
|
7
|
+
shouldRetry: (error) => {
|
|
8
|
+
// Retry on network errors, rate limits, and server errors
|
|
9
|
+
if (error?.status >= 500)
|
|
10
|
+
return true;
|
|
11
|
+
if (error?.status === 429)
|
|
12
|
+
return true;
|
|
13
|
+
if (error?.code === 'ECONNRESET')
|
|
14
|
+
return true;
|
|
15
|
+
if (error?.code === 'ETIMEDOUT')
|
|
16
|
+
return true;
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
export async function withRetry(fn, options = {}) {
|
|
21
|
+
const opts = { ...defaultOptions, ...options };
|
|
22
|
+
let lastError;
|
|
23
|
+
for (let attempt = 1; attempt <= opts.maxAttempts; attempt++) {
|
|
24
|
+
try {
|
|
25
|
+
logger.debug('Attempting operation', { attempt, maxAttempts: opts.maxAttempts });
|
|
26
|
+
return await fn();
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
lastError = error;
|
|
30
|
+
if (attempt >= opts.maxAttempts) {
|
|
31
|
+
logger.error('Max retry attempts reached', {
|
|
32
|
+
attempt,
|
|
33
|
+
maxAttempts: opts.maxAttempts,
|
|
34
|
+
error
|
|
35
|
+
});
|
|
36
|
+
throw error;
|
|
37
|
+
}
|
|
38
|
+
if (!opts.shouldRetry(error)) {
|
|
39
|
+
logger.warn('Error not retryable', { error });
|
|
40
|
+
throw error;
|
|
41
|
+
}
|
|
42
|
+
// Calculate backoff delay with jitter
|
|
43
|
+
const delay = Math.min(opts.baseDelay * Math.pow(2, attempt - 1) + Math.random() * 1000, opts.maxDelay);
|
|
44
|
+
logger.warn('Operation failed, retrying', {
|
|
45
|
+
attempt,
|
|
46
|
+
nextAttempt: attempt + 1,
|
|
47
|
+
delayMs: Math.round(delay),
|
|
48
|
+
error
|
|
49
|
+
});
|
|
50
|
+
await new Promise(resolve => setTimeout(resolve, delay));
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
throw lastError;
|
|
54
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{}
|