agentic-flow 3.0.0 → 3.1.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.
Files changed (58) hide show
  1. package/.claude/skills/agentic-flow-quickstart/skill.md +6 -6
  2. package/.claude/skills/hooks-automation/skill.md +11 -11
  3. package/.claude/skills/memory-patterns/skill.md +7 -7
  4. package/.claude/skills/sparc-methodology/skill.md +13 -13
  5. package/.claude/skills/swarm-coordination/skill.md +5 -5
  6. package/.claude/skills/worker-benchmarks/skill.md +5 -5
  7. package/.claude/skills/worker-integration/skill.md +5 -5
  8. package/.claude/statusline.mjs +22 -5
  9. package/CHANGELOG.md +23 -0
  10. package/README.md +68 -71
  11. package/dist/.tsbuildinfo +1 -1
  12. package/dist/cli/commands/hooks.d.ts.map +1 -1
  13. package/dist/cli/commands/hooks.js +17 -17
  14. package/dist/cli/commands/hooks.js.map +1 -1
  15. package/dist/cli/commands/init.d.ts +2 -5
  16. package/dist/cli/commands/init.d.ts.map +1 -1
  17. package/dist/cli/commands/init.js +2 -15
  18. package/dist/cli/commands/init.js.map +1 -1
  19. package/dist/cli/commands/swarm.d.ts.map +1 -1
  20. package/dist/cli/commands/swarm.js +3 -2
  21. package/dist/cli/commands/swarm.js.map +1 -1
  22. package/dist/proxy/anthropic-to-gemini.d.ts.map +1 -1
  23. package/dist/proxy/anthropic-to-gemini.js +10 -14
  24. package/dist/proxy/anthropic-to-gemini.js.map +1 -1
  25. package/dist/proxy/anthropic-to-openrouter.d.ts.map +1 -1
  26. package/dist/proxy/anthropic-to-openrouter.js +6 -25
  27. package/dist/proxy/anthropic-to-openrouter.js.map +1 -1
  28. package/dist/proxy/anthropic-to-requesty.d.ts.map +1 -1
  29. package/dist/proxy/anthropic-to-requesty.js +8 -10
  30. package/dist/proxy/anthropic-to-requesty.js.map +1 -1
  31. package/dist/proxy/sse-lines.d.ts +9 -0
  32. package/dist/proxy/sse-lines.d.ts.map +1 -0
  33. package/dist/proxy/sse-lines.js +37 -0
  34. package/dist/proxy/sse-lines.js.map +1 -0
  35. package/dist/reasoningbank/index.d.ts +2 -1
  36. package/dist/reasoningbank/index.d.ts.map +1 -1
  37. package/dist/reasoningbank/index.js +1 -1
  38. package/dist/reasoningbank/index.js.map +1 -1
  39. package/dist/reasoningbank/utils/embeddings.d.ts +17 -0
  40. package/dist/reasoningbank/utils/embeddings.d.ts.map +1 -1
  41. package/dist/reasoningbank/utils/embeddings.js +48 -17
  42. package/dist/reasoningbank/utils/embeddings.js.map +1 -1
  43. package/dist/utils/package-version.d.ts +9 -0
  44. package/dist/utils/package-version.d.ts.map +1 -0
  45. package/dist/utils/package-version.js +39 -0
  46. package/dist/utils/package-version.js.map +1 -0
  47. package/docs/docker-tests/TEST-V1.7.8.Dockerfile +2 -2
  48. package/docs/docker-tests/TEST-V1.7.9-NODE20.Dockerfile +2 -2
  49. package/docs/docker-tests/TEST-V1.7.9.Dockerfile +2 -2
  50. package/docs/guides/CLAUDE-CODE-INTEGRATION.md +25 -8
  51. package/docs/guides/PROXY-ARCHITECTURE-AND-EXTENSION.md +22 -9
  52. package/docs/guides/STANDALONE_PROXY_GUIDE.md +16 -6
  53. package/docs/integrations/FASTMCP_CLI_INTEGRATION.md +1 -1
  54. package/docs/plans/requesty/02-architecture.md +5 -6
  55. package/docs/plans/requesty/03-implementation-phases.md +3 -4
  56. package/docs/plans/requesty/05-migration-guide.md +2 -2
  57. package/package.json +1 -1
  58. package/scripts/validate-providers.sh +7 -4
@@ -1 +1 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"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","sourcesContent":["#!/usr/bin/env node\n/**\n * CLI Init Command\n * Creates .claude/ folder structure and configuration files for Claude Code integration\n * Copies all agents, commands, skills, and helpers from the package\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { fileURLToPath } from 'url';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\n/**\n * The installed package version, so generated hooks and the MCP server run\n * exactly this release instead of whatever the @alpha tag points at later.\n */\nexport function readPackageVersion(): string {\n try {\n const pkg = JSON.parse(fs.readFileSync(path.resolve(__dirname, '../../../package.json'), 'utf-8'));\n if (typeof pkg.version === 'string' && /^\\d+\\.\\d+\\.\\d+[\\w.+-]*$/.test(pkg.version)) return pkg.version;\n } catch {\n // fall through\n }\n return 'latest';\n}\n\nconst PACKAGE_SPEC = `agentic-flow@${readPackageVersion()}`;\n\nconst CLAUDE_MD_TEMPLATE = `# Claude Code Configuration - Agentic Flow\n\n## 🚨 CRITICAL: CONCURRENT EXECUTION & FILE MANAGEMENT\n\n**ABSOLUTE RULES**:\n1. ALL operations MUST be concurrent/parallel in a single message\n2. **NEVER save working files, text/mds and tests to the root folder**\n3. ALWAYS organize files in appropriate subdirectories\n4. **USE CLAUDE CODE'S TASK TOOL** for spawning agents concurrently, not just MCP\n\n### ⚔ GOLDEN RULE: \"1 MESSAGE = ALL RELATED OPERATIONS\"\n\n**MANDATORY PATTERNS:**\n- **TodoWrite**: ALWAYS batch ALL todos in ONE call (5-10+ todos minimum)\n- **Task tool (Claude Code)**: ALWAYS spawn ALL agents in ONE message with full instructions\n- **File operations**: ALWAYS batch ALL reads/writes/edits in ONE message\n- **Bash commands**: ALWAYS batch ALL terminal operations in ONE message\n- **Memory operations**: ALWAYS batch ALL memory store/retrieve in ONE message\n\n### šŸŽÆ CRITICAL: Claude Code Task Tool for Agent Execution\n\n**Claude Code's Task tool is the PRIMARY way to spawn agents:**\n\\`\\`\\`javascript\n// āœ… CORRECT: Use Claude Code's Task tool for parallel agent execution\n[Single Message]:\n Task(\"Research agent\", \"Analyze requirements and patterns...\", \"researcher\")\n Task(\"Coder agent\", \"Implement core features...\", \"coder\")\n Task(\"Tester agent\", \"Create comprehensive tests...\", \"tester\")\n Task(\"Reviewer agent\", \"Review code quality...\", \"reviewer\")\n Task(\"Architect agent\", \"Design system architecture...\", \"system-architect\")\n\\`\\`\\`\n\n**MCP tools are ONLY for coordination setup:**\n- \\`mcp__claude-flow__swarm_init\\` - Initialize coordination topology\n- \\`mcp__claude-flow__agent_spawn\\` - Define agent types for coordination\n- \\`mcp__claude-flow__task_orchestrate\\` - Orchestrate high-level workflows\n\n### šŸ“ File Organization Rules\n\n**NEVER save to root folder. Use these directories:**\n- \\`/src\\` - Source code files\n- \\`/tests\\` - Test files\n- \\`/docs\\` - Documentation and markdown files\n- \\`/config\\` - Configuration files\n- \\`/scripts\\` - Utility scripts\n- \\`/examples\\` - Example code\n\n## šŸš€ Quick Start\n\n\\`\\`\\`bash\n# Start MCP server for Claude Code integration\nnpx ${PACKAGE_SPEC} mcp start\n\n# Run an agent directly\nnpx ${PACKAGE_SPEC} --agent coder --task \"Your task here\"\n\n# List available agents\nnpx ${PACKAGE_SPEC} --list\n\\`\\`\\`\n\n## šŸš€ Available Agents (54 Total)\n\n### Core Development\n\\`coder\\`, \\`reviewer\\`, \\`tester\\`, \\`planner\\`, \\`researcher\\`\n\n### Swarm Coordination\n\\`hierarchical-coordinator\\`, \\`mesh-coordinator\\`, \\`adaptive-coordinator\\`, \\`collective-intelligence-coordinator\\`, \\`swarm-memory-manager\\`\n\n### Consensus & Distributed\n\\`byzantine-coordinator\\`, \\`raft-manager\\`, \\`gossip-coordinator\\`, \\`consensus-builder\\`, \\`crdt-synchronizer\\`, \\`quorum-manager\\`, \\`security-manager\\`\n\n### Performance & Optimization\n\\`perf-analyzer\\`, \\`performance-benchmarker\\`, \\`task-orchestrator\\`, \\`memory-coordinator\\`, \\`smart-agent\\`\n\n### GitHub & Repository\n\\`github-modes\\`, \\`pr-manager\\`, \\`code-review-swarm\\`, \\`issue-tracker\\`, \\`release-manager\\`, \\`workflow-automation\\`, \\`project-board-sync\\`, \\`repo-architect\\`, \\`multi-repo-swarm\\`\n\n### SPARC Methodology\n\\`sparc-coord\\`, \\`sparc-coder\\`, \\`specification\\`, \\`pseudocode\\`, \\`architecture\\`, \\`refinement\\`\n\n### Specialized Development\n\\`backend-dev\\`, \\`mobile-dev\\`, \\`ml-developer\\`, \\`cicd-engineer\\`, \\`api-docs\\`, \\`system-architect\\`, \\`code-analyzer\\`, \\`base-template-generator\\`\n\n## šŸŽÆ Claude Code vs MCP Tools\n\n### Claude Code Handles ALL EXECUTION:\n- **Task tool**: Spawn and run agents concurrently for actual work\n- File operations (Read, Write, Edit, MultiEdit, Glob, Grep)\n- Code generation and programming\n- Bash commands and system operations\n- Implementation work\n- Project navigation and analysis\n- TodoWrite and task management\n- Git operations\n- Package management\n- Testing and debugging\n\n### MCP Tools ONLY COORDINATE:\n- Swarm initialization (topology setup)\n- Agent type definitions (coordination patterns)\n- Task orchestration (high-level planning)\n- Memory management\n- Neural features\n- Performance tracking\n- GitHub integration\n\n**KEY**: MCP coordinates the strategy, Claude Code's Task tool executes with real agents.\n\n## MCP Tool Categories\n\n### Coordination\n\\`swarm_init\\`, \\`agent_spawn\\`, \\`task_orchestrate\\`\n\n### Monitoring\n\\`swarm_status\\`, \\`agent_list\\`, \\`agent_metrics\\`, \\`task_status\\`, \\`task_results\\`\n\n### Memory & Neural\n\\`memory_usage\\`, \\`neural_status\\`, \\`neural_train\\`, \\`neural_patterns\\`\n\n### GitHub Integration\n\\`github_swarm\\`, \\`repo_analyze\\`, \\`pr_enhance\\`, \\`issue_triage\\`, \\`code_review\\`\n\n## 🧠 Self-Learning Hooks System\n\n### Available Hooks Commands:\n\\`\\`\\`bash\n# Before editing - get context and agent suggestions\nnpx ${PACKAGE_SPEC} hooks pre-edit <filePath>\n\n# After editing - record outcome for learning\nnpx ${PACKAGE_SPEC} hooks post-edit <filePath> --success true\n\n# Before commands - assess risk\nnpx ${PACKAGE_SPEC} hooks pre-command \"<command>\"\n\n# After commands - record outcome\nnpx ${PACKAGE_SPEC} hooks post-command \"<command>\" --success true\n\n# Route task to optimal agent using learned patterns\nnpx ${PACKAGE_SPEC} hooks route \"<task description>\"\n\n# Explain routing decision with transparency\nnpx ${PACKAGE_SPEC} hooks explain \"<task description>\"\n\n# Bootstrap intelligence from repository\nnpx ${PACKAGE_SPEC} hooks pretrain\n\n# Generate optimized agent configs from pretrain data\nnpx ${PACKAGE_SPEC} hooks build-agents\n\n# View learning metrics dashboard\nnpx ${PACKAGE_SPEC} hooks metrics\n\n# Transfer patterns from another project\nnpx ${PACKAGE_SPEC} hooks transfer <sourceProject>\n\n# RuVector intelligence (SONA, MoE, HNSW 150x faster)\nnpx ${PACKAGE_SPEC} hooks intelligence\n\\`\\`\\`\n\n### Pretraining System (4-Step Pipeline):\n1. **RETRIEVE** - Top-k memory injection with MMR diversity\n2. **JUDGE** - LLM-as-judge trajectory evaluation\n3. **DISTILL** - Extract strategy memories from trajectories\n4. **CONSOLIDATE** - Dedup, detect contradictions, prune old patterns\n\n## Performance Benefits\n\n- **84.8% SWE-Bench solve rate**\n- **32.3% token reduction**\n- **2.8-4.4x speed improvement**\n- **27+ neural models**\n\n## Advanced Features (v2.0.0)\n\n- šŸš€ Automatic Topology Selection\n- ⚔ Parallel Execution (2.8-4.4x speed)\n- 🧠 Neural Training\n- šŸ“Š Bottleneck Analysis\n- šŸ¤– Smart Auto-Spawning\n- šŸ›”ļø Self-Healing Workflows\n- šŸ’¾ Cross-Session Memory\n- šŸ”— GitHub Integration\n\n## Code Style & Best Practices\n\n- **Modular Design**: Files under 500 lines\n- **Environment Safety**: Never hardcode secrets\n- **Test-First**: Write tests before implementation\n- **Clean Architecture**: Separate concerns\n- **Documentation**: Keep updated\n\n## Support\n\n- Documentation: https://github.com/ruvnet/agentic-flow\n- Issues: https://github.com/ruvnet/agentic-flow/issues\n\n---\n\nRemember: **Agentic Flow coordinates, Claude Code creates!**\n\n# important-instruction-reminders\nDo what has been asked; nothing more, nothing less.\nNEVER create files unless they're absolutely necessary for achieving your goal.\nALWAYS prefer editing an existing file to creating a new one.\nNEVER proactively create documentation files (*.md) or README files. Only create documentation files if explicitly requested by the User.\nNever save working files, text/mds and tests to the root folder.\n`;\n\n/**\n * settings.json written by `init`. Hooks and the MCP server are pinned to\n * `version`. Permissions do not pre-approve npx/npm or whole MCP servers:\n * those would let any package or tool run without a prompt.\n */\nexport function buildSettingsTemplate(version: string = readPackageVersion()) {\n const spec = `agentic-flow@${version}`;\n return {\n model: \"claude-sonnet-4-20250514\",\n customInstructions: \"Follow the project's CLAUDE.md guidelines. Use concurrent execution for all operations.\",\n env: {\n AGENTIC_FLOW_INTELLIGENCE: \"true\",\n AGENTIC_FLOW_LEARNING_RATE: \"0.1\",\n AGENTIC_FLOW_EPSILON: \"0.1\",\n AGENTIC_FLOW_MEMORY_BACKEND: \"agentdb\"\n },\n permissions: {\n allowedTools: [\"Read\", \"Write\", \"Edit\", \"Bash\", \"Glob\", \"Grep\", \"Task\", \"WebFetch\", \"WebSearch\", \"TodoWrite\", \"LSP\", \"NotebookEdit\"],\n deniedTools: [],\n allow: [\n \"Bash(agentic-flow:*)\"\n ]\n },\n hooks: {\n PreToolUse: [\n {\n matcher: \"Edit|Write|MultiEdit\",\n hooks: [{ type: \"command\", command: `npx ${spec} hooks pre-edit \"$TOOL_INPUT_file_path\"` }]\n },\n {\n matcher: \"Bash\",\n hooks: [{ type: \"command\", command: `npx ${spec} hooks pre-command \"$TOOL_INPUT_command\"` }]\n }\n ],\n PostToolUse: [\n {\n matcher: \"Edit|Write|MultiEdit\",\n hooks: [{ type: \"command\", command: `npx ${spec} hooks post-edit \"$TOOL_INPUT_file_path\" --success` }]\n },\n {\n matcher: \"Bash\",\n hooks: [{ type: \"command\", command: `npx ${spec} hooks post-command \"$TOOL_INPUT_command\"` }]\n }\n ],\n PostToolUseFailure: [\n {\n matcher: \"Edit|Write|MultiEdit\",\n hooks: [{ type: \"command\", command: `npx ${spec} hooks post-edit \"$TOOL_INPUT_file_path\" --fail --error \"$ERROR_MESSAGE\"` }]\n }\n ],\n SessionStart: [\n {\n hooks: [{ type: \"command\", command: `npx ${spec} hooks intelligence stats --json 2>/dev/null || true` }]\n }\n ],\n SessionEnd: [\n {\n hooks: [{ type: \"command\", command: `npx ${spec} hooks metrics --session --json 2>/dev/null || true` }]\n }\n ],\n UserPromptSubmit: [\n {\n hooks: [\n { type: \"command\", timeout: 3000, command: `npx ${spec} hooks route \"$USER_PROMPT\" --json 2>/dev/null || true` }\n ]\n }\n ],\n Stop: [\n {\n matcher: \".*\",\n hooks: [{ type: \"command\", command: `npx ${spec} hooks metrics --session 2>/dev/null || true` }]\n }\n ]\n },\n agents: {\n source: \".claude/agents\",\n customAgents: []\n },\n skills: {\n source: \".claude/commands\",\n enabled: true\n },\n statusLine: {\n type: \"command\",\n command: \".claude/statusline.sh\"\n },\n mcpServers: {\n \"agentic-flow\": {\n command: \"npx\",\n args: [spec, \"mcp\", \"start\"]\n }\n }\n };\n}\n\ninterface InitOptions {\n force?: boolean;\n minimal?: boolean;\n verbose?: boolean;\n}\n\n/**\n * Recursively copy a directory\n */\nfunction copyDirRecursive(src: string, dest: string, verbose: boolean = false): number {\n let fileCount = 0;\n\n if (!fs.existsSync(src)) {\n return fileCount;\n }\n\n if (!fs.existsSync(dest)) {\n fs.mkdirSync(dest, { recursive: true });\n }\n\n const entries = fs.readdirSync(src, { withFileTypes: true });\n\n for (const entry of entries) {\n const srcPath = path.join(src, entry.name);\n const destPath = path.join(dest, entry.name);\n\n if (entry.isDirectory()) {\n fileCount += copyDirRecursive(srcPath, destPath, verbose);\n } else {\n fs.copyFileSync(srcPath, destPath);\n fileCount++;\n if (verbose) {\n console.log(` šŸ“„ ${path.relative(dest, destPath)}`);\n }\n }\n }\n\n return fileCount;\n}\n\n/**\n * Find the package's .claude directory\n */\nfunction findPackageClaudeDir(): string | null {\n // Try multiple potential locations\n const potentialPaths = [\n // When running from dist/\n path.resolve(__dirname, '..', '..', '..', '.claude'),\n // When running from src/\n path.resolve(__dirname, '..', '..', '.claude'),\n // When installed as package\n path.resolve(__dirname, '..', '.claude'),\n // Fallback to package root\n path.resolve(process.cwd(), 'node_modules', 'agentic-flow', '.claude'),\n ];\n\n for (const p of potentialPaths) {\n if (fs.existsSync(p) && fs.statSync(p).isDirectory()) {\n return p;\n }\n }\n\n return null;\n}\n\nexport async function handleInitCommand(args: string[]): Promise<void> {\n const options: InitOptions = {\n force: args.includes('--force') || args.includes('-f'),\n minimal: args.includes('--minimal') || args.includes('-m'),\n verbose: args.includes('--verbose') || args.includes('-v')\n };\n\n if (args.includes('--help') || args.includes('-h')) {\n printInitHelp();\n return;\n }\n\n const cwd = process.cwd();\n const claudeDir = path.join(cwd, '.claude');\n const claudeMdFile = path.join(cwd, 'CLAUDE.md');\n\n console.log(`\n╔═══════════════════════════════════════════════════════╗\nā•‘ Agentic Flow - Project Initialization ā•‘\nā•šā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•\n`);\n\n // Check if already initialized\n if (fs.existsSync(claudeDir) && !options.force) {\n console.log('āš ļø .claude/ directory already exists.');\n console.log(' Use --force to overwrite existing configuration.\\n');\n return;\n }\n\n try {\n // Find the package's .claude directory\n const packageClaudeDir = findPackageClaudeDir();\n\n if (packageClaudeDir && !options.minimal) {\n console.log('šŸ“¦ Copying full .claude/ structure from agentic-flow package...\\n');\n\n // Copy entire .claude directory structure\n const directories = ['agents', 'commands', 'skills', 'helpers'];\n let totalFiles = 0;\n\n for (const dir of directories) {\n const srcDir = path.join(packageClaudeDir, dir);\n const destDir = path.join(claudeDir, dir);\n\n if (fs.existsSync(srcDir)) {\n const count = copyDirRecursive(srcDir, destDir, options.verbose);\n totalFiles += count;\n console.log(`āœ… Copied .claude/${dir}/ (${count} files)`);\n }\n }\n\n // Copy individual files (settings.json is generated fresh with our template).\n // mcp.json is not copied: the packaged one pointed at a developer-machine\n // path (/workspaces/flow-cloud/...), so every initialized project got a\n // flow-nexus MCP server entry that could not start.\n const individualFiles = ['statusline.sh'];\n for (const file of individualFiles) {\n const srcFile = path.join(packageClaudeDir, file);\n const destFile = path.join(claudeDir, file);\n if (fs.existsSync(srcFile)) {\n fs.copyFileSync(srcFile, destFile);\n console.log(`āœ… Copied .claude/${file}`);\n totalFiles++;\n }\n }\n\n console.log(`\\nšŸ“Š Total: ${totalFiles} files copied`);\n } else {\n // Minimal mode: create basic structure\n console.log('šŸ“¦ Creating minimal .claude/ structure...\\n');\n\n if (!fs.existsSync(claudeDir)) {\n fs.mkdirSync(claudeDir, { recursive: true });\n }\n\n const dirs = ['agents', 'commands', 'skills', 'helpers'];\n for (const dir of dirs) {\n const dirPath = path.join(claudeDir, dir);\n if (!fs.existsSync(dirPath)) {\n fs.mkdirSync(dirPath, { recursive: true });\n console.log(`āœ… Created .claude/${dir}/`);\n }\n }\n }\n\n // Always generate fresh settings.json with our template\n const settingsFile = path.join(claudeDir, 'settings.json');\n if (!fs.existsSync(settingsFile) || options.force) {\n fs.writeFileSync(settingsFile, JSON.stringify(buildSettingsTemplate(), null, 2));\n console.log('āœ… Created .claude/settings.json (with hooks, agents, skills, statusline)');\n }\n\n // Create CLAUDE.md in project root (unless minimal mode)\n if (!options.minimal) {\n if (!fs.existsSync(claudeMdFile) || options.force) {\n fs.writeFileSync(claudeMdFile, CLAUDE_MD_TEMPLATE);\n console.log('āœ… Created CLAUDE.md');\n } else {\n console.log('ā„¹ļø CLAUDE.md already exists (skipped)');\n }\n }\n\n console.log(`\n╔═══════════════════════════════════════════════════════╗\nā•‘ Initialization Complete! ā•‘\nā•šā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•\n\nšŸ“ Created structure:\n .claude/\n ā”œā”€ā”€ settings.json # Claude Code settings (hooks, agents, skills, statusline)\n ā”œā”€ā”€ statusline.sh # Custom statusline (model, tokens, cost, swarm status)\n ā”œā”€ā”€ agents/ # 80+ agent definitions (coder, tester, reviewer, etc.)\n ā”œā”€ā”€ commands/ # 100+ slash commands (swarm, github, sparc, etc.)\n ā”œā”€ā”€ skills/ # Custom skills and workflows\n └── helpers/ # Helper utilities\n CLAUDE.md # Project instructions\n\nšŸš€ Next steps:\n 1. Start the MCP server:\n npx ${PACKAGE_SPEC} mcp start\n\n 2. Run Claude Code:\n claude\n\n 3. Or run agents directly:\n npx ${PACKAGE_SPEC} --agent coder --task \"Your task\"\n\nšŸ“– Documentation:\n https://github.com/ruvnet/agentic-flow\n`);\n\n } catch (error) {\n console.error('āŒ Initialization failed:', error);\n process.exit(1);\n }\n}\n\nfunction printInitHelp(): void {\n console.log(`\nAgentic Flow - Project Initialization\n\nUSAGE:\n npx ${PACKAGE_SPEC} init [OPTIONS]\n\nOPTIONS:\n --force, -f Overwrite existing configuration\n --minimal, -m Create minimal setup (empty directories only)\n --verbose, -v Show detailed file copy output\n --help, -h Show this help\n\nEXAMPLES:\n npx ${PACKAGE_SPEC} init # Initialize with full agent/command library\n npx ${PACKAGE_SPEC} init --force # Reinitialize (overwrite existing)\n npx ${PACKAGE_SPEC} init --minimal # Minimal setup (empty directories)\n npx ${PACKAGE_SPEC} init --verbose # Show all files being copied\n\nCREATED FILES:\n .claude/ Claude Code configuration directory\n .claude/settings.json Settings with hooks, agents, skills, statusline, MCP servers\n .claude/agents/ 80+ agent definitions (coder, tester, reviewer, sparc, etc.)\n .claude/commands/ 100+ slash commands (swarm, github, sparc, etc.)\n .claude/skills/ Custom skills and workflows\n .claude/helpers/ Helper utilities\n CLAUDE.md Project instructions for Claude\n`);\n}\n\n// Run if executed directly\nif (process.argv[1]?.endsWith('init.js') || process.argv[1]?.endsWith('init.ts')) {\n const args = process.argv.slice(2);\n handleInitCommand(args);\n}\n"]}
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"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","sourcesContent":["#!/usr/bin/env node\n/**\n * CLI Init Command\n * Creates .claude/ folder structure and configuration files for Claude Code integration\n * Copies all agents, commands, skills, and helpers from the package\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { fileURLToPath } from 'url';\nimport { readPackageVersion } from '../../utils/package-version.js';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\nexport { readPackageVersion };\n\nconst PACKAGE_SPEC = `agentic-flow@${readPackageVersion()}`;\n\nconst CLAUDE_MD_TEMPLATE = `# Claude Code Configuration - Agentic Flow\n\n## 🚨 CRITICAL: CONCURRENT EXECUTION & FILE MANAGEMENT\n\n**ABSOLUTE RULES**:\n1. ALL operations MUST be concurrent/parallel in a single message\n2. **NEVER save working files, text/mds and tests to the root folder**\n3. ALWAYS organize files in appropriate subdirectories\n4. **USE CLAUDE CODE'S TASK TOOL** for spawning agents concurrently, not just MCP\n\n### ⚔ GOLDEN RULE: \"1 MESSAGE = ALL RELATED OPERATIONS\"\n\n**MANDATORY PATTERNS:**\n- **TodoWrite**: ALWAYS batch ALL todos in ONE call (5-10+ todos minimum)\n- **Task tool (Claude Code)**: ALWAYS spawn ALL agents in ONE message with full instructions\n- **File operations**: ALWAYS batch ALL reads/writes/edits in ONE message\n- **Bash commands**: ALWAYS batch ALL terminal operations in ONE message\n- **Memory operations**: ALWAYS batch ALL memory store/retrieve in ONE message\n\n### šŸŽÆ CRITICAL: Claude Code Task Tool for Agent Execution\n\n**Claude Code's Task tool is the PRIMARY way to spawn agents:**\n\\`\\`\\`javascript\n// āœ… CORRECT: Use Claude Code's Task tool for parallel agent execution\n[Single Message]:\n Task(\"Research agent\", \"Analyze requirements and patterns...\", \"researcher\")\n Task(\"Coder agent\", \"Implement core features...\", \"coder\")\n Task(\"Tester agent\", \"Create comprehensive tests...\", \"tester\")\n Task(\"Reviewer agent\", \"Review code quality...\", \"reviewer\")\n Task(\"Architect agent\", \"Design system architecture...\", \"system-architect\")\n\\`\\`\\`\n\n**MCP tools are ONLY for coordination setup:**\n- \\`mcp__claude-flow__swarm_init\\` - Initialize coordination topology\n- \\`mcp__claude-flow__agent_spawn\\` - Define agent types for coordination\n- \\`mcp__claude-flow__task_orchestrate\\` - Orchestrate high-level workflows\n\n### šŸ“ File Organization Rules\n\n**NEVER save to root folder. Use these directories:**\n- \\`/src\\` - Source code files\n- \\`/tests\\` - Test files\n- \\`/docs\\` - Documentation and markdown files\n- \\`/config\\` - Configuration files\n- \\`/scripts\\` - Utility scripts\n- \\`/examples\\` - Example code\n\n## šŸš€ Quick Start\n\n\\`\\`\\`bash\n# Start MCP server for Claude Code integration\nnpx ${PACKAGE_SPEC} mcp start\n\n# Run an agent directly\nnpx ${PACKAGE_SPEC} --agent coder --task \"Your task here\"\n\n# List available agents\nnpx ${PACKAGE_SPEC} --list\n\\`\\`\\`\n\n## šŸš€ Available Agents (54 Total)\n\n### Core Development\n\\`coder\\`, \\`reviewer\\`, \\`tester\\`, \\`planner\\`, \\`researcher\\`\n\n### Swarm Coordination\n\\`hierarchical-coordinator\\`, \\`mesh-coordinator\\`, \\`adaptive-coordinator\\`, \\`collective-intelligence-coordinator\\`, \\`swarm-memory-manager\\`\n\n### Consensus & Distributed\n\\`byzantine-coordinator\\`, \\`raft-manager\\`, \\`gossip-coordinator\\`, \\`consensus-builder\\`, \\`crdt-synchronizer\\`, \\`quorum-manager\\`, \\`security-manager\\`\n\n### Performance & Optimization\n\\`perf-analyzer\\`, \\`performance-benchmarker\\`, \\`task-orchestrator\\`, \\`memory-coordinator\\`, \\`smart-agent\\`\n\n### GitHub & Repository\n\\`github-modes\\`, \\`pr-manager\\`, \\`code-review-swarm\\`, \\`issue-tracker\\`, \\`release-manager\\`, \\`workflow-automation\\`, \\`project-board-sync\\`, \\`repo-architect\\`, \\`multi-repo-swarm\\`\n\n### SPARC Methodology\n\\`sparc-coord\\`, \\`sparc-coder\\`, \\`specification\\`, \\`pseudocode\\`, \\`architecture\\`, \\`refinement\\`\n\n### Specialized Development\n\\`backend-dev\\`, \\`mobile-dev\\`, \\`ml-developer\\`, \\`cicd-engineer\\`, \\`api-docs\\`, \\`system-architect\\`, \\`code-analyzer\\`, \\`base-template-generator\\`\n\n## šŸŽÆ Claude Code vs MCP Tools\n\n### Claude Code Handles ALL EXECUTION:\n- **Task tool**: Spawn and run agents concurrently for actual work\n- File operations (Read, Write, Edit, MultiEdit, Glob, Grep)\n- Code generation and programming\n- Bash commands and system operations\n- Implementation work\n- Project navigation and analysis\n- TodoWrite and task management\n- Git operations\n- Package management\n- Testing and debugging\n\n### MCP Tools ONLY COORDINATE:\n- Swarm initialization (topology setup)\n- Agent type definitions (coordination patterns)\n- Task orchestration (high-level planning)\n- Memory management\n- Neural features\n- Performance tracking\n- GitHub integration\n\n**KEY**: MCP coordinates the strategy, Claude Code's Task tool executes with real agents.\n\n## MCP Tool Categories\n\n### Coordination\n\\`swarm_init\\`, \\`agent_spawn\\`, \\`task_orchestrate\\`\n\n### Monitoring\n\\`swarm_status\\`, \\`agent_list\\`, \\`agent_metrics\\`, \\`task_status\\`, \\`task_results\\`\n\n### Memory & Neural\n\\`memory_usage\\`, \\`neural_status\\`, \\`neural_train\\`, \\`neural_patterns\\`\n\n### GitHub Integration\n\\`github_swarm\\`, \\`repo_analyze\\`, \\`pr_enhance\\`, \\`issue_triage\\`, \\`code_review\\`\n\n## 🧠 Self-Learning Hooks System\n\n### Available Hooks Commands:\n\\`\\`\\`bash\n# Before editing - get context and agent suggestions\nnpx ${PACKAGE_SPEC} hooks pre-edit <filePath>\n\n# After editing - record outcome for learning\nnpx ${PACKAGE_SPEC} hooks post-edit <filePath> --success true\n\n# Before commands - assess risk\nnpx ${PACKAGE_SPEC} hooks pre-command \"<command>\"\n\n# After commands - record outcome\nnpx ${PACKAGE_SPEC} hooks post-command \"<command>\" --success true\n\n# Route task to optimal agent using learned patterns\nnpx ${PACKAGE_SPEC} hooks route \"<task description>\"\n\n# Explain routing decision with transparency\nnpx ${PACKAGE_SPEC} hooks explain \"<task description>\"\n\n# Bootstrap intelligence from repository\nnpx ${PACKAGE_SPEC} hooks pretrain\n\n# Generate optimized agent configs from pretrain data\nnpx ${PACKAGE_SPEC} hooks build-agents\n\n# View learning metrics dashboard\nnpx ${PACKAGE_SPEC} hooks metrics\n\n# Transfer patterns from another project\nnpx ${PACKAGE_SPEC} hooks transfer <sourceProject>\n\n# RuVector intelligence (SONA, MoE, HNSW 150x faster)\nnpx ${PACKAGE_SPEC} hooks intelligence\n\\`\\`\\`\n\n### Pretraining System (4-Step Pipeline):\n1. **RETRIEVE** - Top-k memory injection with MMR diversity\n2. **JUDGE** - LLM-as-judge trajectory evaluation\n3. **DISTILL** - Extract strategy memories from trajectories\n4. **CONSOLIDATE** - Dedup, detect contradictions, prune old patterns\n\n## Performance Benefits\n\n- **84.8% SWE-Bench solve rate**\n- **32.3% token reduction**\n- **2.8-4.4x speed improvement**\n- **27+ neural models**\n\n## Advanced Features (v2.0.0)\n\n- šŸš€ Automatic Topology Selection\n- ⚔ Parallel Execution (2.8-4.4x speed)\n- 🧠 Neural Training\n- šŸ“Š Bottleneck Analysis\n- šŸ¤– Smart Auto-Spawning\n- šŸ›”ļø Self-Healing Workflows\n- šŸ’¾ Cross-Session Memory\n- šŸ”— GitHub Integration\n\n## Code Style & Best Practices\n\n- **Modular Design**: Files under 500 lines\n- **Environment Safety**: Never hardcode secrets\n- **Test-First**: Write tests before implementation\n- **Clean Architecture**: Separate concerns\n- **Documentation**: Keep updated\n\n## Support\n\n- Documentation: https://github.com/ruvnet/agentic-flow\n- Issues: https://github.com/ruvnet/agentic-flow/issues\n\n---\n\nRemember: **Agentic Flow coordinates, Claude Code creates!**\n\n# important-instruction-reminders\nDo what has been asked; nothing more, nothing less.\nNEVER create files unless they're absolutely necessary for achieving your goal.\nALWAYS prefer editing an existing file to creating a new one.\nNEVER proactively create documentation files (*.md) or README files. Only create documentation files if explicitly requested by the User.\nNever save working files, text/mds and tests to the root folder.\n`;\n\n/**\n * settings.json written by `init`. Hooks and the MCP server are pinned to\n * `version`. Permissions do not pre-approve npx/npm or whole MCP servers:\n * those would let any package or tool run without a prompt.\n */\nexport function buildSettingsTemplate(version: string = readPackageVersion()) {\n const spec = `agentic-flow@${version}`;\n return {\n model: \"claude-sonnet-4-20250514\",\n customInstructions: \"Follow the project's CLAUDE.md guidelines. Use concurrent execution for all operations.\",\n env: {\n AGENTIC_FLOW_INTELLIGENCE: \"true\",\n AGENTIC_FLOW_LEARNING_RATE: \"0.1\",\n AGENTIC_FLOW_EPSILON: \"0.1\",\n AGENTIC_FLOW_MEMORY_BACKEND: \"agentdb\"\n },\n permissions: {\n allowedTools: [\"Read\", \"Write\", \"Edit\", \"Bash\", \"Glob\", \"Grep\", \"Task\", \"WebFetch\", \"WebSearch\", \"TodoWrite\", \"LSP\", \"NotebookEdit\"],\n deniedTools: [],\n allow: [\n \"Bash(agentic-flow:*)\"\n ]\n },\n hooks: {\n PreToolUse: [\n {\n matcher: \"Edit|Write|MultiEdit\",\n hooks: [{ type: \"command\", command: `npx ${spec} hooks pre-edit \"$TOOL_INPUT_file_path\"` }]\n },\n {\n matcher: \"Bash\",\n hooks: [{ type: \"command\", command: `npx ${spec} hooks pre-command \"$TOOL_INPUT_command\"` }]\n }\n ],\n PostToolUse: [\n {\n matcher: \"Edit|Write|MultiEdit\",\n hooks: [{ type: \"command\", command: `npx ${spec} hooks post-edit \"$TOOL_INPUT_file_path\" --success` }]\n },\n {\n matcher: \"Bash\",\n hooks: [{ type: \"command\", command: `npx ${spec} hooks post-command \"$TOOL_INPUT_command\"` }]\n }\n ],\n PostToolUseFailure: [\n {\n matcher: \"Edit|Write|MultiEdit\",\n hooks: [{ type: \"command\", command: `npx ${spec} hooks post-edit \"$TOOL_INPUT_file_path\" --fail --error \"$ERROR_MESSAGE\"` }]\n }\n ],\n SessionStart: [\n {\n hooks: [{ type: \"command\", command: `npx ${spec} hooks intelligence stats --json 2>/dev/null || true` }]\n }\n ],\n SessionEnd: [\n {\n hooks: [{ type: \"command\", command: `npx ${spec} hooks metrics --session --json 2>/dev/null || true` }]\n }\n ],\n UserPromptSubmit: [\n {\n hooks: [\n { type: \"command\", timeout: 3000, command: `npx ${spec} hooks route \"$USER_PROMPT\" --json 2>/dev/null || true` }\n ]\n }\n ],\n Stop: [\n {\n matcher: \".*\",\n hooks: [{ type: \"command\", command: `npx ${spec} hooks metrics --session 2>/dev/null || true` }]\n }\n ]\n },\n agents: {\n source: \".claude/agents\",\n customAgents: []\n },\n skills: {\n source: \".claude/commands\",\n enabled: true\n },\n statusLine: {\n type: \"command\",\n command: \".claude/statusline.sh\"\n },\n mcpServers: {\n \"agentic-flow\": {\n command: \"npx\",\n args: [spec, \"mcp\", \"start\"]\n }\n }\n };\n}\n\ninterface InitOptions {\n force?: boolean;\n minimal?: boolean;\n verbose?: boolean;\n}\n\n/**\n * Recursively copy a directory\n */\nfunction copyDirRecursive(src: string, dest: string, verbose: boolean = false): number {\n let fileCount = 0;\n\n if (!fs.existsSync(src)) {\n return fileCount;\n }\n\n if (!fs.existsSync(dest)) {\n fs.mkdirSync(dest, { recursive: true });\n }\n\n const entries = fs.readdirSync(src, { withFileTypes: true });\n\n for (const entry of entries) {\n const srcPath = path.join(src, entry.name);\n const destPath = path.join(dest, entry.name);\n\n if (entry.isDirectory()) {\n fileCount += copyDirRecursive(srcPath, destPath, verbose);\n } else {\n fs.copyFileSync(srcPath, destPath);\n fileCount++;\n if (verbose) {\n console.log(` šŸ“„ ${path.relative(dest, destPath)}`);\n }\n }\n }\n\n return fileCount;\n}\n\n/**\n * Find the package's .claude directory\n */\nfunction findPackageClaudeDir(): string | null {\n // Try multiple potential locations\n const potentialPaths = [\n // When running from dist/\n path.resolve(__dirname, '..', '..', '..', '.claude'),\n // When running from src/\n path.resolve(__dirname, '..', '..', '.claude'),\n // When installed as package\n path.resolve(__dirname, '..', '.claude'),\n // Fallback to package root\n path.resolve(process.cwd(), 'node_modules', 'agentic-flow', '.claude'),\n ];\n\n for (const p of potentialPaths) {\n if (fs.existsSync(p) && fs.statSync(p).isDirectory()) {\n return p;\n }\n }\n\n return null;\n}\n\nexport async function handleInitCommand(args: string[]): Promise<void> {\n const options: InitOptions = {\n force: args.includes('--force') || args.includes('-f'),\n minimal: args.includes('--minimal') || args.includes('-m'),\n verbose: args.includes('--verbose') || args.includes('-v')\n };\n\n if (args.includes('--help') || args.includes('-h')) {\n printInitHelp();\n return;\n }\n\n const cwd = process.cwd();\n const claudeDir = path.join(cwd, '.claude');\n const claudeMdFile = path.join(cwd, 'CLAUDE.md');\n\n console.log(`\n╔═══════════════════════════════════════════════════════╗\nā•‘ Agentic Flow - Project Initialization ā•‘\nā•šā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•\n`);\n\n // Check if already initialized\n if (fs.existsSync(claudeDir) && !options.force) {\n console.log('āš ļø .claude/ directory already exists.');\n console.log(' Use --force to overwrite existing configuration.\\n');\n return;\n }\n\n try {\n // Find the package's .claude directory\n const packageClaudeDir = findPackageClaudeDir();\n\n if (packageClaudeDir && !options.minimal) {\n console.log('šŸ“¦ Copying full .claude/ structure from agentic-flow package...\\n');\n\n // Copy entire .claude directory structure\n const directories = ['agents', 'commands', 'skills', 'helpers'];\n let totalFiles = 0;\n\n for (const dir of directories) {\n const srcDir = path.join(packageClaudeDir, dir);\n const destDir = path.join(claudeDir, dir);\n\n if (fs.existsSync(srcDir)) {\n const count = copyDirRecursive(srcDir, destDir, options.verbose);\n totalFiles += count;\n console.log(`āœ… Copied .claude/${dir}/ (${count} files)`);\n }\n }\n\n // Copy individual files (settings.json is generated fresh with our template).\n // mcp.json is not copied: the packaged one pointed at a developer-machine\n // path (/workspaces/flow-cloud/...), so every initialized project got a\n // flow-nexus MCP server entry that could not start.\n const individualFiles = ['statusline.sh'];\n for (const file of individualFiles) {\n const srcFile = path.join(packageClaudeDir, file);\n const destFile = path.join(claudeDir, file);\n if (fs.existsSync(srcFile)) {\n fs.copyFileSync(srcFile, destFile);\n console.log(`āœ… Copied .claude/${file}`);\n totalFiles++;\n }\n }\n\n console.log(`\\nšŸ“Š Total: ${totalFiles} files copied`);\n } else {\n // Minimal mode: create basic structure\n console.log('šŸ“¦ Creating minimal .claude/ structure...\\n');\n\n if (!fs.existsSync(claudeDir)) {\n fs.mkdirSync(claudeDir, { recursive: true });\n }\n\n const dirs = ['agents', 'commands', 'skills', 'helpers'];\n for (const dir of dirs) {\n const dirPath = path.join(claudeDir, dir);\n if (!fs.existsSync(dirPath)) {\n fs.mkdirSync(dirPath, { recursive: true });\n console.log(`āœ… Created .claude/${dir}/`);\n }\n }\n }\n\n // Always generate fresh settings.json with our template\n const settingsFile = path.join(claudeDir, 'settings.json');\n if (!fs.existsSync(settingsFile) || options.force) {\n fs.writeFileSync(settingsFile, JSON.stringify(buildSettingsTemplate(), null, 2));\n console.log('āœ… Created .claude/settings.json (with hooks, agents, skills, statusline)');\n }\n\n // Create CLAUDE.md in project root (unless minimal mode)\n if (!options.minimal) {\n if (!fs.existsSync(claudeMdFile) || options.force) {\n fs.writeFileSync(claudeMdFile, CLAUDE_MD_TEMPLATE);\n console.log('āœ… Created CLAUDE.md');\n } else {\n console.log('ā„¹ļø CLAUDE.md already exists (skipped)');\n }\n }\n\n console.log(`\n╔═══════════════════════════════════════════════════════╗\nā•‘ Initialization Complete! ā•‘\nā•šā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•\n\nšŸ“ Created structure:\n .claude/\n ā”œā”€ā”€ settings.json # Claude Code settings (hooks, agents, skills, statusline)\n ā”œā”€ā”€ statusline.sh # Custom statusline (model, tokens, cost, swarm status)\n ā”œā”€ā”€ agents/ # 80+ agent definitions (coder, tester, reviewer, etc.)\n ā”œā”€ā”€ commands/ # 100+ slash commands (swarm, github, sparc, etc.)\n ā”œā”€ā”€ skills/ # Custom skills and workflows\n └── helpers/ # Helper utilities\n CLAUDE.md # Project instructions\n\nšŸš€ Next steps:\n 1. Start the MCP server:\n npx ${PACKAGE_SPEC} mcp start\n\n 2. Run Claude Code:\n claude\n\n 3. Or run agents directly:\n npx ${PACKAGE_SPEC} --agent coder --task \"Your task\"\n\nšŸ“– Documentation:\n https://github.com/ruvnet/agentic-flow\n`);\n\n } catch (error) {\n console.error('āŒ Initialization failed:', error);\n process.exit(1);\n }\n}\n\nfunction printInitHelp(): void {\n console.log(`\nAgentic Flow - Project Initialization\n\nUSAGE:\n npx ${PACKAGE_SPEC} init [OPTIONS]\n\nOPTIONS:\n --force, -f Overwrite existing configuration\n --minimal, -m Create minimal setup (empty directories only)\n --verbose, -v Show detailed file copy output\n --help, -h Show this help\n\nEXAMPLES:\n npx ${PACKAGE_SPEC} init # Initialize with full agent/command library\n npx ${PACKAGE_SPEC} init --force # Reinitialize (overwrite existing)\n npx ${PACKAGE_SPEC} init --minimal # Minimal setup (empty directories)\n npx ${PACKAGE_SPEC} init --verbose # Show all files being copied\n\nCREATED FILES:\n .claude/ Claude Code configuration directory\n .claude/settings.json Settings with hooks, agents, skills, statusline, MCP servers\n .claude/agents/ 80+ agent definitions (coder, tester, reviewer, sparc, etc.)\n .claude/commands/ 100+ slash commands (swarm, github, sparc, etc.)\n .claude/skills/ Custom skills and workflows\n .claude/helpers/ Helper utilities\n CLAUDE.md Project instructions for Claude\n`);\n}\n\n// Run if executed directly\nif (process.argv[1]?.endsWith('init.js') || process.argv[1]?.endsWith('init.ts')) {\n const args = process.argv.slice(2);\n handleInitCommand(args);\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"swarm.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/swarm.ts"],"names":[],"mappings":";AACA;;;;;;;;;GASG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAoB,MAAM,6BAA6B,CAAC;AAM3E,wBAAgB,kBAAkB,IAAI,OAAO,CAkV5C;AAGD,wBAAgB,gBAAgB,IAAI,UAAU,GAAG,IAAI,CAEpD;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,UAAU,GAAG,IAAI,CAE3D"}
1
+ {"version":3,"file":"swarm.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/swarm.ts"],"names":[],"mappings":";AACA;;;;;;;;;GASG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAoB,MAAM,6BAA6B,CAAC;AAO3E,wBAAgB,kBAAkB,IAAI,OAAO,CAkV5C;AAGD,wBAAgB,gBAAgB,IAAI,UAAU,GAAG,IAAI,CAEpD;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,UAAU,GAAG,IAAI,CAE3D"}
@@ -11,6 +11,7 @@
11
11
  */
12
12
  import { Command } from 'commander';
13
13
  import { createP2PSwarmV2 } from '../../swarm/p2p-swarm-v2.js';
14
+ import { packageSpec } from '../../utils/package-version.js';
14
15
  // Global swarm instance
15
16
  let swarmInstance = null;
16
17
  export function createSwarmCommand() {
@@ -51,7 +52,7 @@ export function createSwarmCommand() {
51
52
  console.log(` Relays: ${status.relays.healthy}/${status.relays.total} healthy`);
52
53
  console.log(` Executor: ${options.executor ? 'Enabled' : 'Disabled'}`);
53
54
  console.log(`\nShare the swarm key to invite others:`);
54
- console.log(` npx agentic-flow@alpha swarm connect -k "${swarmInstance.getSwarmKey()}"`);
55
+ console.log(` npx ${packageSpec()} swarm connect -k "${swarmInstance.getSwarmKey()}"`);
55
56
  }
56
57
  // Keep process alive for background operations
57
58
  if (options.executor) {
@@ -311,7 +312,7 @@ export function createSwarmCommand() {
311
312
  console.log(`šŸ”‘ New Swarm Key:`);
312
313
  console.log(` ${key}`);
313
314
  console.log(`\nUse with:`);
314
- console.log(` npx agentic-flow@alpha swarm connect -k "${key}"`);
315
+ console.log(` npx ${packageSpec()} swarm connect -k "${key}"`);
315
316
  });
316
317
  return swarm;
317
318
  }
@@ -1 +1 @@
1
- {"version":3,"file":"swarm.js","sourceRoot":"","sources":["../../../src/cli/commands/swarm.ts"],"names":[],"mappings":"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","sourcesContent":["#!/usr/bin/env node\n/**\n * P2P Swarm V2 CLI Commands\n *\n * Production-grade P2P swarm coordination with:\n * - Ed25519/X25519 cryptography\n * - GunDB relay coordination\n * - Task execution with claim resolution\n * - Heartbeat-based liveness\n * - Verified member registry\n */\n\nimport { Command } from 'commander';\nimport { P2PSwarmV2, createP2PSwarmV2 } from '../../swarm/p2p-swarm-v2.js';\nimport { logger } from '../../utils/logger.js';\n\n// Global swarm instance\nlet swarmInstance: P2PSwarmV2 | null = null;\n\nexport function createSwarmCommand(): Command {\n const swarm = new Command('swarm')\n .description('P2P Swarm V2 - Production-grade decentralized coordination');\n\n // Initialize and connect to swarm\n swarm\n .command('connect')\n .description('Connect to a P2P swarm')\n .option('-a, --agent-id <id>', 'Agent ID (default: auto-generated)')\n .option('-k, --swarm-key <key>', 'Swarm key for joining existing swarm')\n .option('-e, --executor', 'Enable task executor capability')\n .option('-j, --json', 'Output as JSON')\n .action(async (options: {\n agentId?: string;\n swarmKey?: string;\n executor?: boolean;\n json?: boolean;\n }) => {\n try {\n const agentId = options.agentId || `agent-${Date.now().toString(36)}`;\n\n console.log(`Connecting to P2P Swarm...`);\n swarmInstance = await createP2PSwarmV2(agentId, options.swarmKey);\n\n if (options.executor) {\n swarmInstance.startTaskExecutor();\n }\n\n const status = swarmInstance.getStatus();\n\n if (options.json) {\n console.log(JSON.stringify({\n connected: status.connected,\n agentId: status.agentId,\n swarmId: status.swarmId,\n swarmKey: swarmInstance.getSwarmKey(),\n relays: status.relays,\n executor: options.executor || false,\n }, null, 2));\n } else {\n console.log(`\\nāœ… Connected to P2P Swarm V2`);\n console.log(` Agent ID: ${status.agentId}`);\n console.log(` Swarm ID: ${status.swarmId}`);\n console.log(` Swarm Key: ${swarmInstance.getSwarmKey().slice(0, 20)}...`);\n console.log(` Relays: ${status.relays.healthy}/${status.relays.total} healthy`);\n console.log(` Executor: ${options.executor ? 'Enabled' : 'Disabled'}`);\n console.log(`\\nShare the swarm key to invite others:`);\n console.log(` npx agentic-flow@alpha swarm connect -k \"${swarmInstance.getSwarmKey()}\"`);\n }\n\n // Keep process alive for background operations\n if (options.executor) {\n console.log(`\\nTask executor running. Press Ctrl+C to stop.`);\n process.on('SIGINT', () => {\n swarmInstance?.disconnect();\n process.exit(0);\n });\n // Keep alive\n await new Promise(() => {});\n }\n } catch (error) {\n console.error('Error:', error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\n // Get swarm status\n swarm\n .command('status')\n .description('Get current swarm status')\n .option('-j, --json', 'Output as JSON')\n .action(async (options: { json?: boolean }) => {\n if (!swarmInstance) {\n console.error('Not connected to swarm. Run: swarm connect');\n process.exit(1);\n }\n\n const status = swarmInstance.getStatus();\n const liveMembers = swarmInstance.getLiveMembers();\n\n if (options.json) {\n console.log(JSON.stringify({\n ...status,\n liveMembers,\n liveMemberCount: swarmInstance.getLiveMemberCount(),\n }, null, 2));\n } else {\n console.log(`\\nšŸ“Š P2P Swarm Status`);\n console.log(` Connected: ${status.connected}`);\n console.log(` Agent ID: ${status.agentId}`);\n console.log(` Swarm ID: ${status.swarmId}`);\n console.log(` Relays: ${status.relays.healthy}/${status.relays.total} healthy`);\n console.log(` Avg Latency: ${status.relays.avgLatency.toFixed(0)}ms`);\n console.log(`\\nšŸ‘„ Live Members: ${swarmInstance.getLiveMemberCount()}`);\n for (const member of liveMembers) {\n const status = member.isAlive ? '🟢' : 'šŸ”“';\n const age = Math.round((Date.now() - member.lastSeen) / 1000);\n console.log(` ${status} ${member.agentId} (${member.capabilities.join(', ')}) - ${age}s ago`);\n }\n }\n });\n\n // List members\n swarm\n .command('members')\n .description('List swarm members')\n .option('-a, --all', 'Include offline members')\n .option('-j, --json', 'Output as JSON')\n .action(async (options: { all?: boolean; json?: boolean }) => {\n if (!swarmInstance) {\n console.error('Not connected to swarm. Run: swarm connect');\n process.exit(1);\n }\n\n const members = swarmInstance.getLiveMembers();\n const filtered = options.all ? members : members.filter(m => m.isAlive);\n\n if (options.json) {\n console.log(JSON.stringify(filtered, null, 2));\n } else {\n console.log(`\\nšŸ‘„ Swarm Members (${filtered.length})`);\n for (const member of filtered) {\n const status = member.isAlive ? '🟢 Online' : 'šŸ”“ Offline';\n const age = Math.round((Date.now() - member.lastSeen) / 1000);\n console.log(`\\n ${member.agentId}`);\n console.log(` Status: ${status}`);\n console.log(` Capabilities: ${member.capabilities.join(', ')}`);\n console.log(` Last Seen: ${age}s ago`);\n }\n }\n });\n\n // Publish message to topic\n swarm\n .command('publish <topic> <message>')\n .description('Publish a message to a topic')\n .option('-j, --json', 'Parse message as JSON')\n .action(async (topic: string, message: string, options: { json?: boolean }) => {\n if (!swarmInstance) {\n console.error('Not connected to swarm. Run: swarm connect');\n process.exit(1);\n }\n\n try {\n const payload = options.json ? JSON.parse(message) : { text: message };\n const messageId = await swarmInstance.publish(topic, payload);\n console.log(`āœ… Published to ${topic}`);\n console.log(` Message ID: ${messageId}`);\n } catch (error) {\n console.error('Error:', error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\n // Subscribe to topic\n swarm\n .command('subscribe <topic>')\n .description('Subscribe to a topic and print messages')\n .action(async (topic: string) => {\n if (!swarmInstance) {\n console.error('Not connected to swarm. Run: swarm connect');\n process.exit(1);\n }\n\n console.log(`šŸ“” Subscribed to ${topic}. Waiting for messages...`);\n swarmInstance.subscribe(topic, (data, from) => {\n console.log(`\\n[${new Date().toISOString()}] From: ${from}`);\n console.log(JSON.stringify(data, null, 2));\n });\n\n // Keep alive\n process.on('SIGINT', () => {\n swarmInstance?.disconnect();\n process.exit(0);\n });\n await new Promise(() => {});\n });\n\n // Sync Q-table\n swarm\n .command('sync-qtable')\n .description('Sync a Q-table to the swarm')\n .requiredOption('-f, --file <path>', 'Path to Q-table JSON file')\n .action(async (options: { file: string }) => {\n if (!swarmInstance) {\n console.error('Not connected to swarm. Run: swarm connect');\n process.exit(1);\n }\n\n try {\n const fs = await import('fs');\n const data = fs.readFileSync(options.file, 'utf-8');\n const qTable = JSON.parse(data);\n\n if (!Array.isArray(qTable) || !Array.isArray(qTable[0])) {\n throw new Error('Q-table must be a 2D array');\n }\n\n const pointer = await swarmInstance.syncQTable(qTable);\n console.log(`āœ… Q-table synced`);\n console.log(` CID: ${pointer.cid}`);\n console.log(` Dimensions: ${pointer.dimensions}`);\n console.log(` Checksum: ${pointer.checksum}`);\n } catch (error) {\n console.error('Error:', error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\n // Sync memory vectors\n swarm\n .command('sync-memory')\n .description('Sync memory vectors to the swarm')\n .requiredOption('-f, --file <path>', 'Path to vectors JSON file')\n .option('-n, --namespace <ns>', 'Memory namespace', 'default')\n .action(async (options: { file: string; namespace: string }) => {\n if (!swarmInstance) {\n console.error('Not connected to swarm. Run: swarm connect');\n process.exit(1);\n }\n\n try {\n const fs = await import('fs');\n const data = fs.readFileSync(options.file, 'utf-8');\n const vectors = JSON.parse(data);\n\n if (!Array.isArray(vectors) || !Array.isArray(vectors[0])) {\n throw new Error('Vectors must be a 2D array');\n }\n\n const pointer = await swarmInstance.syncMemory(vectors, options.namespace);\n console.log(`āœ… Memory vectors synced`);\n console.log(` CID: ${pointer.cid}`);\n console.log(` Namespace: ${options.namespace}`);\n console.log(` Dimensions: ${pointer.dimensions}`);\n } catch (error) {\n console.error('Error:', error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\n // Submit task\n swarm\n .command('submit-task')\n .description('Submit a task for execution')\n .requiredOption('-m, --module <cid>', 'WASM module CID')\n .requiredOption('-i, --input <cid>', 'Input data CID')\n .option('-e, --entrypoint <fn>', 'Entrypoint function', 'main')\n .option('-f, --fuel <n>', 'Fuel limit', '1000000')\n .option('-M, --memory <mb>', 'Memory limit in MB', '64')\n .option('-t, --timeout <ms>', 'Timeout in ms', '30000')\n .action(async (options: {\n module: string;\n input: string;\n entrypoint: string;\n fuel: string;\n memory: string;\n timeout: string;\n }) => {\n if (!swarmInstance) {\n console.error('Not connected to swarm. Run: swarm connect');\n process.exit(1);\n }\n\n try {\n const taskId = await swarmInstance.submitTask({\n taskId: `task-${Date.now().toString(36)}`,\n moduleCID: options.module,\n inputCID: options.input,\n entrypoint: options.entrypoint,\n outputSchemaHash: '',\n budgets: {\n fuelLimit: parseInt(options.fuel),\n memoryMB: parseInt(options.memory),\n timeoutMs: parseInt(options.timeout),\n },\n });\n\n console.log(`āœ… Task submitted`);\n console.log(` Message ID: ${taskId}`);\n console.log(` Module: ${options.module}`);\n console.log(` Input: ${options.input}`);\n } catch (error) {\n console.error('Error:', error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\n // Start executor\n swarm\n .command('executor')\n .description('Start task executor daemon')\n .action(async () => {\n if (!swarmInstance) {\n console.error('Not connected to swarm. Run: swarm connect');\n process.exit(1);\n }\n\n swarmInstance.startTaskExecutor();\n console.log(`āœ… Task executor started`);\n console.log(` Listening for tasks...`);\n\n process.on('SIGINT', () => {\n swarmInstance?.stopTaskExecutor();\n swarmInstance?.disconnect();\n process.exit(0);\n });\n await new Promise(() => {});\n });\n\n // Disconnect\n swarm\n .command('disconnect')\n .description('Disconnect from the swarm')\n .action(async () => {\n if (swarmInstance) {\n swarmInstance.disconnect();\n swarmInstance = null;\n console.log('āœ… Disconnected from swarm');\n } else {\n console.log('Not connected to swarm');\n }\n });\n\n // Generate new swarm key\n swarm\n .command('keygen')\n .description('Generate a new swarm key')\n .action(async () => {\n const crypto = await import('crypto');\n const key = crypto.randomBytes(32).toString('base64');\n console.log(`šŸ”‘ New Swarm Key:`);\n console.log(` ${key}`);\n console.log(`\\nUse with:`);\n console.log(` npx agentic-flow@alpha swarm connect -k \"${key}\"`);\n });\n\n return swarm;\n}\n\n// Export singleton getter for hooks/MCP integration\nexport function getSwarmInstance(): P2PSwarmV2 | null {\n return swarmInstance;\n}\n\nexport function setSwarmInstance(instance: P2PSwarmV2): void {\n swarmInstance = instance;\n}\n"]}
1
+ {"version":3,"file":"swarm.js","sourceRoot":"","sources":["../../../src/cli/commands/swarm.ts"],"names":[],"mappings":"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","sourcesContent":["#!/usr/bin/env node\n/**\n * P2P Swarm V2 CLI Commands\n *\n * Production-grade P2P swarm coordination with:\n * - Ed25519/X25519 cryptography\n * - GunDB relay coordination\n * - Task execution with claim resolution\n * - Heartbeat-based liveness\n * - Verified member registry\n */\n\nimport { Command } from 'commander';\nimport { P2PSwarmV2, createP2PSwarmV2 } from '../../swarm/p2p-swarm-v2.js';\nimport { logger } from '../../utils/logger.js';\nimport { packageSpec } from '../../utils/package-version.js';\n\n// Global swarm instance\nlet swarmInstance: P2PSwarmV2 | null = null;\n\nexport function createSwarmCommand(): Command {\n const swarm = new Command('swarm')\n .description('P2P Swarm V2 - Production-grade decentralized coordination');\n\n // Initialize and connect to swarm\n swarm\n .command('connect')\n .description('Connect to a P2P swarm')\n .option('-a, --agent-id <id>', 'Agent ID (default: auto-generated)')\n .option('-k, --swarm-key <key>', 'Swarm key for joining existing swarm')\n .option('-e, --executor', 'Enable task executor capability')\n .option('-j, --json', 'Output as JSON')\n .action(async (options: {\n agentId?: string;\n swarmKey?: string;\n executor?: boolean;\n json?: boolean;\n }) => {\n try {\n const agentId = options.agentId || `agent-${Date.now().toString(36)}`;\n\n console.log(`Connecting to P2P Swarm...`);\n swarmInstance = await createP2PSwarmV2(agentId, options.swarmKey);\n\n if (options.executor) {\n swarmInstance.startTaskExecutor();\n }\n\n const status = swarmInstance.getStatus();\n\n if (options.json) {\n console.log(JSON.stringify({\n connected: status.connected,\n agentId: status.agentId,\n swarmId: status.swarmId,\n swarmKey: swarmInstance.getSwarmKey(),\n relays: status.relays,\n executor: options.executor || false,\n }, null, 2));\n } else {\n console.log(`\\nāœ… Connected to P2P Swarm V2`);\n console.log(` Agent ID: ${status.agentId}`);\n console.log(` Swarm ID: ${status.swarmId}`);\n console.log(` Swarm Key: ${swarmInstance.getSwarmKey().slice(0, 20)}...`);\n console.log(` Relays: ${status.relays.healthy}/${status.relays.total} healthy`);\n console.log(` Executor: ${options.executor ? 'Enabled' : 'Disabled'}`);\n console.log(`\\nShare the swarm key to invite others:`);\n console.log(` npx ${packageSpec()} swarm connect -k \"${swarmInstance.getSwarmKey()}\"`);\n }\n\n // Keep process alive for background operations\n if (options.executor) {\n console.log(`\\nTask executor running. Press Ctrl+C to stop.`);\n process.on('SIGINT', () => {\n swarmInstance?.disconnect();\n process.exit(0);\n });\n // Keep alive\n await new Promise(() => {});\n }\n } catch (error) {\n console.error('Error:', error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\n // Get swarm status\n swarm\n .command('status')\n .description('Get current swarm status')\n .option('-j, --json', 'Output as JSON')\n .action(async (options: { json?: boolean }) => {\n if (!swarmInstance) {\n console.error('Not connected to swarm. Run: swarm connect');\n process.exit(1);\n }\n\n const status = swarmInstance.getStatus();\n const liveMembers = swarmInstance.getLiveMembers();\n\n if (options.json) {\n console.log(JSON.stringify({\n ...status,\n liveMembers,\n liveMemberCount: swarmInstance.getLiveMemberCount(),\n }, null, 2));\n } else {\n console.log(`\\nšŸ“Š P2P Swarm Status`);\n console.log(` Connected: ${status.connected}`);\n console.log(` Agent ID: ${status.agentId}`);\n console.log(` Swarm ID: ${status.swarmId}`);\n console.log(` Relays: ${status.relays.healthy}/${status.relays.total} healthy`);\n console.log(` Avg Latency: ${status.relays.avgLatency.toFixed(0)}ms`);\n console.log(`\\nšŸ‘„ Live Members: ${swarmInstance.getLiveMemberCount()}`);\n for (const member of liveMembers) {\n const status = member.isAlive ? '🟢' : 'šŸ”“';\n const age = Math.round((Date.now() - member.lastSeen) / 1000);\n console.log(` ${status} ${member.agentId} (${member.capabilities.join(', ')}) - ${age}s ago`);\n }\n }\n });\n\n // List members\n swarm\n .command('members')\n .description('List swarm members')\n .option('-a, --all', 'Include offline members')\n .option('-j, --json', 'Output as JSON')\n .action(async (options: { all?: boolean; json?: boolean }) => {\n if (!swarmInstance) {\n console.error('Not connected to swarm. Run: swarm connect');\n process.exit(1);\n }\n\n const members = swarmInstance.getLiveMembers();\n const filtered = options.all ? members : members.filter(m => m.isAlive);\n\n if (options.json) {\n console.log(JSON.stringify(filtered, null, 2));\n } else {\n console.log(`\\nšŸ‘„ Swarm Members (${filtered.length})`);\n for (const member of filtered) {\n const status = member.isAlive ? '🟢 Online' : 'šŸ”“ Offline';\n const age = Math.round((Date.now() - member.lastSeen) / 1000);\n console.log(`\\n ${member.agentId}`);\n console.log(` Status: ${status}`);\n console.log(` Capabilities: ${member.capabilities.join(', ')}`);\n console.log(` Last Seen: ${age}s ago`);\n }\n }\n });\n\n // Publish message to topic\n swarm\n .command('publish <topic> <message>')\n .description('Publish a message to a topic')\n .option('-j, --json', 'Parse message as JSON')\n .action(async (topic: string, message: string, options: { json?: boolean }) => {\n if (!swarmInstance) {\n console.error('Not connected to swarm. Run: swarm connect');\n process.exit(1);\n }\n\n try {\n const payload = options.json ? JSON.parse(message) : { text: message };\n const messageId = await swarmInstance.publish(topic, payload);\n console.log(`āœ… Published to ${topic}`);\n console.log(` Message ID: ${messageId}`);\n } catch (error) {\n console.error('Error:', error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\n // Subscribe to topic\n swarm\n .command('subscribe <topic>')\n .description('Subscribe to a topic and print messages')\n .action(async (topic: string) => {\n if (!swarmInstance) {\n console.error('Not connected to swarm. Run: swarm connect');\n process.exit(1);\n }\n\n console.log(`šŸ“” Subscribed to ${topic}. Waiting for messages...`);\n swarmInstance.subscribe(topic, (data, from) => {\n console.log(`\\n[${new Date().toISOString()}] From: ${from}`);\n console.log(JSON.stringify(data, null, 2));\n });\n\n // Keep alive\n process.on('SIGINT', () => {\n swarmInstance?.disconnect();\n process.exit(0);\n });\n await new Promise(() => {});\n });\n\n // Sync Q-table\n swarm\n .command('sync-qtable')\n .description('Sync a Q-table to the swarm')\n .requiredOption('-f, --file <path>', 'Path to Q-table JSON file')\n .action(async (options: { file: string }) => {\n if (!swarmInstance) {\n console.error('Not connected to swarm. Run: swarm connect');\n process.exit(1);\n }\n\n try {\n const fs = await import('fs');\n const data = fs.readFileSync(options.file, 'utf-8');\n const qTable = JSON.parse(data);\n\n if (!Array.isArray(qTable) || !Array.isArray(qTable[0])) {\n throw new Error('Q-table must be a 2D array');\n }\n\n const pointer = await swarmInstance.syncQTable(qTable);\n console.log(`āœ… Q-table synced`);\n console.log(` CID: ${pointer.cid}`);\n console.log(` Dimensions: ${pointer.dimensions}`);\n console.log(` Checksum: ${pointer.checksum}`);\n } catch (error) {\n console.error('Error:', error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\n // Sync memory vectors\n swarm\n .command('sync-memory')\n .description('Sync memory vectors to the swarm')\n .requiredOption('-f, --file <path>', 'Path to vectors JSON file')\n .option('-n, --namespace <ns>', 'Memory namespace', 'default')\n .action(async (options: { file: string; namespace: string }) => {\n if (!swarmInstance) {\n console.error('Not connected to swarm. Run: swarm connect');\n process.exit(1);\n }\n\n try {\n const fs = await import('fs');\n const data = fs.readFileSync(options.file, 'utf-8');\n const vectors = JSON.parse(data);\n\n if (!Array.isArray(vectors) || !Array.isArray(vectors[0])) {\n throw new Error('Vectors must be a 2D array');\n }\n\n const pointer = await swarmInstance.syncMemory(vectors, options.namespace);\n console.log(`āœ… Memory vectors synced`);\n console.log(` CID: ${pointer.cid}`);\n console.log(` Namespace: ${options.namespace}`);\n console.log(` Dimensions: ${pointer.dimensions}`);\n } catch (error) {\n console.error('Error:', error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\n // Submit task\n swarm\n .command('submit-task')\n .description('Submit a task for execution')\n .requiredOption('-m, --module <cid>', 'WASM module CID')\n .requiredOption('-i, --input <cid>', 'Input data CID')\n .option('-e, --entrypoint <fn>', 'Entrypoint function', 'main')\n .option('-f, --fuel <n>', 'Fuel limit', '1000000')\n .option('-M, --memory <mb>', 'Memory limit in MB', '64')\n .option('-t, --timeout <ms>', 'Timeout in ms', '30000')\n .action(async (options: {\n module: string;\n input: string;\n entrypoint: string;\n fuel: string;\n memory: string;\n timeout: string;\n }) => {\n if (!swarmInstance) {\n console.error('Not connected to swarm. Run: swarm connect');\n process.exit(1);\n }\n\n try {\n const taskId = await swarmInstance.submitTask({\n taskId: `task-${Date.now().toString(36)}`,\n moduleCID: options.module,\n inputCID: options.input,\n entrypoint: options.entrypoint,\n outputSchemaHash: '',\n budgets: {\n fuelLimit: parseInt(options.fuel),\n memoryMB: parseInt(options.memory),\n timeoutMs: parseInt(options.timeout),\n },\n });\n\n console.log(`āœ… Task submitted`);\n console.log(` Message ID: ${taskId}`);\n console.log(` Module: ${options.module}`);\n console.log(` Input: ${options.input}`);\n } catch (error) {\n console.error('Error:', error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\n // Start executor\n swarm\n .command('executor')\n .description('Start task executor daemon')\n .action(async () => {\n if (!swarmInstance) {\n console.error('Not connected to swarm. Run: swarm connect');\n process.exit(1);\n }\n\n swarmInstance.startTaskExecutor();\n console.log(`āœ… Task executor started`);\n console.log(` Listening for tasks...`);\n\n process.on('SIGINT', () => {\n swarmInstance?.stopTaskExecutor();\n swarmInstance?.disconnect();\n process.exit(0);\n });\n await new Promise(() => {});\n });\n\n // Disconnect\n swarm\n .command('disconnect')\n .description('Disconnect from the swarm')\n .action(async () => {\n if (swarmInstance) {\n swarmInstance.disconnect();\n swarmInstance = null;\n console.log('āœ… Disconnected from swarm');\n } else {\n console.log('Not connected to swarm');\n }\n });\n\n // Generate new swarm key\n swarm\n .command('keygen')\n .description('Generate a new swarm key')\n .action(async () => {\n const crypto = await import('crypto');\n const key = crypto.randomBytes(32).toString('base64');\n console.log(`šŸ”‘ New Swarm Key:`);\n console.log(` ${key}`);\n console.log(`\\nUse with:`);\n console.log(` npx ${packageSpec()} swarm connect -k \"${key}\"`);\n });\n\n return swarm;\n}\n\n// Export singleton getter for hooks/MCP integration\nexport function getSwarmInstance(): P2PSwarmV2 | null {\n return swarmInstance;\n}\n\nexport function setSwarmInstance(instance: P2PSwarmV2): void {\n swarmInstance = instance;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"anthropic-to-gemini.d.ts","sourceRoot":"","sources":["../../src/proxy/anthropic-to-gemini.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAyDnC,qBAAa,sBAAsB;IACjC,OAAO,CAAC,GAAG,CAAsB;IACjC,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,MAAM,CAAC,CAAS;gBAEZ,MAAM,EAAE;QAClB,YAAY,EAAE,MAAM,CAAC;QACrB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,qFAAqF;QACrF,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB;IAWD,4EAA4E;IACrE,YAAY,IAAI,MAAM;IAI7B,OAAO,CAAC,eAAe;IAkBvB,OAAO,CAAC,WAAW;IA8HnB,OAAO,CAAC,wBAAwB;IA0IhC,OAAO,CAAC,uBAAuB;IAsD/B,OAAO,CAAC,wBAAwB;IAwFhC,OAAO,CAAC,8BAA8B;IAqCtC,OAAO,CAAC,eAAe;IAWvB;;;OAGG;IACI,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,MAA2B,GAAG,MAAM;IAerE,qEAAqE;IAC9D,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAM7B"}
1
+ {"version":3,"file":"anthropic-to-gemini.d.ts","sourceRoot":"","sources":["../../src/proxy/anthropic-to-gemini.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AA0DnC,qBAAa,sBAAsB;IACjC,OAAO,CAAC,GAAG,CAAsB;IACjC,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,MAAM,CAAC,CAAS;gBAEZ,MAAM,EAAE;QAClB,YAAY,EAAE,MAAM,CAAC;QACrB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,qFAAqF;QACrF,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB;IAWD,4EAA4E;IACrE,YAAY,IAAI,MAAM;IAI7B,OAAO,CAAC,eAAe;IAkBvB,OAAO,CAAC,WAAW;IAqHnB,OAAO,CAAC,wBAAwB;IA0IhC,OAAO,CAAC,uBAAuB;IAsD/B,OAAO,CAAC,wBAAwB;IAyFhC,OAAO,CAAC,8BAA8B;IAqCtC,OAAO,CAAC,eAAe;IAWvB;;;OAGG;IACI,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,MAA2B,GAAG,MAAM;IAerE,qEAAqE;IAC9D,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAM7B"}
@@ -3,6 +3,7 @@
3
3
  import express from 'express';
4
4
  import { logger } from '../utils/logger.js';
5
5
  import { createProxyAuthMiddleware, resolveProxyHost, resolveProxyToken } from './proxy-auth.js';
6
+ import { forEachSseLines, sseLines } from './sse-lines.js';
6
7
  export class AnthropicToGeminiProxy {
7
8
  app;
8
9
  geminiApiKey;
@@ -89,19 +90,13 @@ export class AnthropicToGeminiProxy {
89
90
  if (!reader) {
90
91
  throw new Error('No response body');
91
92
  }
92
- const decoder = new TextDecoder();
93
- let chunkCount = 0;
94
- while (true) {
95
- const { done, value } = await reader.read();
96
- if (done)
97
- break;
98
- const chunk = decoder.decode(value);
99
- chunkCount++;
100
- logger.debug('Gemini stream chunk received', { chunkCount, chunkLength: chunk.length, chunkPreview: chunk.substring(0, 200) });
101
- const anthropicChunk = this.convertGeminiStreamToAnthropic(chunk);
102
- logger.debug('Anthropic stream chunk generated', { chunkCount, anthropicLength: anthropicChunk.length, anthropicPreview: anthropicChunk.substring(0, 200) });
103
- res.write(anthropicChunk);
104
- }
93
+ const chunkCount = await forEachSseLines(reader, lines => {
94
+ logger.debug('Gemini stream lines received', { length: lines.length, preview: lines.substring(0, 200) });
95
+ const anthropicChunk = this.convertGeminiStreamToAnthropic(lines);
96
+ logger.debug('Anthropic stream chunk generated', { anthropicLength: anthropicChunk.length, anthropicPreview: anthropicChunk.substring(0, 200) });
97
+ if (anthropicChunk)
98
+ res.write(anthropicChunk);
99
+ });
105
100
  logger.info('Gemini stream complete', { totalChunks: chunkCount });
106
101
  res.end();
107
102
  }
@@ -383,9 +378,10 @@ The system will automatically execute these commands and provide results.
383
378
  }
384
379
  };
385
380
  }
381
+ // Takes only complete lines; forEachSseLines buffers any partial tail.
386
382
  convertGeminiStreamToAnthropic(chunk) {
387
383
  // Gemini streaming returns Server-Sent Events format: "data: {json}"
388
- const lines = chunk.split('\n').filter(line => line.trim());
384
+ const lines = sseLines(chunk);
389
385
  const anthropicChunks = [];
390
386
  for (const line of lines) {
391
387
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"anthropic-to-gemini.js","sourceRoot":"","sources":["../../src/proxy/anthropic-to-gemini.ts"],"names":[],"mappings":"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","sourcesContent":["// Anthropic to Gemini Proxy Server\n// Converts Anthropic API format to Google Gemini format\nimport express, { Request, Response, NextFunction } from 'express';\nimport type { Server } from 'http';\nimport { logger } from '../utils/logger.js';\nimport { createProxyAuthMiddleware, resolveProxyHost, resolveProxyToken } from './proxy-auth.js';\n\ninterface AnthropicMessage {\n role: 'user' | 'assistant';\n content: string | Array<{ type: string; text?: string; [key: string]: any }>;\n}\n\ninterface AnthropicTool {\n name: string;\n description?: string;\n input_schema?: {\n type: string;\n properties?: Record<string, any>;\n required?: string[];\n };\n}\n\ninterface AnthropicRequest {\n model?: string;\n messages: AnthropicMessage[];\n max_tokens?: number;\n temperature?: number;\n system?: string;\n stream?: boolean;\n tools?: AnthropicTool[];\n [key: string]: any;\n}\n\ninterface GeminiPart {\n text: string;\n}\n\ninterface GeminiContent {\n role: 'user' | 'model';\n parts: GeminiPart[];\n}\n\ninterface GeminiTool {\n functionDeclarations: Array<{\n name: string;\n description?: string;\n parameters?: any;\n }>;\n}\n\ninterface GeminiRequest {\n contents: GeminiContent[];\n generationConfig?: {\n temperature?: number;\n maxOutputTokens?: number;\n [key: string]: any;\n };\n tools?: GeminiTool[];\n}\n\nexport class AnthropicToGeminiProxy {\n private app: express.Application;\n private geminiApiKey: string;\n private geminiBaseUrl: string;\n private defaultModel: string;\n private authToken: string;\n private server?: Server;\n\n constructor(config: {\n geminiApiKey: string;\n geminiBaseUrl?: string;\n defaultModel?: string;\n /** Token clients must send; defaults to AGENTIC_FLOW_PROXY_TOKEN or a random one. */\n authToken?: string;\n }) {\n this.app = express();\n this.authToken = config.authToken || resolveProxyToken();\n this.geminiApiKey = config.geminiApiKey;\n this.geminiBaseUrl = config.geminiBaseUrl || 'https://generativelanguage.googleapis.com/v1beta';\n this.defaultModel = config.defaultModel || 'gemini-2.0-flash-exp';\n\n this.setupMiddleware();\n this.setupRoutes();\n }\n\n /** The token clients must present as x-api-key or Authorization: Bearer. */\n public getAuthToken(): string {\n return this.authToken;\n }\n\n private setupMiddleware(): void {\n // Reject unauthenticated callers before parsing their (up to 50mb) body\n this.app.use(createProxyAuthMiddleware(this.authToken));\n\n // Parse JSON bodies\n this.app.use(express.json({ limit: '50mb' }));\n\n // Logging middleware\n this.app.use((req: Request, res: Response, next: NextFunction) => {\n logger.debug('Gemini proxy request', {\n method: req.method,\n path: req.path,\n headers: Object.keys(req.headers)\n });\n next();\n });\n }\n\n private setupRoutes(): void {\n // Health check\n this.app.get('/health', (req: Request, res: Response) => {\n res.json({ status: 'ok', service: 'anthropic-to-gemini-proxy' });\n });\n\n // Anthropic Messages API → Gemini generateContent\n this.app.post('/v1/messages', async (req: Request, res: Response) => {\n try {\n const anthropicReq: AnthropicRequest = req.body;\n\n // Convert Anthropic format to Gemini format\n const geminiReq = this.convertAnthropicToGemini(anthropicReq);\n\n logger.info('Converting Anthropic request to Gemini', {\n anthropicModel: anthropicReq.model,\n geminiModel: this.defaultModel,\n messageCount: geminiReq.contents.length,\n stream: anthropicReq.stream,\n apiKeyPresent: !!this.geminiApiKey\n });\n\n // Determine endpoint based on streaming\n const endpoint = anthropicReq.stream ? 'streamGenerateContent' : 'generateContent';\n // BUG FIX: Add &alt=sse for streaming to get Server-Sent Events format\n const streamParam = anthropicReq.stream ? '&alt=sse' : '';\n const url = `${this.geminiBaseUrl}/models/${this.defaultModel}:${endpoint}?key=${this.geminiApiKey}${streamParam}`;\n\n // Forward to Gemini\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(geminiReq)\n });\n\n if (!response.ok) {\n const error = await response.text();\n logger.error('Gemini API error', { status: response.status, error });\n return res.status(response.status).json({\n error: {\n type: 'api_error',\n message: error\n }\n });\n }\n\n // Handle streaming vs non-streaming\n if (anthropicReq.stream) {\n // Stream response\n res.setHeader('Content-Type', 'text/event-stream');\n res.setHeader('Cache-Control', 'no-cache');\n res.setHeader('Connection', 'keep-alive');\n\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error('No response body');\n }\n\n const decoder = new TextDecoder();\n let chunkCount = 0;\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n const chunk = decoder.decode(value);\n chunkCount++;\n logger.debug('Gemini stream chunk received', { chunkCount, chunkLength: chunk.length, chunkPreview: chunk.substring(0, 200) });\n\n const anthropicChunk = this.convertGeminiStreamToAnthropic(chunk);\n logger.debug('Anthropic stream chunk generated', { chunkCount, anthropicLength: anthropicChunk.length, anthropicPreview: anthropicChunk.substring(0, 200) });\n\n res.write(anthropicChunk);\n }\n\n logger.info('Gemini stream complete', { totalChunks: chunkCount });\n res.end();\n } else {\n // Non-streaming response\n const geminiRes = await response.json();\n\n // DEBUG: Log raw Gemini response\n logger.debug('Raw Gemini API response', {\n hasResponse: !!geminiRes,\n hasCandidates: !!geminiRes.candidates,\n candidatesLength: geminiRes.candidates?.length,\n firstCandidate: geminiRes.candidates?.[0],\n fullResponse: JSON.stringify(geminiRes).substring(0, 500)\n });\n\n const anthropicRes = this.convertGeminiToAnthropic(geminiRes);\n\n logger.info('Gemini proxy response sent', {\n model: this.defaultModel,\n usage: anthropicRes.usage,\n contentBlocks: anthropicRes.content?.length,\n hasText: anthropicRes.content?.some((c: any) => c.type === 'text'),\n firstContent: anthropicRes.content?.[0]\n });\n\n res.json(anthropicRes);\n }\n } catch (error: any) {\n logger.error('Gemini proxy error', { error: error.message, stack: error.stack });\n res.status(500).json({\n error: {\n type: 'proxy_error',\n message: error.message\n }\n });\n }\n });\n\n // Fallback for other Anthropic API endpoints\n this.app.use((req: Request, res: Response) => {\n logger.warn('Unsupported endpoint', { path: req.path, method: req.method });\n res.status(404).json({\n error: {\n type: 'not_found',\n message: `Endpoint ${req.path} not supported by Gemini proxy`\n }\n });\n });\n }\n\n private convertAnthropicToGemini(anthropicReq: AnthropicRequest): GeminiRequest {\n const contents: GeminiContent[] = [];\n\n // Add system message as first user message if present\n // Gemini doesn't have a dedicated system role, so we prepend it to the first user message\n let systemPrefix = '';\n if (anthropicReq.system) {\n systemPrefix = `System: ${anthropicReq.system}\\n\\n`;\n }\n\n // Add tool instructions for Gemini to understand file operations\n // Since Gemini doesn't have native tool calling, we instruct it to use structured XML-like commands\n const toolInstructions = `\nIMPORTANT: You have access to file system operations through structured commands. Use these exact formats:\n\n<file_write path=\"filename.ext\">\ncontent here\n</file_write>\n\n<file_read path=\"filename.ext\"/>\n\n<bash_command>\ncommand here\n</bash_command>\n\nWhen you need to create, edit, or read files, use these structured commands in your response.\nThe system will automatically execute these commands and provide results.\n\n`;\n\n // Prepend tool instructions to system prompt\n if (systemPrefix) {\n systemPrefix = toolInstructions + systemPrefix;\n } else {\n systemPrefix = toolInstructions;\n }\n\n // Convert Anthropic messages to Gemini format\n for (let i = 0; i < anthropicReq.messages.length; i++) {\n const msg = anthropicReq.messages[i];\n let text: string;\n\n if (typeof msg.content === 'string') {\n text = msg.content;\n } else if (Array.isArray(msg.content)) {\n // Extract text from content blocks\n text = msg.content\n .filter(block => block.type === 'text')\n .map(block => block.text)\n .join('\\n');\n } else {\n text = '';\n }\n\n // Add system prefix to first user message\n if (i === 0 && msg.role === 'user' && systemPrefix) {\n text = systemPrefix + text;\n }\n\n contents.push({\n role: msg.role === 'assistant' ? 'model' : 'user',\n parts: [{ text }]\n });\n }\n\n const geminiReq: GeminiRequest = {\n contents\n };\n\n // Add generation config if temperature or max_tokens specified\n if (anthropicReq.temperature !== undefined || anthropicReq.max_tokens !== undefined) {\n geminiReq.generationConfig = {};\n\n if (anthropicReq.temperature !== undefined) {\n geminiReq.generationConfig.temperature = anthropicReq.temperature;\n }\n\n if (anthropicReq.max_tokens !== undefined) {\n geminiReq.generationConfig.maxOutputTokens = anthropicReq.max_tokens;\n }\n }\n\n // Convert MCP/Anthropic tools to Gemini tools format\n if (anthropicReq.tools && anthropicReq.tools.length > 0) {\n geminiReq.tools = [{\n functionDeclarations: anthropicReq.tools.map(tool => {\n // Clean schema: Remove fields that Gemini doesn't support\n const cleanSchema = (schema: any): any => {\n if (!schema || typeof schema !== 'object') return schema;\n\n const {\n $schema,\n additionalProperties,\n exclusiveMinimum,\n exclusiveMaximum,\n ...rest\n } = schema;\n const cleaned: any = { ...rest };\n\n // Recursively clean nested objects\n if (cleaned.properties) {\n cleaned.properties = Object.fromEntries(\n Object.entries(cleaned.properties).map(([key, value]: [string, any]) => [\n key,\n cleanSchema(value)\n ])\n );\n }\n\n // Clean items if present\n if (cleaned.items) {\n cleaned.items = cleanSchema(cleaned.items);\n }\n\n return cleaned;\n };\n\n return {\n name: tool.name,\n description: tool.description || '',\n parameters: cleanSchema(tool.input_schema) || {\n type: 'object',\n properties: {},\n required: []\n }\n };\n })\n }];\n\n logger.info('Forwarding MCP tools to Gemini', {\n toolCount: anthropicReq.tools.length,\n toolNames: anthropicReq.tools.map(t => t.name)\n });\n }\n\n return geminiReq;\n }\n\n private parseStructuredCommands(text: string): {\n cleanText: string;\n toolUses: any[]\n } {\n const toolUses: any[] = [];\n let cleanText = text;\n\n // Parse file_write commands\n const fileWriteRegex = /<file_write path=\"([^\"]+)\">([\\s\\S]*?)<\\/file_write>/g;\n let match;\n while ((match = fileWriteRegex.exec(text)) !== null) {\n toolUses.push({\n type: 'tool_use',\n id: `tool_${Date.now()}_${toolUses.length}`,\n name: 'Write',\n input: {\n file_path: match[1],\n content: match[2].trim()\n }\n });\n cleanText = cleanText.replace(match[0], `[File written: ${match[1]}]`);\n }\n\n // Parse file_read commands\n const fileReadRegex = /<file_read path=\"([^\"]+)\"\\/>/g;\n while ((match = fileReadRegex.exec(text)) !== null) {\n toolUses.push({\n type: 'tool_use',\n id: `tool_${Date.now()}_${toolUses.length}`,\n name: 'Read',\n input: {\n file_path: match[1]\n }\n });\n cleanText = cleanText.replace(match[0], `[Reading file: ${match[1]}]`);\n }\n\n // Parse bash commands\n const bashRegex = /<bash_command>([\\s\\S]*?)<\\/bash_command>/g;\n while ((match = bashRegex.exec(text)) !== null) {\n toolUses.push({\n type: 'tool_use',\n id: `tool_${Date.now()}_${toolUses.length}`,\n name: 'Bash',\n input: {\n command: match[1].trim()\n }\n });\n cleanText = cleanText.replace(match[0], `[Executing: ${match[1].trim()}]`);\n }\n\n return { cleanText: cleanText.trim(), toolUses };\n }\n\n private convertGeminiToAnthropic(geminiRes: any): any {\n const candidate = geminiRes.candidates?.[0];\n if (!candidate) {\n logger.error('No candidates in Gemini response', { geminiRes });\n throw new Error('No candidates in Gemini response');\n }\n\n const content = candidate.content;\n const parts = content?.parts || [];\n\n logger.info('Converting Gemini to Anthropic', {\n hasParts: !!parts,\n partsCount: parts.length,\n partTypes: parts.map((p: any) => Object.keys(p))\n });\n\n // Extract text and function calls\n let rawText = '';\n const functionCalls: any[] = [];\n\n for (const part of parts) {\n if (part.text) {\n rawText += part.text;\n logger.debug('Found text in part', { textLength: part.text.length, textPreview: part.text.substring(0, 100) });\n }\n if (part.functionCall) {\n functionCalls.push(part.functionCall);\n }\n }\n\n logger.debug('Extracted content from Gemini', {\n rawTextLength: rawText.length,\n functionCallsCount: functionCalls.length,\n rawTextPreview: rawText.substring(0, 200)\n });\n\n // Parse structured commands from Gemini's text response\n const { cleanText, toolUses } = this.parseStructuredCommands(rawText);\n\n // Build content array with text and tool uses\n const contentBlocks: any[] = [];\n\n if (cleanText) {\n contentBlocks.push({\n type: 'text',\n text: cleanText\n });\n }\n\n // Add tool uses from structured commands\n contentBlocks.push(...toolUses);\n\n // Add tool uses from Gemini function calls (MCP tools)\n if (functionCalls.length > 0) {\n for (const functionCall of functionCalls) {\n contentBlocks.push({\n type: 'tool_use',\n id: `tool_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,\n name: functionCall.name,\n input: functionCall.args || {}\n });\n }\n\n logger.info('Converted Gemini function calls to Anthropic format', {\n functionCallCount: functionCalls.length,\n functionNames: functionCalls.map((fc: any) => fc.name)\n });\n }\n\n return {\n id: `msg_${Date.now()}`,\n type: 'message',\n role: 'assistant',\n model: this.defaultModel,\n content: contentBlocks.length > 0 ? contentBlocks : [\n {\n type: 'text',\n text: rawText\n }\n ],\n stop_reason: this.mapFinishReason(candidate.finishReason),\n usage: {\n input_tokens: geminiRes.usageMetadata?.promptTokenCount || 0,\n output_tokens: geminiRes.usageMetadata?.candidatesTokenCount || 0\n }\n };\n }\n\n private convertGeminiStreamToAnthropic(chunk: string): string {\n // Gemini streaming returns Server-Sent Events format: \"data: {json}\"\n const lines = chunk.split('\\n').filter(line => line.trim());\n const anthropicChunks: string[] = [];\n\n for (const line of lines) {\n try {\n // Parse SSE format: \"data: {json}\"\n if (line.startsWith('data: ')) {\n const jsonStr = line.substring(6); // Remove \"data: \" prefix\n const parsed = JSON.parse(jsonStr);\n const candidate = parsed.candidates?.[0];\n const text = candidate?.content?.parts?.[0]?.text;\n\n if (text) {\n anthropicChunks.push(\n `event: content_block_delta\\ndata: ${JSON.stringify({\n type: 'content_block_delta',\n delta: { type: 'text_delta', text }\n })}\\n\\n`\n );\n }\n\n // Check for finish\n if (candidate?.finishReason) {\n anthropicChunks.push('event: message_stop\\ndata: {}\\n\\n');\n }\n }\n } catch (e) {\n // Ignore parse errors\n logger.debug('Failed to parse Gemini stream chunk', { line, error: (e as Error).message });\n }\n }\n\n return anthropicChunks.join('');\n }\n\n private mapFinishReason(reason?: string): string {\n const mapping: Record<string, string> = {\n 'STOP': 'end_turn',\n 'MAX_TOKENS': 'max_tokens',\n 'SAFETY': 'stop_sequence',\n 'RECITATION': 'stop_sequence',\n 'OTHER': 'end_turn'\n };\n return mapping[reason || 'STOP'] || 'end_turn';\n }\n\n /**\n * Start listening. Binds 127.0.0.1 unless `host` or AGENTIC_FLOW_PROXY_HOST\n * says otherwise. Returns the underlying server.\n */\n public start(port: number, host: string = resolveProxyHost()): Server {\n this.server = this.app.listen(port, host, () => {\n logger.info('Anthropic to Gemini proxy started', {\n port,\n host,\n geminiBaseUrl: this.geminiBaseUrl,\n defaultModel: this.defaultModel\n });\n console.log(`\\nāœ… Gemini Proxy running at http://${host}:${port}`);\n console.log(` Gemini Base URL: ${this.geminiBaseUrl}`);\n console.log(` Default Model: ${this.defaultModel}\\n`);\n });\n return this.server;\n }\n\n /** Stop listening. Safe to call when the proxy was never started. */\n public stop(): Promise<void> {\n const server = this.server;\n this.server = undefined;\n if (!server) return Promise.resolve();\n return new Promise((resolve, reject) => server.close(err => (err ? reject(err) : resolve())));\n }\n}\n\n// CLI entry point\nif (import.meta.url === `file://${process.argv[1]}`) {\n const port = parseInt(process.env.PORT || '3001');\n const geminiApiKey = process.env.GOOGLE_GEMINI_API_KEY;\n\n if (!geminiApiKey) {\n console.error('āŒ Error: GOOGLE_GEMINI_API_KEY environment variable required');\n process.exit(1);\n }\n\n const proxy = new AnthropicToGeminiProxy({\n geminiApiKey,\n geminiBaseUrl: process.env.GEMINI_BASE_URL,\n defaultModel: process.env.COMPLETION_MODEL || process.env.REASONING_MODEL\n });\n\n proxy.start(port);\n console.log(` Proxy token (send as x-api-key / ANTHROPIC_API_KEY): ${proxy.getAuthToken()}`);\n}\n"]}
1
+ {"version":3,"file":"anthropic-to-gemini.js","sourceRoot":"","sources":["../../src/proxy/anthropic-to-gemini.ts"],"names":[],"mappings":"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","sourcesContent":["// Anthropic to Gemini Proxy Server\n// Converts Anthropic API format to Google Gemini format\nimport express, { Request, Response, NextFunction } from 'express';\nimport type { Server } from 'http';\nimport { logger } from '../utils/logger.js';\nimport { createProxyAuthMiddleware, resolveProxyHost, resolveProxyToken } from './proxy-auth.js';\nimport { forEachSseLines, sseLines } from './sse-lines.js';\n\ninterface AnthropicMessage {\n role: 'user' | 'assistant';\n content: string | Array<{ type: string; text?: string; [key: string]: any }>;\n}\n\ninterface AnthropicTool {\n name: string;\n description?: string;\n input_schema?: {\n type: string;\n properties?: Record<string, any>;\n required?: string[];\n };\n}\n\ninterface AnthropicRequest {\n model?: string;\n messages: AnthropicMessage[];\n max_tokens?: number;\n temperature?: number;\n system?: string;\n stream?: boolean;\n tools?: AnthropicTool[];\n [key: string]: any;\n}\n\ninterface GeminiPart {\n text: string;\n}\n\ninterface GeminiContent {\n role: 'user' | 'model';\n parts: GeminiPart[];\n}\n\ninterface GeminiTool {\n functionDeclarations: Array<{\n name: string;\n description?: string;\n parameters?: any;\n }>;\n}\n\ninterface GeminiRequest {\n contents: GeminiContent[];\n generationConfig?: {\n temperature?: number;\n maxOutputTokens?: number;\n [key: string]: any;\n };\n tools?: GeminiTool[];\n}\n\nexport class AnthropicToGeminiProxy {\n private app: express.Application;\n private geminiApiKey: string;\n private geminiBaseUrl: string;\n private defaultModel: string;\n private authToken: string;\n private server?: Server;\n\n constructor(config: {\n geminiApiKey: string;\n geminiBaseUrl?: string;\n defaultModel?: string;\n /** Token clients must send; defaults to AGENTIC_FLOW_PROXY_TOKEN or a random one. */\n authToken?: string;\n }) {\n this.app = express();\n this.authToken = config.authToken || resolveProxyToken();\n this.geminiApiKey = config.geminiApiKey;\n this.geminiBaseUrl = config.geminiBaseUrl || 'https://generativelanguage.googleapis.com/v1beta';\n this.defaultModel = config.defaultModel || 'gemini-2.0-flash-exp';\n\n this.setupMiddleware();\n this.setupRoutes();\n }\n\n /** The token clients must present as x-api-key or Authorization: Bearer. */\n public getAuthToken(): string {\n return this.authToken;\n }\n\n private setupMiddleware(): void {\n // Reject unauthenticated callers before parsing their (up to 50mb) body\n this.app.use(createProxyAuthMiddleware(this.authToken));\n\n // Parse JSON bodies\n this.app.use(express.json({ limit: '50mb' }));\n\n // Logging middleware\n this.app.use((req: Request, res: Response, next: NextFunction) => {\n logger.debug('Gemini proxy request', {\n method: req.method,\n path: req.path,\n headers: Object.keys(req.headers)\n });\n next();\n });\n }\n\n private setupRoutes(): void {\n // Health check\n this.app.get('/health', (req: Request, res: Response) => {\n res.json({ status: 'ok', service: 'anthropic-to-gemini-proxy' });\n });\n\n // Anthropic Messages API → Gemini generateContent\n this.app.post('/v1/messages', async (req: Request, res: Response) => {\n try {\n const anthropicReq: AnthropicRequest = req.body;\n\n // Convert Anthropic format to Gemini format\n const geminiReq = this.convertAnthropicToGemini(anthropicReq);\n\n logger.info('Converting Anthropic request to Gemini', {\n anthropicModel: anthropicReq.model,\n geminiModel: this.defaultModel,\n messageCount: geminiReq.contents.length,\n stream: anthropicReq.stream,\n apiKeyPresent: !!this.geminiApiKey\n });\n\n // Determine endpoint based on streaming\n const endpoint = anthropicReq.stream ? 'streamGenerateContent' : 'generateContent';\n // BUG FIX: Add &alt=sse for streaming to get Server-Sent Events format\n const streamParam = anthropicReq.stream ? '&alt=sse' : '';\n const url = `${this.geminiBaseUrl}/models/${this.defaultModel}:${endpoint}?key=${this.geminiApiKey}${streamParam}`;\n\n // Forward to Gemini\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(geminiReq)\n });\n\n if (!response.ok) {\n const error = await response.text();\n logger.error('Gemini API error', { status: response.status, error });\n return res.status(response.status).json({\n error: {\n type: 'api_error',\n message: error\n }\n });\n }\n\n // Handle streaming vs non-streaming\n if (anthropicReq.stream) {\n // Stream response\n res.setHeader('Content-Type', 'text/event-stream');\n res.setHeader('Cache-Control', 'no-cache');\n res.setHeader('Connection', 'keep-alive');\n\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error('No response body');\n }\n\n const chunkCount = await forEachSseLines(reader, lines => {\n logger.debug('Gemini stream lines received', { length: lines.length, preview: lines.substring(0, 200) });\n const anthropicChunk = this.convertGeminiStreamToAnthropic(lines);\n logger.debug('Anthropic stream chunk generated', { anthropicLength: anthropicChunk.length, anthropicPreview: anthropicChunk.substring(0, 200) });\n if (anthropicChunk) res.write(anthropicChunk);\n });\n\n logger.info('Gemini stream complete', { totalChunks: chunkCount });\n res.end();\n } else {\n // Non-streaming response\n const geminiRes = await response.json();\n\n // DEBUG: Log raw Gemini response\n logger.debug('Raw Gemini API response', {\n hasResponse: !!geminiRes,\n hasCandidates: !!geminiRes.candidates,\n candidatesLength: geminiRes.candidates?.length,\n firstCandidate: geminiRes.candidates?.[0],\n fullResponse: JSON.stringify(geminiRes).substring(0, 500)\n });\n\n const anthropicRes = this.convertGeminiToAnthropic(geminiRes);\n\n logger.info('Gemini proxy response sent', {\n model: this.defaultModel,\n usage: anthropicRes.usage,\n contentBlocks: anthropicRes.content?.length,\n hasText: anthropicRes.content?.some((c: any) => c.type === 'text'),\n firstContent: anthropicRes.content?.[0]\n });\n\n res.json(anthropicRes);\n }\n } catch (error: any) {\n logger.error('Gemini proxy error', { error: error.message, stack: error.stack });\n res.status(500).json({\n error: {\n type: 'proxy_error',\n message: error.message\n }\n });\n }\n });\n\n // Fallback for other Anthropic API endpoints\n this.app.use((req: Request, res: Response) => {\n logger.warn('Unsupported endpoint', { path: req.path, method: req.method });\n res.status(404).json({\n error: {\n type: 'not_found',\n message: `Endpoint ${req.path} not supported by Gemini proxy`\n }\n });\n });\n }\n\n private convertAnthropicToGemini(anthropicReq: AnthropicRequest): GeminiRequest {\n const contents: GeminiContent[] = [];\n\n // Add system message as first user message if present\n // Gemini doesn't have a dedicated system role, so we prepend it to the first user message\n let systemPrefix = '';\n if (anthropicReq.system) {\n systemPrefix = `System: ${anthropicReq.system}\\n\\n`;\n }\n\n // Add tool instructions for Gemini to understand file operations\n // Since Gemini doesn't have native tool calling, we instruct it to use structured XML-like commands\n const toolInstructions = `\nIMPORTANT: You have access to file system operations through structured commands. Use these exact formats:\n\n<file_write path=\"filename.ext\">\ncontent here\n</file_write>\n\n<file_read path=\"filename.ext\"/>\n\n<bash_command>\ncommand here\n</bash_command>\n\nWhen you need to create, edit, or read files, use these structured commands in your response.\nThe system will automatically execute these commands and provide results.\n\n`;\n\n // Prepend tool instructions to system prompt\n if (systemPrefix) {\n systemPrefix = toolInstructions + systemPrefix;\n } else {\n systemPrefix = toolInstructions;\n }\n\n // Convert Anthropic messages to Gemini format\n for (let i = 0; i < anthropicReq.messages.length; i++) {\n const msg = anthropicReq.messages[i];\n let text: string;\n\n if (typeof msg.content === 'string') {\n text = msg.content;\n } else if (Array.isArray(msg.content)) {\n // Extract text from content blocks\n text = msg.content\n .filter(block => block.type === 'text')\n .map(block => block.text)\n .join('\\n');\n } else {\n text = '';\n }\n\n // Add system prefix to first user message\n if (i === 0 && msg.role === 'user' && systemPrefix) {\n text = systemPrefix + text;\n }\n\n contents.push({\n role: msg.role === 'assistant' ? 'model' : 'user',\n parts: [{ text }]\n });\n }\n\n const geminiReq: GeminiRequest = {\n contents\n };\n\n // Add generation config if temperature or max_tokens specified\n if (anthropicReq.temperature !== undefined || anthropicReq.max_tokens !== undefined) {\n geminiReq.generationConfig = {};\n\n if (anthropicReq.temperature !== undefined) {\n geminiReq.generationConfig.temperature = anthropicReq.temperature;\n }\n\n if (anthropicReq.max_tokens !== undefined) {\n geminiReq.generationConfig.maxOutputTokens = anthropicReq.max_tokens;\n }\n }\n\n // Convert MCP/Anthropic tools to Gemini tools format\n if (anthropicReq.tools && anthropicReq.tools.length > 0) {\n geminiReq.tools = [{\n functionDeclarations: anthropicReq.tools.map(tool => {\n // Clean schema: Remove fields that Gemini doesn't support\n const cleanSchema = (schema: any): any => {\n if (!schema || typeof schema !== 'object') return schema;\n\n const {\n $schema,\n additionalProperties,\n exclusiveMinimum,\n exclusiveMaximum,\n ...rest\n } = schema;\n const cleaned: any = { ...rest };\n\n // Recursively clean nested objects\n if (cleaned.properties) {\n cleaned.properties = Object.fromEntries(\n Object.entries(cleaned.properties).map(([key, value]: [string, any]) => [\n key,\n cleanSchema(value)\n ])\n );\n }\n\n // Clean items if present\n if (cleaned.items) {\n cleaned.items = cleanSchema(cleaned.items);\n }\n\n return cleaned;\n };\n\n return {\n name: tool.name,\n description: tool.description || '',\n parameters: cleanSchema(tool.input_schema) || {\n type: 'object',\n properties: {},\n required: []\n }\n };\n })\n }];\n\n logger.info('Forwarding MCP tools to Gemini', {\n toolCount: anthropicReq.tools.length,\n toolNames: anthropicReq.tools.map(t => t.name)\n });\n }\n\n return geminiReq;\n }\n\n private parseStructuredCommands(text: string): {\n cleanText: string;\n toolUses: any[]\n } {\n const toolUses: any[] = [];\n let cleanText = text;\n\n // Parse file_write commands\n const fileWriteRegex = /<file_write path=\"([^\"]+)\">([\\s\\S]*?)<\\/file_write>/g;\n let match;\n while ((match = fileWriteRegex.exec(text)) !== null) {\n toolUses.push({\n type: 'tool_use',\n id: `tool_${Date.now()}_${toolUses.length}`,\n name: 'Write',\n input: {\n file_path: match[1],\n content: match[2].trim()\n }\n });\n cleanText = cleanText.replace(match[0], `[File written: ${match[1]}]`);\n }\n\n // Parse file_read commands\n const fileReadRegex = /<file_read path=\"([^\"]+)\"\\/>/g;\n while ((match = fileReadRegex.exec(text)) !== null) {\n toolUses.push({\n type: 'tool_use',\n id: `tool_${Date.now()}_${toolUses.length}`,\n name: 'Read',\n input: {\n file_path: match[1]\n }\n });\n cleanText = cleanText.replace(match[0], `[Reading file: ${match[1]}]`);\n }\n\n // Parse bash commands\n const bashRegex = /<bash_command>([\\s\\S]*?)<\\/bash_command>/g;\n while ((match = bashRegex.exec(text)) !== null) {\n toolUses.push({\n type: 'tool_use',\n id: `tool_${Date.now()}_${toolUses.length}`,\n name: 'Bash',\n input: {\n command: match[1].trim()\n }\n });\n cleanText = cleanText.replace(match[0], `[Executing: ${match[1].trim()}]`);\n }\n\n return { cleanText: cleanText.trim(), toolUses };\n }\n\n private convertGeminiToAnthropic(geminiRes: any): any {\n const candidate = geminiRes.candidates?.[0];\n if (!candidate) {\n logger.error('No candidates in Gemini response', { geminiRes });\n throw new Error('No candidates in Gemini response');\n }\n\n const content = candidate.content;\n const parts = content?.parts || [];\n\n logger.info('Converting Gemini to Anthropic', {\n hasParts: !!parts,\n partsCount: parts.length,\n partTypes: parts.map((p: any) => Object.keys(p))\n });\n\n // Extract text and function calls\n let rawText = '';\n const functionCalls: any[] = [];\n\n for (const part of parts) {\n if (part.text) {\n rawText += part.text;\n logger.debug('Found text in part', { textLength: part.text.length, textPreview: part.text.substring(0, 100) });\n }\n if (part.functionCall) {\n functionCalls.push(part.functionCall);\n }\n }\n\n logger.debug('Extracted content from Gemini', {\n rawTextLength: rawText.length,\n functionCallsCount: functionCalls.length,\n rawTextPreview: rawText.substring(0, 200)\n });\n\n // Parse structured commands from Gemini's text response\n const { cleanText, toolUses } = this.parseStructuredCommands(rawText);\n\n // Build content array with text and tool uses\n const contentBlocks: any[] = [];\n\n if (cleanText) {\n contentBlocks.push({\n type: 'text',\n text: cleanText\n });\n }\n\n // Add tool uses from structured commands\n contentBlocks.push(...toolUses);\n\n // Add tool uses from Gemini function calls (MCP tools)\n if (functionCalls.length > 0) {\n for (const functionCall of functionCalls) {\n contentBlocks.push({\n type: 'tool_use',\n id: `tool_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,\n name: functionCall.name,\n input: functionCall.args || {}\n });\n }\n\n logger.info('Converted Gemini function calls to Anthropic format', {\n functionCallCount: functionCalls.length,\n functionNames: functionCalls.map((fc: any) => fc.name)\n });\n }\n\n return {\n id: `msg_${Date.now()}`,\n type: 'message',\n role: 'assistant',\n model: this.defaultModel,\n content: contentBlocks.length > 0 ? contentBlocks : [\n {\n type: 'text',\n text: rawText\n }\n ],\n stop_reason: this.mapFinishReason(candidate.finishReason),\n usage: {\n input_tokens: geminiRes.usageMetadata?.promptTokenCount || 0,\n output_tokens: geminiRes.usageMetadata?.candidatesTokenCount || 0\n }\n };\n }\n\n // Takes only complete lines; forEachSseLines buffers any partial tail.\n private convertGeminiStreamToAnthropic(chunk: string): string {\n // Gemini streaming returns Server-Sent Events format: \"data: {json}\"\n const lines = sseLines(chunk);\n const anthropicChunks: string[] = [];\n\n for (const line of lines) {\n try {\n // Parse SSE format: \"data: {json}\"\n if (line.startsWith('data: ')) {\n const jsonStr = line.substring(6); // Remove \"data: \" prefix\n const parsed = JSON.parse(jsonStr);\n const candidate = parsed.candidates?.[0];\n const text = candidate?.content?.parts?.[0]?.text;\n\n if (text) {\n anthropicChunks.push(\n `event: content_block_delta\\ndata: ${JSON.stringify({\n type: 'content_block_delta',\n delta: { type: 'text_delta', text }\n })}\\n\\n`\n );\n }\n\n // Check for finish\n if (candidate?.finishReason) {\n anthropicChunks.push('event: message_stop\\ndata: {}\\n\\n');\n }\n }\n } catch (e) {\n // Ignore parse errors\n logger.debug('Failed to parse Gemini stream chunk', { line, error: (e as Error).message });\n }\n }\n\n return anthropicChunks.join('');\n }\n\n private mapFinishReason(reason?: string): string {\n const mapping: Record<string, string> = {\n 'STOP': 'end_turn',\n 'MAX_TOKENS': 'max_tokens',\n 'SAFETY': 'stop_sequence',\n 'RECITATION': 'stop_sequence',\n 'OTHER': 'end_turn'\n };\n return mapping[reason || 'STOP'] || 'end_turn';\n }\n\n /**\n * Start listening. Binds 127.0.0.1 unless `host` or AGENTIC_FLOW_PROXY_HOST\n * says otherwise. Returns the underlying server.\n */\n public start(port: number, host: string = resolveProxyHost()): Server {\n this.server = this.app.listen(port, host, () => {\n logger.info('Anthropic to Gemini proxy started', {\n port,\n host,\n geminiBaseUrl: this.geminiBaseUrl,\n defaultModel: this.defaultModel\n });\n console.log(`\\nāœ… Gemini Proxy running at http://${host}:${port}`);\n console.log(` Gemini Base URL: ${this.geminiBaseUrl}`);\n console.log(` Default Model: ${this.defaultModel}\\n`);\n });\n return this.server;\n }\n\n /** Stop listening. Safe to call when the proxy was never started. */\n public stop(): Promise<void> {\n const server = this.server;\n this.server = undefined;\n if (!server) return Promise.resolve();\n return new Promise((resolve, reject) => server.close(err => (err ? reject(err) : resolve())));\n }\n}\n\n// CLI entry point\nif (import.meta.url === `file://${process.argv[1]}`) {\n const port = parseInt(process.env.PORT || '3001');\n const geminiApiKey = process.env.GOOGLE_GEMINI_API_KEY;\n\n if (!geminiApiKey) {\n console.error('āŒ Error: GOOGLE_GEMINI_API_KEY environment variable required');\n process.exit(1);\n }\n\n const proxy = new AnthropicToGeminiProxy({\n geminiApiKey,\n geminiBaseUrl: process.env.GEMINI_BASE_URL,\n defaultModel: process.env.COMPLETION_MODEL || process.env.REASONING_MODEL\n });\n\n proxy.start(port);\n console.log(` Proxy token (send as x-api-key / ANTHROPIC_API_KEY): ${proxy.getAuthToken()}`);\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"anthropic-to-openrouter.d.ts","sourceRoot":"","sources":["../../src/proxy/anthropic-to-openrouter.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAInC,OAAO,EAAE,iBAAiB,EAA2B,MAAM,+BAA+B,CAAC;AAsD3F,qBAAa,0BAA0B;IACrC,OAAO,CAAC,GAAG,CAAsB;IACjC,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,YAAY,CAAC,CAAoB;IACzC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,MAAM,CAAC,CAAS;gBAEZ,MAAM,EAAE;QAClB,gBAAgB,EAAE,MAAM,CAAC;QACzB,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,YAAY,CAAC,EAAE,iBAAiB,CAAC;QACjC,qFAAqF;QACrF,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB;IAqBD,4EAA4E;IACrE,YAAY,IAAI,MAAM;IAI7B,OAAO,CAAC,eAAe;IAkBvB,OAAO,CAAC,WAAW;YAsEL,aAAa;YAsBb,mBAAmB;YA2HnB,qBAAqB;YA8CrB,cAAc;IAqB5B,OAAO,CAAC,wBAAwB;IA8JhC,OAAO,CAAC,uBAAuB;IAsD/B,OAAO,CAAC,wBAAwB;IAoGhC,OAAO,CAAC,8BAA8B;IAkCtC,OAAO,CAAC,eAAe;IAMvB,OAAO,CAAC,eAAe;IAUvB;;;OAGG;IACI,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,MAA2B,GAAG,MAAM;IAqBrE,qEAAqE;IAC9D,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAM7B"}
1
+ {"version":3,"file":"anthropic-to-openrouter.d.ts","sourceRoot":"","sources":["../../src/proxy/anthropic-to-openrouter.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAInC,OAAO,EAAE,iBAAiB,EAA2B,MAAM,+BAA+B,CAAC;AAuD3F,qBAAa,0BAA0B;IACrC,OAAO,CAAC,GAAG,CAAsB;IACjC,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,YAAY,CAAC,CAAoB;IACzC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,MAAM,CAAC,CAAS;gBAEZ,MAAM,EAAE;QAClB,gBAAgB,EAAE,MAAM,CAAC;QACzB,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,YAAY,CAAC,EAAE,iBAAiB,CAAC;QACjC,qFAAqF;QACrF,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB;IAqBD,4EAA4E;IACrE,YAAY,IAAI,MAAM;IAI7B,OAAO,CAAC,eAAe;IAkBvB,OAAO,CAAC,WAAW;YAsEL,aAAa;YAsBb,mBAAmB;YAwGnB,qBAAqB;YA8CrB,cAAc;IAqB5B,OAAO,CAAC,wBAAwB;IA8JhC,OAAO,CAAC,uBAAuB;IAsD/B,OAAO,CAAC,wBAAwB;IAoGhC,OAAO,CAAC,8BAA8B;IAkCtC,OAAO,CAAC,eAAe;IAMvB,OAAO,CAAC,eAAe;IAUvB;;;OAGG;IACI,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,MAA2B,GAAG,MAAM;IAqBrE,qEAAqE;IAC9D,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAM7B"}
@@ -6,6 +6,7 @@ import { getMaxTokensForModel } from './provider-instructions.js';
6
6
  import { detectModelCapabilities } from '../utils/modelCapabilities.js';
7
7
  import { ToolEmulator, executeEmulation } from './tool-emulation.js';
8
8
  import { createProxyAuthMiddleware, resolveProxyHost, resolveProxyToken } from './proxy-auth.js';
9
+ import { forEachSseLines, sseLines } from './sse-lines.js';
9
10
  export class AnthropicToOpenRouterProxy {
10
11
  app;
11
12
  openrouterApiKey;
@@ -185,31 +186,11 @@ export class AnthropicToOpenRouterProxy {
185
186
  if (!reader) {
186
187
  throw new Error('No response body');
187
188
  }
188
- // {stream:true} keeps a multi-byte character split across reads intact,
189
- // and `pending` carries a partial SSE line over to the next read so a
190
- // data: line split mid-JSON is parsed once, whole.
191
- const decoder = new TextDecoder();
192
- let pending = '';
193
- while (true) {
194
- const { done, value } = await reader.read();
195
- if (done)
196
- break;
197
- pending += decoder.decode(value, { stream: true });
198
- const lastNewline = pending.lastIndexOf('\n');
199
- if (lastNewline === -1)
200
- continue;
201
- const complete = pending.slice(0, lastNewline + 1);
202
- pending = pending.slice(lastNewline + 1);
203
- const anthropicChunk = this.convertOpenAIStreamToAnthropic(complete);
204
- if (anthropicChunk)
205
- res.write(anthropicChunk);
206
- }
207
- pending += decoder.decode();
208
- if (pending.trim()) {
209
- const anthropicChunk = this.convertOpenAIStreamToAnthropic(pending);
189
+ await forEachSseLines(reader, lines => {
190
+ const anthropicChunk = this.convertOpenAIStreamToAnthropic(lines);
210
191
  if (anthropicChunk)
211
192
  res.write(anthropicChunk);
212
- }
193
+ });
213
194
  res.end();
214
195
  return null; // Already sent response
215
196
  }
@@ -566,10 +547,10 @@ export class AnthropicToOpenRouterProxy {
566
547
  logger.info('Conversion complete, returning Anthropic response');
567
548
  return result;
568
549
  }
569
- // Takes only complete lines; the streaming loop buffers any partial tail.
550
+ // Takes only complete lines; forEachSseLines buffers any partial tail.
570
551
  convertOpenAIStreamToAnthropic(chunk) {
571
552
  // Convert OpenAI SSE format to Anthropic SSE format
572
- const lines = chunk.split('\n').map(line => line.replace(/\r$/, '')).filter(line => line.trim());
553
+ const lines = sseLines(chunk);
573
554
  const anthropicChunks = [];
574
555
  for (const line of lines) {
575
556
  if (line.startsWith('data: ')) {