claude-flow-novice 2.16.0 → 2.16.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/cfn-extras/skills/GOOGLE_SHEETS_SKILLS_README.md +1 -1
- package/.claude/cfn-extras/skills/google-sheets-api-coordinator/SKILL.md +1 -1
- package/.claude/cfn-extras/skills/google-sheets-formula-builder/SKILL.md +1 -1
- package/.claude/cfn-extras/skills/google-sheets-progress/SKILL.md +1 -1
- package/.claude/commands/CFN_LOOP_FRONTEND.md +1 -1
- package/.claude/commands/cfn-loop-cli.md +124 -46
- package/.claude/commands/cfn-loop-frontend.md +1 -1
- package/.claude/commands/cfn-loop-task.md +2 -2
- package/.claude/commands/deprecated/cfn-loop.md +2 -2
- package/.claude/hooks/cfn-invoke-post-edit.sh +31 -5
- package/.claude/hooks/cfn-post-edit.config.json +9 -2
- package/.claude/root-claude-distribute/CFN-CLAUDE.md +1 -1
- package/.claude/skills/cfn-backlog-management/SKILL.md +1 -1
- package/.claude/skills/cfn-loop-orchestration/NORTH_STAR_INDEX.md +1 -1
- package/claude-assets/agents/cfn-dev-team/analysts/root-cause-analyst.md +2 -2
- package/claude-assets/agents/cfn-dev-team/architecture/base-template-generator.md +1 -1
- package/claude-assets/agents/cfn-dev-team/coordinators/cfn-frontend-coordinator.md +2 -2
- package/claude-assets/agents/cfn-dev-team/coordinators/handoff-coordinator.md +1 -1
- package/claude-assets/agents/cfn-dev-team/dev-ops/devops-engineer.md +1 -1
- package/claude-assets/agents/cfn-dev-team/dev-ops/docker-specialist.md +2 -2
- package/claude-assets/agents/cfn-dev-team/dev-ops/github-commit-agent.md +2 -2
- package/claude-assets/agents/cfn-dev-team/dev-ops/kubernetes-specialist.md +1 -1
- package/claude-assets/agents/cfn-dev-team/developers/api-gateway-specialist.md +1 -1
- package/claude-assets/agents/cfn-dev-team/developers/data/data-engineer.md +1 -1
- package/claude-assets/agents/cfn-dev-team/developers/database/database-architect.md +1 -1
- package/claude-assets/agents/cfn-dev-team/developers/frontend/typescript-specialist.md +1 -1
- package/claude-assets/agents/cfn-dev-team/developers/frontend/ui-designer.md +1 -1
- package/claude-assets/agents/cfn-dev-team/developers/graphql-specialist.md +1 -1
- package/claude-assets/agents/cfn-dev-team/documentation/pseudocode.md +1 -1
- package/claude-assets/agents/cfn-dev-team/product-owners/accessibility-advocate-persona.md +1 -1
- package/claude-assets/agents/cfn-dev-team/product-owners/cto-agent.md +1 -1
- package/claude-assets/agents/cfn-dev-team/product-owners/power-user-persona.md +1 -1
- package/claude-assets/agents/cfn-dev-team/reviewers/quality/security-specialist.md +1 -1
- package/claude-assets/agents/cfn-dev-team/testers/api-testing-specialist.md +1 -1
- package/claude-assets/agents/cfn-dev-team/testers/chaos-engineering-specialist.md +1 -1
- package/claude-assets/agents/cfn-dev-team/testers/contract-tester.md +1 -1
- package/claude-assets/agents/cfn-dev-team/testers/e2e/playwright-tester.md +1 -1
- package/claude-assets/agents/cfn-dev-team/testers/integration-tester.md +1 -1
- package/claude-assets/agents/cfn-dev-team/testers/load-testing-specialist.md +1 -1
- package/claude-assets/agents/cfn-dev-team/testers/mutation-testing-specialist.md +1 -1
- package/claude-assets/agents/cfn-dev-team/testers/unit/tdd-london-unit-swarm.md +1 -1
- package/claude-assets/agents/cfn-dev-team/utility/agent-builder.md +11 -0
- package/claude-assets/agents/cfn-dev-team/utility/analyst.md +1 -1
- package/claude-assets/agents/cfn-dev-team/utility/claude-code-expert.md +1 -1
- package/claude-assets/agents/cfn-dev-team/utility/epic-creator.md +1 -1
- package/claude-assets/agents/cfn-dev-team/utility/memory-leak-specialist.md +1 -1
- package/claude-assets/agents/cfn-dev-team/utility/researcher.md +1 -1
- package/claude-assets/agents/cfn-dev-team/utility/z-ai-specialist.md +1 -1
- package/claude-assets/agents/custom/cfn-docker-expert.md +1 -0
- package/claude-assets/agents/custom/cfn-loops-cli-expert.md +326 -17
- package/claude-assets/agents/custom/cfn-redis-operations.md +529 -529
- package/claude-assets/agents/custom/cfn-system-expert.md +1 -1
- package/claude-assets/agents/custom/trigger-dev-expert.md +369 -0
- package/claude-assets/agents/docker-team/micro-sprint-planner.md +747 -747
- package/claude-assets/agents/project-only-agents/npm-package-specialist.md +1 -1
- package/claude-assets/cfn-extras/skills/GOOGLE_SHEETS_SKILLS_README.md +1 -1
- package/claude-assets/cfn-extras/skills/google-sheets-api-coordinator/SKILL.md +1 -1
- package/claude-assets/cfn-extras/skills/google-sheets-formula-builder/SKILL.md +1 -1
- package/claude-assets/cfn-extras/skills/google-sheets-progress/SKILL.md +1 -1
- package/claude-assets/commands/CFN_LOOP_FRONTEND.md +1 -1
- package/claude-assets/commands/cfn-loop-cli.md +124 -46
- package/claude-assets/commands/cfn-loop-frontend.md +1 -1
- package/claude-assets/commands/cfn-loop-task.md +2 -2
- package/claude-assets/commands/deprecated/cfn-loop.md +2 -2
- package/claude-assets/hooks/GIT-HOOKS-USAGE-EXAMPLES.md +116 -0
- package/claude-assets/hooks/README-GIT-HOOKS.md +443 -0
- package/claude-assets/hooks/cfn-invoke-post-edit.sh +31 -5
- package/claude-assets/hooks/cfn-post-edit.config.json +9 -2
- package/claude-assets/hooks/install-git-hooks.sh +243 -0
- package/claude-assets/hooks/subagent-start.sh +98 -0
- package/claude-assets/hooks/subagent-stop.sh +93 -0
- package/claude-assets/hooks/validators/credential-scanner.sh +172 -0
- package/claude-assets/root-claude-distribute/CFN-CLAUDE.md +1 -1
- package/claude-assets/skills/cfn-backlog-management/SKILL.md +1 -1
- package/claude-assets/skills/cfn-dependency-ingestion/SKILL.md +41 -13
- package/claude-assets/skills/cfn-dependency-ingestion/ingest.sh +237 -0
- package/claude-assets/skills/cfn-dependency-ingestion/manifests/cli-mode-dependencies.txt +73 -0
- package/claude-assets/skills/cfn-dependency-ingestion/manifests/shared-dependencies.txt +57 -0
- package/claude-assets/skills/cfn-dependency-ingestion/manifests/trigger-dev-dependencies.txt +82 -0
- package/claude-assets/skills/cfn-dependency-ingestion/manifests/trigger-mode-dependencies.txt +80 -0
- package/claude-assets/skills/cfn-environment-sanitization/sanitize-environment.sh +14 -4
- package/claude-assets/skills/cfn-loop-orchestration/NORTH_STAR_INDEX.md +1 -1
- package/claude-assets/skills/cfn-provider-routing/SKILL.md +23 -0
- package/claude-assets/skills/docker-build/build.sh +1 -1
- package/dist/agent/skill-mcp-selector.js +2 -1
- package/dist/agent/skill-mcp-selector.js.map +1 -1
- package/dist/agents/agent-loader.js +165 -146
- package/dist/agents/agent-loader.js.map +1 -1
- package/dist/cli/agent-executor.js +470 -26
- package/dist/cli/agent-executor.js.map +1 -1
- package/dist/cli/agent-prompt-builder.js +2 -2
- package/dist/cli/agent-prompt-builder.js.map +1 -1
- package/dist/cli/agent-spawn.js +7 -4
- package/dist/cli/agent-spawn.js.map +1 -1
- package/dist/cli/agent-spawner.js +51 -4
- package/dist/cli/agent-spawner.js.map +1 -1
- package/dist/cli/agent-token-manager.js +2 -1
- package/dist/cli/agent-token-manager.js.map +1 -1
- package/dist/cli/anthropic-client.js +117 -11
- package/dist/cli/anthropic-client.js.map +1 -1
- package/dist/cli/cfn-context.js +2 -1
- package/dist/cli/cfn-context.js.map +1 -1
- package/dist/cli/cfn-metrics.js +2 -1
- package/dist/cli/cfn-metrics.js.map +1 -1
- package/dist/cli/cfn-redis.js +2 -1
- package/dist/cli/cfn-redis.js.map +1 -1
- package/dist/cli/cli-agent-context.js +2 -0
- package/dist/cli/cli-agent-context.js.map +1 -1
- package/dist/cli/config-manager.js +4 -252
- package/dist/cli/config-manager.js.map +1 -1
- package/dist/cli/conversation-fork-cleanup.js +2 -1
- package/dist/cli/conversation-fork-cleanup.js.map +1 -1
- package/dist/cli/conversation-fork.js +2 -1
- package/dist/cli/conversation-fork.js.map +1 -1
- package/dist/cli/coordination/agent-messaging.js +415 -0
- package/dist/cli/coordination/agent-messaging.js.map +1 -0
- package/dist/cli/coordination/wait-for-threshold.js +232 -0
- package/dist/cli/coordination/wait-for-threshold.js.map +1 -0
- package/dist/cli/iteration-history.js +2 -1
- package/dist/cli/iteration-history.js.map +1 -1
- package/dist/cli/process-lifecycle.js +5 -1
- package/dist/cli/process-lifecycle.js.map +1 -1
- package/dist/cli/spawn-agent-cli.js +41 -6
- package/dist/cli/spawn-agent-cli.js.map +1 -1
- package/dist/coordination/redis-waiting-mode.js +4 -0
- package/dist/coordination/redis-waiting-mode.js.map +1 -1
- package/dist/lib/artifact-registry.js +4 -0
- package/dist/lib/artifact-registry.js.map +1 -1
- package/dist/lib/connection-pool.js +390 -0
- package/dist/lib/connection-pool.js.map +1 -0
- package/dist/lib/environment-contract.js +258 -0
- package/dist/lib/environment-contract.js.map +1 -0
- package/dist/lib/query-optimizer.js +388 -0
- package/dist/lib/query-optimizer.js.map +1 -0
- package/dist/lib/result-cache.js +285 -0
- package/dist/lib/result-cache.js.map +1 -0
- package/dist/mcp/auth-middleware.js +2 -1
- package/dist/mcp/auth-middleware.js.map +1 -1
- package/dist/mcp/playwright-mcp-server-auth.js +2 -1
- package/dist/mcp/playwright-mcp-server-auth.js.map +1 -1
- package/package.json +3 -1
- package/scripts/build-agent-image.sh +1 -1
- package/scripts/cost-allocation-tracker.sh +632 -0
- package/scripts/docker-rebuild-all-agents.sh +2 -2
- package/scripts/reorganize-tests.sh +280 -0
- package/scripts/trigger-dev-setup.sh +12 -0
- package/tests/README.md +45 -0
- package/.claude/commands/cost-savings-status.md +0 -34
- package/.claude/commands/metrics-summary.md +0 -58
- package/claude-assets/agents/cfn-dev-team/dev-ops/monitoring-specialist.md +0 -768
- package/claude-assets/agents/custom/test-mcp-access.md +0 -24
- package/claude-assets/commands/cost-savings-status.md +0 -34
- package/claude-assets/commands/metrics-summary.md +0 -58
- package/tests/test-memory-leak-task-mode.sh +0 -435
|
@@ -266,8 +266,9 @@ let SkillMCPSelector = class SkillMCPSelector {
|
|
|
266
266
|
`MCP_SERVER=${serverName}`,
|
|
267
267
|
'-e',
|
|
268
268
|
`MCP_AUTH_REQUIRED=true`,
|
|
269
|
+
// FIX: Default to 'localhost' for host execution, Docker deployments should set CFN_REDIS_HOST explicitly
|
|
269
270
|
'-e',
|
|
270
|
-
`MCP_REDIS_URL=${process.env.CFN_REDIS_URL || process.env.MCP_REDIS_URL || `redis://${process.env.CFN_REDIS_HOST || '
|
|
271
|
+
`MCP_REDIS_URL=${process.env.CFN_REDIS_URL || process.env.MCP_REDIS_URL || `redis://${process.env.CFN_REDIS_HOST || 'localhost'}:${process.env.CFN_REDIS_PORT || 6379}`}`,
|
|
271
272
|
serverConfig.containerImage,
|
|
272
273
|
'node',
|
|
273
274
|
`/app/mcp-${serverName}-server.js`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/agent/skill-mcp-selector.js"],"sourcesContent":["/**\r\n * Skill-based MCP Selection System\r\n * Automatically selects MCP servers based on agent skills and requirements\r\n */\r\n\r\nconst fs = require('fs').promises;\r\nconst path = require('path');\r\nconst AgentTokenManager = require('../cli/agent-token-manager.js');\r\n\r\nclass SkillMCPSelector {\r\n constructor(options = {}) {\r\n this.tokenManager = new AgentTokenManager(options);\r\n this.agentConfigPath = options.agentConfigPath || './config/agent-whitelist.json';\r\n this.skillConfigPath = options.skillConfigPath || './config/skill-requirements.json';\r\n this.mcpServersPath = options.mcpServersPath || './config/mcp-servers.json';\r\n\r\n this.agentWhitelist = new Map();\r\n this.skillRequirements = new Map();\r\n this.mcpServers = new Map();\r\n }\r\n\r\n async initialize() {\r\n await this.tokenManager.initialize();\r\n await this.loadConfigurations();\r\n console.log('[SkillMCPSelector] Initialized successfully');\r\n }\r\n\r\n async loadConfigurations() {\r\n // Load agent whitelist\r\n const agentConfig = await this.loadJson(this.agentConfigPath);\r\n this.agentWhitelist.clear();\r\n for (const agent of agentConfig.agents) {\r\n this.agentWhitelist.set(agent.type, agent);\r\n }\r\n\r\n // Load skill requirements\r\n const skillConfig = await this.loadJson(this.skillConfigPath);\r\n this.skillRequirements.clear();\r\n for (const [tool, requirements] of Object.entries(skillConfig.tools)) {\r\n this.skillRequirements.set(tool, requirements);\r\n }\r\n\r\n // Load MCP server configurations\r\n try {\r\n const mcpConfig = await this.loadJson(this.mcpServersPath);\r\n for (const [name, config] of Object.entries(mcpConfig.servers)) {\r\n this.mcpServers.set(name, config);\r\n }\r\n } catch (error) {\r\n console.warn('[SkillMCPSelector] MCP servers config not found, using defaults');\r\n this.initializeDefaultMCPServers();\r\n }\r\n }\r\n\r\n async loadJson(filePath) {\r\n const resolvedPath = path.resolve(filePath);\r\n const content = await fs.readFile(resolvedPath, 'utf8');\r\n return JSON.parse(content);\r\n }\r\n\r\n initializeDefaultMCPServers() {\r\n // Default MCP server configurations\r\n const defaultServers = {\r\n 'playwright': {\r\n name: 'playwright',\r\n displayName: 'Playwright Browser Automation',\r\n description: 'Browser automation and screenshot capabilities',\r\n containerImage: 'claude-flow-novice:mcp-playwright',\r\n tools: ['take_screenshot', 'search_google', 'navigate_and_interact'],\r\n skills: ['browser-automation', 'screenshot-capture', 'web-interaction'],\r\n resourceRequirements: {\r\n memoryMB: 1024,\r\n cpuUnits: 2\r\n }\r\n },\r\n 'redis': {\r\n name: 'redis',\r\n displayName: 'Redis Database',\r\n description: 'Redis key-value store operations',\r\n containerImage: 'claude-flow-novice:mcp-redis',\r\n tools: ['redis_get', 'redis_set', 'redis_keys'],\r\n skills: ['redis-operations', 'cache-management'],\r\n resourceRequirements: {\r\n memoryMB: 256,\r\n cpuUnits: 1\r\n }\r\n },\r\n 'postgres': {\r\n name: 'postgres',\r\n displayName: 'PostgreSQL Database',\r\n description: 'PostgreSQL database operations',\r\n containerImage: 'claude-flow-novice:mcp-postgres',\r\n tools: ['postgres_query', 'postgres_schema', 'postgres_migrate'],\r\n skills: ['database-design', 'sql-operations'],\r\n resourceRequirements: {\r\n memoryMB: 512,\r\n cpuUnits: 2\r\n }\r\n },\r\n 'security-scanner': {\r\n name: 'security-scanner',\r\n displayName: 'Security Scanner',\r\n description: 'Security vulnerability scanning and analysis',\r\n containerImage: 'claude-flow-novice:mcp-security',\r\n tools: ['security_scan', 'vulnerability_check', 'compliance_validate'],\r\n skills: ['security-auditing', 'vulnerability-scanning'],\r\n resourceRequirements: {\r\n memoryMB: 1536,\r\n cpuUnits: 4\r\n }\r\n }\r\n };\r\n\r\n for (const [name, config] of Object.entries(defaultServers)) {\r\n this.mcpServers.set(name, config);\r\n }\r\n }\r\n\r\n /**\r\n * Determine which MCP servers an agent needs based on their skills\r\n */\r\n selectMCPServers(agentType, agentSkills = null) {\r\n const agentConfig = this.agentWhitelist.get(agentType);\r\n if (!agentConfig) {\r\n throw new Error(`Unknown agent type: ${agentType}`);\r\n }\r\n\r\n // Use provided skills or fall back to agent config\r\n const skills = agentSkills || agentConfig.skills;\r\n\r\n // Determine required MCP servers based on skills\r\n const requiredMCPServers = new Set();\r\n const skillToMCPServerMap = this.getSkillToMCPServerMapping();\r\n\r\n // Map skills to required MCP servers\r\n for (const skill of skills) {\r\n if (skillToMCPServerMap.has(skill)) {\r\n const servers = skillToMCPServerMap.get(skill);\r\n servers.forEach(server => requiredMCPServers.add(server));\r\n }\r\n }\r\n\r\n // Add explicitly allowed MCP servers from agent config\r\n if (agentConfig.allowedMcpServers) {\r\n agentConfig.allowedMcpServers.forEach(server => requiredMCPServers.add(server));\r\n }\r\n\r\n // Convert to array and sort by priority\r\n const selectedServers = Array.from(requiredMCPServers)\r\n .filter(server => this.mcpServers.has(server))\r\n .sort((a, b) => {\r\n const priorityA = this.mcpServers.get(a).priority || 999;\r\n const priorityB = this.mcpServers.get(b).priority || 999;\r\n return priorityA - priorityB;\r\n });\r\n\r\n return {\r\n agentType,\r\n agentSkills: skills,\r\n selectedMCPServers,\r\n serverDetails: selectedServers.map(server => this.mcpServers.get(server)),\r\n totalMemoryRequired: selectedServers.reduce((sum, server) =>\r\n sum + (this.mcpServers.get(server).resourceRequirements?.memoryMB || 512), 0),\r\n totalCPURequired: selectedServers.reduce((sum, server) =>\r\n sum + (this.mcpServers.get(server).resourceRequirements?.cpuUnits || 1), 0)\r\n };\r\n }\r\n\r\n /**\r\n * Get mapping from skills to required MCP servers\r\n */\r\n getSkillToMCPServerMapping() {\r\n const skillMap = new Map();\r\n\r\n // Build mapping from MCP server configurations\r\n for (const [serverName, serverConfig] of this.mcpServers.entries()) {\r\n for (const skill of serverConfig.skills || []) {\r\n if (!skillMap.has(skill)) {\r\n skillMap.set(skill, new Set());\r\n }\r\n skillMap.get(skill).add(serverName);\r\n }\r\n }\r\n\r\n // Also add mappings from tool requirements\r\n for (const [toolName, toolConfig] of this.skillRequirements.entries()) {\r\n for (const skill of toolConfig.requiredSkills || []) {\r\n // Find MCP servers that provide this tool\r\n for (const [serverName, serverConfig] of this.mcpServers.entries()) {\r\n if (serverConfig.tools?.includes(toolName)) {\r\n if (!skillMap.has(skill)) {\r\n skillMap.set(skill, new Set());\r\n }\r\n skillMap.get(skill).add(serverName);\r\n }\r\n }\r\n }\r\n }\r\n\r\n return skillMap;\r\n }\r\n\r\n /**\r\n * Generate tokens for selected MCP servers\r\n */\r\n async generateMCPTokens(agentType, selectedServers, options = {}) {\r\n const tokens = [];\r\n\r\n for (const serverName of selectedServers) {\r\n try {\r\n const serverConfig = this.mcpServers.get(serverName);\r\n if (!serverConfig) {\r\n console.warn(`[SkillMCPSelector] Server configuration not found: ${serverName}`);\r\n continue;\r\n }\r\n\r\n // Generate server-specific token\r\n const tokenData = await this.tokenManager.registerAgentToken(agentType, {\r\n expiresIn: options.expiresIn || '24h',\r\n description: `Token for ${serverConfig.displayName}`,\r\n createdBy: 'skill-mcp-selector',\r\n mcpServer: serverName\r\n });\r\n\r\n tokens.push({\r\n serverName,\r\n displayName: serverConfig.displayName,\r\n token: tokenData.token,\r\n expiresAt: tokenData.expiresAt,\r\n containerImage: serverConfig.containerImage,\r\n connectionInfo: this.generateConnectionInfo(serverName, serverConfig, tokenData.token)\r\n });\r\n\r\n console.log(`[SkillMCPSelector] Generated token for ${agentType} → ${serverName}`);\r\n } catch (error) {\r\n console.error(`[SkillMCPSelector] Failed to generate token for ${serverName}:`, error);\r\n }\r\n }\r\n\r\n return tokens;\r\n }\r\n\r\n /**\r\n * Generate connection information for MCP server\r\n */\r\n generateConnectionInfo(serverName, serverConfig, token) {\r\n const baseInfo = {\r\n serverName,\r\n token,\r\n authentication: {\r\n type: 'token-based',\r\n header: 'x-agent-token',\r\n agentTypeHeader: 'x-agent-type'\r\n }\r\n };\r\n\r\n // Add server-specific connection details\r\n if (serverConfig.connectionType === 'docker') {\r\n return {\r\n ...baseInfo,\r\n type: 'docker-container',\r\n containerName: `mcp-${serverName}`,\r\n containerImage: serverConfig.containerImage,\r\n dockerArgs: [\r\n 'run', '--rm', '--init',\r\n '--name', `mcp-${serverName}`,\r\n '--memory', `${serverConfig.resourceRequirements?.memoryMB || 512}m`,\r\n '--cpus', `${serverConfig.resourceRequirements?.cpuUnits || 1}`,\r\n '-e', `MCP_SERVER=${serverName}`,\r\n '-e', `MCP_AUTH_REQUIRED=true`,\r\n '-e', `MCP_REDIS_URL=${process.env.CFN_REDIS_URL || process.env.MCP_REDIS_URL || `redis://${process.env.CFN_REDIS_HOST || 'cfn-redis'}:${process.env.CFN_REDIS_PORT || 6379}`}`,\r\n serverConfig.containerImage,\r\n 'node', `/app/mcp-${serverName}-server.js`\r\n ]\r\n };\r\n } else {\r\n return {\r\n ...baseInfo,\r\n type: 'http-endpoint',\r\n url: serverConfig.url || `http://localhost:${3000 + this.mcpServers.size}`,\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'x-agent-token': token,\r\n 'x-agent-type': 'dynamic'\r\n }\r\n };\r\n }\r\n }\r\n\r\n /**\r\n * Get complete MCP configuration for an agent\r\n */\r\n async getAgentMCPConfiguration(agentType, agentSkills = null, options = {}) {\r\n try {\r\n // Select required MCP servers\r\n const selection = this.selectMCPServers(agentType, agentSkills);\r\n\r\n // Generate tokens for selected servers\r\n const tokens = await this.generateMCPTokens(\r\n agentType,\r\n selection.selectedMCPServers,\r\n options\r\n );\r\n\r\n return {\r\n agentType,\r\n agentSkills: selection.agentSkills,\r\n mcpConfiguration: {\r\n mcpServers: tokens.reduce((config, tokenInfo) => {\r\n config[tokenInfo.serverName] = {\r\n command: 'docker',\r\n args: tokenInfo.connectionInfo.dockerArgs,\r\n env: {\r\n 'MCP_SERVER': tokenInfo.serverName,\r\n 'MCP_AUTH_REQUIRED': 'true',\r\n 'AGENT_TOKEN': tokenInfo.token\r\n }\r\n };\r\n return config;\r\n }, {})\r\n },\r\n selection,\r\n tokens,\r\n resourceSummary: {\r\n totalMemoryMB: selection.totalMemoryRequired,\r\n totalCPUUnits: selection.totalCPUUnits,\r\n serverCount: selection.selectedMCPServers.length\r\n }\r\n };\r\n } catch (error) {\r\n console.error(`[SkillMCPSelector] Failed to get MCP configuration for ${agentType}:`, error);\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Generate Docker Compose configuration for agent with MCP servers\r\n */\r\n async generateDockerComposeConfiguration(agentType, agentSkills = null, options = {}) {\r\n const config = await this.getAgentMCPConfiguration(agentType, agentSkills, options);\r\n\r\n const dockerCompose = {\r\n version: '3.8',\r\n services: {},\r\n networks: {\r\n 'mcp-network': {\r\n driver: 'bridge'\r\n }\r\n }\r\n };\r\n\r\n // Add agent service\r\n dockerCompose.services[`${agentType}-agent`] = {\r\n image: 'claude-flow-novice:agent-container',\r\n container_name: `agent-${agentType}-${Date.now()}`,\r\n networks: ['mcp-network'],\r\n environment: {\r\n 'AGENT_TYPE': agentType,\r\n 'AGENT_MODE': 'containerized',\r\n 'MCP_AUTH_ENABLED': 'true',\r\n 'REDIS_URL': process.env.MCP_REDIS_URL || 'redis://redis:6379'\r\n },\r\n volumes: [\r\n '${PWD}/.claude:/app/.claude:ro',\r\n '${PWD}/screenshots:/app/screenshots'\r\n ],\r\n mem_limit: `${config.resourceSummary.totalMemoryMB + 512}m`,\r\n depends_on: config.selection.selectedMCPServers.map(server => `mcp-${server}`).join(' ')\r\n };\r\n\r\n // Add MCP server services\r\n for (const tokenInfo of config.tokens) {\r\n const serverName = `mcp-${tokenInfo.serverName}`;\r\n const serverConfig = this.mcpServers.get(tokenInfo.serverName);\r\n\r\n dockerCompose.services[serverName] = {\r\n image: tokenInfo.containerImage,\r\n container_name: `${serverName}-${Date.now()}`,\r\n networks: ['mcp-network'],\r\n environment: {\r\n 'MCP_SERVER': tokenInfo.serverName,\r\n 'MCP_AUTH_REQUIRED': 'true',\r\n 'MCP_REDIS_URL': process.env.MCP_REDIS_URL || 'redis://redis:6379',\r\n 'AGENT_TOKEN': tokenInfo.token\r\n },\r\n volumes: [\r\n '${PWD}/screenshots:/app/screenshots'\r\n ],\r\n mem_limit: `${serverConfig.resourceRequirements?.memoryMB || 512}m`,\r\n cpus: `${(serverConfig.resourceRequirements?.cpuUnits || 1) / 4}`\r\n };\r\n }\r\n\r\n // Add Redis service if not present\r\n if (!dockerCompose.services.redis) {\r\n dockerCompose.services.redis = {\r\n image: 'redis:7-alpine',\r\n container_name: 'mcp-redis',\r\n networks: ['mcp-network'],\r\n volumes: ['redis-data:/data'],\r\n mem_limit: '256m'\r\n };\r\n dockerCompose.volumes = {\r\n 'redis-data': {}\r\n };\r\n }\r\n\r\n return dockerCompose;\r\n }\r\n\r\n /**\r\n * Get statistics about skill-MCP mappings\r\n */\r\n getStatistics() {\r\n const skillMap = this.getSkillToMCPServerMapping();\r\n\r\n return {\r\n totalAgents: this.agentWhitelist.size,\r\n totalMCPServers: this.mcpServers.size,\r\n totalSkills: skillMap.size,\r\n agentTypes: Array.from(this.agentWhitelist.keys()),\r\n mcpServerNames: Array.from(this.mcpServers.keys()),\r\n skillCoverage: Array.from(skillMap.entries()).map(([skill, servers]) => ({\r\n skill,\r\n requiredServers: Array.from(servers),\r\n serverCount: servers.size\r\n }))\r\n };\r\n }\r\n\r\n /**\r\n * Validate agent-MCP configuration\r\n */\r\n validateConfiguration(agentType, mcpConfiguration) {\r\n const agentConfig = this.agentWhitelist.get(agentType);\r\n if (!agentConfig) {\r\n return { valid: false, errors: [`Unknown agent type: ${agentType}`] };\r\n }\r\n\r\n const errors = [];\r\n const warnings = [];\r\n\r\n // Check required MCP servers\r\n const requiredServers = agentConfig.allowedMcpServers || [];\r\n const configuredServers = Object.keys(mcpConfiguration.mcpServers || {});\r\n\r\n for (const server of requiredServers) {\r\n if (!configuredServers.includes(server)) {\r\n errors.push(`Required MCP server missing: ${server}`);\r\n }\r\n }\r\n\r\n // Check for unauthorized servers\r\n for (const server of configuredServers) {\r\n if (!requiredServers.includes(server)) {\r\n warnings.push(`Potentially unauthorized MCP server: ${server}`);\r\n }\r\n }\r\n\r\n return {\r\n valid: errors.length === 0,\r\n errors,\r\n warnings\r\n };\r\n }\r\n\r\n async shutdown() {\r\n await this.tokenManager.shutdown();\r\n }\r\n}\r\n\r\nmodule.exports = SkillMCPSelector;"],"names":["fs","require","promises","path","AgentTokenManager","SkillMCPSelector","options","tokenManager","agentConfigPath","skillConfigPath","mcpServersPath","agentWhitelist","Map","skillRequirements","mcpServers","initialize","loadConfigurations","console","log","agentConfig","loadJson","clear","agent","agents","set","type","skillConfig","tool","requirements","Object","entries","tools","mcpConfig","name","config","servers","error","warn","initializeDefaultMCPServers","filePath","resolvedPath","resolve","content","readFile","JSON","parse","defaultServers","displayName","description","containerImage","skills","resourceRequirements","memoryMB","cpuUnits","selectMCPServers","agentType","agentSkills","get","Error","requiredMCPServers","Set","skillToMCPServerMap","getSkillToMCPServerMapping","skill","has","forEach","server","add","allowedMcpServers","selectedServers","Array","from","filter","sort","a","b","priorityA","priority","priorityB","selectedMCPServers","serverDetails","map","totalMemoryRequired","reduce","sum","totalCPURequired","skillMap","serverName","serverConfig","toolName","toolConfig","requiredSkills","includes","generateMCPTokens","tokens","tokenData","registerAgentToken","expiresIn","createdBy","mcpServer","push","token","expiresAt","connectionInfo","generateConnectionInfo","baseInfo","authentication","header","agentTypeHeader","connectionType","containerName","dockerArgs","process","env","CFN_REDIS_URL","MCP_REDIS_URL","CFN_REDIS_HOST","CFN_REDIS_PORT","url","size","headers","getAgentMCPConfiguration","selection","mcpConfiguration","tokenInfo","command","args","resourceSummary","totalMemoryMB","totalCPUUnits","serverCount","length","generateDockerComposeConfiguration","dockerCompose","version","services","networks","driver","image","container_name","Date","now","environment","volumes","mem_limit","depends_on","join","cpus","redis","getStatistics","totalAgents","totalMCPServers","totalSkills","agentTypes","keys","mcpServerNames","skillCoverage","requiredServers","validateConfiguration","valid","errors","warnings","configuredServers","shutdown","module","exports"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/agent/skill-mcp-selector.js"],"sourcesContent":["/**\r\n * Skill-based MCP Selection System\r\n * Automatically selects MCP servers based on agent skills and requirements\r\n */\r\n\r\nconst fs = require('fs').promises;\r\nconst path = require('path');\r\nconst AgentTokenManager = require('../cli/agent-token-manager.js');\r\n\r\nclass SkillMCPSelector {\r\n constructor(options = {}) {\r\n this.tokenManager = new AgentTokenManager(options);\r\n this.agentConfigPath = options.agentConfigPath || './config/agent-whitelist.json';\r\n this.skillConfigPath = options.skillConfigPath || './config/skill-requirements.json';\r\n this.mcpServersPath = options.mcpServersPath || './config/mcp-servers.json';\r\n\r\n this.agentWhitelist = new Map();\r\n this.skillRequirements = new Map();\r\n this.mcpServers = new Map();\r\n }\r\n\r\n async initialize() {\r\n await this.tokenManager.initialize();\r\n await this.loadConfigurations();\r\n console.log('[SkillMCPSelector] Initialized successfully');\r\n }\r\n\r\n async loadConfigurations() {\r\n // Load agent whitelist\r\n const agentConfig = await this.loadJson(this.agentConfigPath);\r\n this.agentWhitelist.clear();\r\n for (const agent of agentConfig.agents) {\r\n this.agentWhitelist.set(agent.type, agent);\r\n }\r\n\r\n // Load skill requirements\r\n const skillConfig = await this.loadJson(this.skillConfigPath);\r\n this.skillRequirements.clear();\r\n for (const [tool, requirements] of Object.entries(skillConfig.tools)) {\r\n this.skillRequirements.set(tool, requirements);\r\n }\r\n\r\n // Load MCP server configurations\r\n try {\r\n const mcpConfig = await this.loadJson(this.mcpServersPath);\r\n for (const [name, config] of Object.entries(mcpConfig.servers)) {\r\n this.mcpServers.set(name, config);\r\n }\r\n } catch (error) {\r\n console.warn('[SkillMCPSelector] MCP servers config not found, using defaults');\r\n this.initializeDefaultMCPServers();\r\n }\r\n }\r\n\r\n async loadJson(filePath) {\r\n const resolvedPath = path.resolve(filePath);\r\n const content = await fs.readFile(resolvedPath, 'utf8');\r\n return JSON.parse(content);\r\n }\r\n\r\n initializeDefaultMCPServers() {\r\n // Default MCP server configurations\r\n const defaultServers = {\r\n 'playwright': {\r\n name: 'playwright',\r\n displayName: 'Playwright Browser Automation',\r\n description: 'Browser automation and screenshot capabilities',\r\n containerImage: 'claude-flow-novice:mcp-playwright',\r\n tools: ['take_screenshot', 'search_google', 'navigate_and_interact'],\r\n skills: ['browser-automation', 'screenshot-capture', 'web-interaction'],\r\n resourceRequirements: {\r\n memoryMB: 1024,\r\n cpuUnits: 2\r\n }\r\n },\r\n 'redis': {\r\n name: 'redis',\r\n displayName: 'Redis Database',\r\n description: 'Redis key-value store operations',\r\n containerImage: 'claude-flow-novice:mcp-redis',\r\n tools: ['redis_get', 'redis_set', 'redis_keys'],\r\n skills: ['redis-operations', 'cache-management'],\r\n resourceRequirements: {\r\n memoryMB: 256,\r\n cpuUnits: 1\r\n }\r\n },\r\n 'postgres': {\r\n name: 'postgres',\r\n displayName: 'PostgreSQL Database',\r\n description: 'PostgreSQL database operations',\r\n containerImage: 'claude-flow-novice:mcp-postgres',\r\n tools: ['postgres_query', 'postgres_schema', 'postgres_migrate'],\r\n skills: ['database-design', 'sql-operations'],\r\n resourceRequirements: {\r\n memoryMB: 512,\r\n cpuUnits: 2\r\n }\r\n },\r\n 'security-scanner': {\r\n name: 'security-scanner',\r\n displayName: 'Security Scanner',\r\n description: 'Security vulnerability scanning and analysis',\r\n containerImage: 'claude-flow-novice:mcp-security',\r\n tools: ['security_scan', 'vulnerability_check', 'compliance_validate'],\r\n skills: ['security-auditing', 'vulnerability-scanning'],\r\n resourceRequirements: {\r\n memoryMB: 1536,\r\n cpuUnits: 4\r\n }\r\n }\r\n };\r\n\r\n for (const [name, config] of Object.entries(defaultServers)) {\r\n this.mcpServers.set(name, config);\r\n }\r\n }\r\n\r\n /**\r\n * Determine which MCP servers an agent needs based on their skills\r\n */\r\n selectMCPServers(agentType, agentSkills = null) {\r\n const agentConfig = this.agentWhitelist.get(agentType);\r\n if (!agentConfig) {\r\n throw new Error(`Unknown agent type: ${agentType}`);\r\n }\r\n\r\n // Use provided skills or fall back to agent config\r\n const skills = agentSkills || agentConfig.skills;\r\n\r\n // Determine required MCP servers based on skills\r\n const requiredMCPServers = new Set();\r\n const skillToMCPServerMap = this.getSkillToMCPServerMapping();\r\n\r\n // Map skills to required MCP servers\r\n for (const skill of skills) {\r\n if (skillToMCPServerMap.has(skill)) {\r\n const servers = skillToMCPServerMap.get(skill);\r\n servers.forEach(server => requiredMCPServers.add(server));\r\n }\r\n }\r\n\r\n // Add explicitly allowed MCP servers from agent config\r\n if (agentConfig.allowedMcpServers) {\r\n agentConfig.allowedMcpServers.forEach(server => requiredMCPServers.add(server));\r\n }\r\n\r\n // Convert to array and sort by priority\r\n const selectedServers = Array.from(requiredMCPServers)\r\n .filter(server => this.mcpServers.has(server))\r\n .sort((a, b) => {\r\n const priorityA = this.mcpServers.get(a).priority || 999;\r\n const priorityB = this.mcpServers.get(b).priority || 999;\r\n return priorityA - priorityB;\r\n });\r\n\r\n return {\r\n agentType,\r\n agentSkills: skills,\r\n selectedMCPServers,\r\n serverDetails: selectedServers.map(server => this.mcpServers.get(server)),\r\n totalMemoryRequired: selectedServers.reduce((sum, server) =>\r\n sum + (this.mcpServers.get(server).resourceRequirements?.memoryMB || 512), 0),\r\n totalCPURequired: selectedServers.reduce((sum, server) =>\r\n sum + (this.mcpServers.get(server).resourceRequirements?.cpuUnits || 1), 0)\r\n };\r\n }\r\n\r\n /**\r\n * Get mapping from skills to required MCP servers\r\n */\r\n getSkillToMCPServerMapping() {\r\n const skillMap = new Map();\r\n\r\n // Build mapping from MCP server configurations\r\n for (const [serverName, serverConfig] of this.mcpServers.entries()) {\r\n for (const skill of serverConfig.skills || []) {\r\n if (!skillMap.has(skill)) {\r\n skillMap.set(skill, new Set());\r\n }\r\n skillMap.get(skill).add(serverName);\r\n }\r\n }\r\n\r\n // Also add mappings from tool requirements\r\n for (const [toolName, toolConfig] of this.skillRequirements.entries()) {\r\n for (const skill of toolConfig.requiredSkills || []) {\r\n // Find MCP servers that provide this tool\r\n for (const [serverName, serverConfig] of this.mcpServers.entries()) {\r\n if (serverConfig.tools?.includes(toolName)) {\r\n if (!skillMap.has(skill)) {\r\n skillMap.set(skill, new Set());\r\n }\r\n skillMap.get(skill).add(serverName);\r\n }\r\n }\r\n }\r\n }\r\n\r\n return skillMap;\r\n }\r\n\r\n /**\r\n * Generate tokens for selected MCP servers\r\n */\r\n async generateMCPTokens(agentType, selectedServers, options = {}) {\r\n const tokens = [];\r\n\r\n for (const serverName of selectedServers) {\r\n try {\r\n const serverConfig = this.mcpServers.get(serverName);\r\n if (!serverConfig) {\r\n console.warn(`[SkillMCPSelector] Server configuration not found: ${serverName}`);\r\n continue;\r\n }\r\n\r\n // Generate server-specific token\r\n const tokenData = await this.tokenManager.registerAgentToken(agentType, {\r\n expiresIn: options.expiresIn || '24h',\r\n description: `Token for ${serverConfig.displayName}`,\r\n createdBy: 'skill-mcp-selector',\r\n mcpServer: serverName\r\n });\r\n\r\n tokens.push({\r\n serverName,\r\n displayName: serverConfig.displayName,\r\n token: tokenData.token,\r\n expiresAt: tokenData.expiresAt,\r\n containerImage: serverConfig.containerImage,\r\n connectionInfo: this.generateConnectionInfo(serverName, serverConfig, tokenData.token)\r\n });\r\n\r\n console.log(`[SkillMCPSelector] Generated token for ${agentType} → ${serverName}`);\r\n } catch (error) {\r\n console.error(`[SkillMCPSelector] Failed to generate token for ${serverName}:`, error);\r\n }\r\n }\r\n\r\n return tokens;\r\n }\r\n\r\n /**\r\n * Generate connection information for MCP server\r\n */\r\n generateConnectionInfo(serverName, serverConfig, token) {\r\n const baseInfo = {\r\n serverName,\r\n token,\r\n authentication: {\r\n type: 'token-based',\r\n header: 'x-agent-token',\r\n agentTypeHeader: 'x-agent-type'\r\n }\r\n };\r\n\r\n // Add server-specific connection details\r\n if (serverConfig.connectionType === 'docker') {\r\n return {\r\n ...baseInfo,\r\n type: 'docker-container',\r\n containerName: `mcp-${serverName}`,\r\n containerImage: serverConfig.containerImage,\r\n dockerArgs: [\r\n 'run', '--rm', '--init',\r\n '--name', `mcp-${serverName}`,\r\n '--memory', `${serverConfig.resourceRequirements?.memoryMB || 512}m`,\r\n '--cpus', `${serverConfig.resourceRequirements?.cpuUnits || 1}`,\r\n '-e', `MCP_SERVER=${serverName}`,\r\n '-e', `MCP_AUTH_REQUIRED=true`,\r\n // FIX: Default to 'localhost' for host execution, Docker deployments should set CFN_REDIS_HOST explicitly\r\n '-e', `MCP_REDIS_URL=${process.env.CFN_REDIS_URL || process.env.MCP_REDIS_URL || `redis://${process.env.CFN_REDIS_HOST || 'localhost'}:${process.env.CFN_REDIS_PORT || 6379}`}`,\r\n serverConfig.containerImage,\r\n 'node', `/app/mcp-${serverName}-server.js`\r\n ]\r\n };\r\n } else {\r\n return {\r\n ...baseInfo,\r\n type: 'http-endpoint',\r\n url: serverConfig.url || `http://localhost:${3000 + this.mcpServers.size}`,\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'x-agent-token': token,\r\n 'x-agent-type': 'dynamic'\r\n }\r\n };\r\n }\r\n }\r\n\r\n /**\r\n * Get complete MCP configuration for an agent\r\n */\r\n async getAgentMCPConfiguration(agentType, agentSkills = null, options = {}) {\r\n try {\r\n // Select required MCP servers\r\n const selection = this.selectMCPServers(agentType, agentSkills);\r\n\r\n // Generate tokens for selected servers\r\n const tokens = await this.generateMCPTokens(\r\n agentType,\r\n selection.selectedMCPServers,\r\n options\r\n );\r\n\r\n return {\r\n agentType,\r\n agentSkills: selection.agentSkills,\r\n mcpConfiguration: {\r\n mcpServers: tokens.reduce((config, tokenInfo) => {\r\n config[tokenInfo.serverName] = {\r\n command: 'docker',\r\n args: tokenInfo.connectionInfo.dockerArgs,\r\n env: {\r\n 'MCP_SERVER': tokenInfo.serverName,\r\n 'MCP_AUTH_REQUIRED': 'true',\r\n 'AGENT_TOKEN': tokenInfo.token\r\n }\r\n };\r\n return config;\r\n }, {})\r\n },\r\n selection,\r\n tokens,\r\n resourceSummary: {\r\n totalMemoryMB: selection.totalMemoryRequired,\r\n totalCPUUnits: selection.totalCPUUnits,\r\n serverCount: selection.selectedMCPServers.length\r\n }\r\n };\r\n } catch (error) {\r\n console.error(`[SkillMCPSelector] Failed to get MCP configuration for ${agentType}:`, error);\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Generate Docker Compose configuration for agent with MCP servers\r\n */\r\n async generateDockerComposeConfiguration(agentType, agentSkills = null, options = {}) {\r\n const config = await this.getAgentMCPConfiguration(agentType, agentSkills, options);\r\n\r\n const dockerCompose = {\r\n version: '3.8',\r\n services: {},\r\n networks: {\r\n 'mcp-network': {\r\n driver: 'bridge'\r\n }\r\n }\r\n };\r\n\r\n // Add agent service\r\n dockerCompose.services[`${agentType}-agent`] = {\r\n image: 'claude-flow-novice:agent-container',\r\n container_name: `agent-${agentType}-${Date.now()}`,\r\n networks: ['mcp-network'],\r\n environment: {\r\n 'AGENT_TYPE': agentType,\r\n 'AGENT_MODE': 'containerized',\r\n 'MCP_AUTH_ENABLED': 'true',\r\n 'REDIS_URL': process.env.MCP_REDIS_URL || 'redis://redis:6379'\r\n },\r\n volumes: [\r\n '${PWD}/.claude:/app/.claude:ro',\r\n '${PWD}/screenshots:/app/screenshots'\r\n ],\r\n mem_limit: `${config.resourceSummary.totalMemoryMB + 512}m`,\r\n depends_on: config.selection.selectedMCPServers.map(server => `mcp-${server}`).join(' ')\r\n };\r\n\r\n // Add MCP server services\r\n for (const tokenInfo of config.tokens) {\r\n const serverName = `mcp-${tokenInfo.serverName}`;\r\n const serverConfig = this.mcpServers.get(tokenInfo.serverName);\r\n\r\n dockerCompose.services[serverName] = {\r\n image: tokenInfo.containerImage,\r\n container_name: `${serverName}-${Date.now()}`,\r\n networks: ['mcp-network'],\r\n environment: {\r\n 'MCP_SERVER': tokenInfo.serverName,\r\n 'MCP_AUTH_REQUIRED': 'true',\r\n 'MCP_REDIS_URL': process.env.MCP_REDIS_URL || 'redis://redis:6379',\r\n 'AGENT_TOKEN': tokenInfo.token\r\n },\r\n volumes: [\r\n '${PWD}/screenshots:/app/screenshots'\r\n ],\r\n mem_limit: `${serverConfig.resourceRequirements?.memoryMB || 512}m`,\r\n cpus: `${(serverConfig.resourceRequirements?.cpuUnits || 1) / 4}`\r\n };\r\n }\r\n\r\n // Add Redis service if not present\r\n if (!dockerCompose.services.redis) {\r\n dockerCompose.services.redis = {\r\n image: 'redis:7-alpine',\r\n container_name: 'mcp-redis',\r\n networks: ['mcp-network'],\r\n volumes: ['redis-data:/data'],\r\n mem_limit: '256m'\r\n };\r\n dockerCompose.volumes = {\r\n 'redis-data': {}\r\n };\r\n }\r\n\r\n return dockerCompose;\r\n }\r\n\r\n /**\r\n * Get statistics about skill-MCP mappings\r\n */\r\n getStatistics() {\r\n const skillMap = this.getSkillToMCPServerMapping();\r\n\r\n return {\r\n totalAgents: this.agentWhitelist.size,\r\n totalMCPServers: this.mcpServers.size,\r\n totalSkills: skillMap.size,\r\n agentTypes: Array.from(this.agentWhitelist.keys()),\r\n mcpServerNames: Array.from(this.mcpServers.keys()),\r\n skillCoverage: Array.from(skillMap.entries()).map(([skill, servers]) => ({\r\n skill,\r\n requiredServers: Array.from(servers),\r\n serverCount: servers.size\r\n }))\r\n };\r\n }\r\n\r\n /**\r\n * Validate agent-MCP configuration\r\n */\r\n validateConfiguration(agentType, mcpConfiguration) {\r\n const agentConfig = this.agentWhitelist.get(agentType);\r\n if (!agentConfig) {\r\n return { valid: false, errors: [`Unknown agent type: ${agentType}`] };\r\n }\r\n\r\n const errors = [];\r\n const warnings = [];\r\n\r\n // Check required MCP servers\r\n const requiredServers = agentConfig.allowedMcpServers || [];\r\n const configuredServers = Object.keys(mcpConfiguration.mcpServers || {});\r\n\r\n for (const server of requiredServers) {\r\n if (!configuredServers.includes(server)) {\r\n errors.push(`Required MCP server missing: ${server}`);\r\n }\r\n }\r\n\r\n // Check for unauthorized servers\r\n for (const server of configuredServers) {\r\n if (!requiredServers.includes(server)) {\r\n warnings.push(`Potentially unauthorized MCP server: ${server}`);\r\n }\r\n }\r\n\r\n return {\r\n valid: errors.length === 0,\r\n errors,\r\n warnings\r\n };\r\n }\r\n\r\n async shutdown() {\r\n await this.tokenManager.shutdown();\r\n }\r\n}\r\n\r\nmodule.exports = SkillMCPSelector;"],"names":["fs","require","promises","path","AgentTokenManager","SkillMCPSelector","options","tokenManager","agentConfigPath","skillConfigPath","mcpServersPath","agentWhitelist","Map","skillRequirements","mcpServers","initialize","loadConfigurations","console","log","agentConfig","loadJson","clear","agent","agents","set","type","skillConfig","tool","requirements","Object","entries","tools","mcpConfig","name","config","servers","error","warn","initializeDefaultMCPServers","filePath","resolvedPath","resolve","content","readFile","JSON","parse","defaultServers","displayName","description","containerImage","skills","resourceRequirements","memoryMB","cpuUnits","selectMCPServers","agentType","agentSkills","get","Error","requiredMCPServers","Set","skillToMCPServerMap","getSkillToMCPServerMapping","skill","has","forEach","server","add","allowedMcpServers","selectedServers","Array","from","filter","sort","a","b","priorityA","priority","priorityB","selectedMCPServers","serverDetails","map","totalMemoryRequired","reduce","sum","totalCPURequired","skillMap","serverName","serverConfig","toolName","toolConfig","requiredSkills","includes","generateMCPTokens","tokens","tokenData","registerAgentToken","expiresIn","createdBy","mcpServer","push","token","expiresAt","connectionInfo","generateConnectionInfo","baseInfo","authentication","header","agentTypeHeader","connectionType","containerName","dockerArgs","process","env","CFN_REDIS_URL","MCP_REDIS_URL","CFN_REDIS_HOST","CFN_REDIS_PORT","url","size","headers","getAgentMCPConfiguration","selection","mcpConfiguration","tokenInfo","command","args","resourceSummary","totalMemoryMB","totalCPUUnits","serverCount","length","generateDockerComposeConfiguration","dockerCompose","version","services","networks","driver","image","container_name","Date","now","environment","volumes","mem_limit","depends_on","join","cpus","redis","getStatistics","totalAgents","totalMCPServers","totalSkills","agentTypes","keys","mcpServerNames","skillCoverage","requiredServers","validateConfiguration","valid","errors","warnings","configuredServers","shutdown","module","exports"],"mappings":"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"}
|
|
@@ -1,12 +1,145 @@
|
|
|
1
|
+
"use strict";
|
|
1
2
|
/**
|
|
2
3
|
* Dynamic Agent Loader - Reads agent definitions from .claude/agents/ directory
|
|
3
4
|
* Single source of truth for agent types in the system
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
*/ var __awaiter = this && this.__awaiter || function(thisArg, _arguments, P, generator) {
|
|
6
|
+
function adopt(value) {
|
|
7
|
+
return value instanceof P ? value : new P(function(resolve) {
|
|
8
|
+
resolve(value);
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
return new (P || (P = Promise))(function(resolve, reject) {
|
|
12
|
+
function fulfilled(value) {
|
|
13
|
+
try {
|
|
14
|
+
step(generator.next(value));
|
|
15
|
+
} catch (e) {
|
|
16
|
+
reject(e);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
function rejected(value) {
|
|
20
|
+
try {
|
|
21
|
+
step(generator["throw"](value));
|
|
22
|
+
} catch (e) {
|
|
23
|
+
reject(e);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
function step(result) {
|
|
27
|
+
result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);
|
|
28
|
+
}
|
|
29
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
30
|
+
});
|
|
31
|
+
};
|
|
32
|
+
var __generator = this && this.__generator || function(thisArg, body) {
|
|
33
|
+
var _ = {
|
|
34
|
+
label: 0,
|
|
35
|
+
sent: function() {
|
|
36
|
+
if (t[0] & 1) throw t[1];
|
|
37
|
+
return t[1];
|
|
38
|
+
},
|
|
39
|
+
trys: [],
|
|
40
|
+
ops: []
|
|
41
|
+
}, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
|
|
42
|
+
return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() {
|
|
43
|
+
return this;
|
|
44
|
+
}), g;
|
|
45
|
+
function verb(n) {
|
|
46
|
+
return function(v) {
|
|
47
|
+
return step([
|
|
48
|
+
n,
|
|
49
|
+
v
|
|
50
|
+
]);
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
function step(op) {
|
|
54
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
55
|
+
while(g && (g = 0, op[0] && (_ = 0)), _)try {
|
|
56
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
57
|
+
if (y = 0, t) op = [
|
|
58
|
+
op[0] & 2,
|
|
59
|
+
t.value
|
|
60
|
+
];
|
|
61
|
+
switch(op[0]){
|
|
62
|
+
case 0:
|
|
63
|
+
case 1:
|
|
64
|
+
t = op;
|
|
65
|
+
break;
|
|
66
|
+
case 4:
|
|
67
|
+
_.label++;
|
|
68
|
+
return {
|
|
69
|
+
value: op[1],
|
|
70
|
+
done: false
|
|
71
|
+
};
|
|
72
|
+
case 5:
|
|
73
|
+
_.label++;
|
|
74
|
+
y = op[1];
|
|
75
|
+
op = [
|
|
76
|
+
0
|
|
77
|
+
];
|
|
78
|
+
continue;
|
|
79
|
+
case 7:
|
|
80
|
+
op = _.ops.pop();
|
|
81
|
+
_.trys.pop();
|
|
82
|
+
continue;
|
|
83
|
+
default:
|
|
84
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
|
|
85
|
+
_ = 0;
|
|
86
|
+
continue;
|
|
87
|
+
}
|
|
88
|
+
if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {
|
|
89
|
+
_.label = op[1];
|
|
90
|
+
break;
|
|
91
|
+
}
|
|
92
|
+
if (op[0] === 6 && _.label < t[1]) {
|
|
93
|
+
_.label = t[1];
|
|
94
|
+
t = op;
|
|
95
|
+
break;
|
|
96
|
+
}
|
|
97
|
+
if (t && _.label < t[2]) {
|
|
98
|
+
_.label = t[2];
|
|
99
|
+
_.ops.push(op);
|
|
100
|
+
break;
|
|
101
|
+
}
|
|
102
|
+
if (t[2]) _.ops.pop();
|
|
103
|
+
_.trys.pop();
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
op = body.call(thisArg, _);
|
|
107
|
+
} catch (e) {
|
|
108
|
+
op = [
|
|
109
|
+
6,
|
|
110
|
+
e
|
|
111
|
+
];
|
|
112
|
+
y = 0;
|
|
113
|
+
} finally{
|
|
114
|
+
f = t = 0;
|
|
115
|
+
}
|
|
116
|
+
if (op[0] & 5) throw op[1];
|
|
117
|
+
return {
|
|
118
|
+
value: op[0] ? op[1] : void 0,
|
|
119
|
+
done: true
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
};
|
|
123
|
+
var __spreadArray = this && this.__spreadArray || function(to, from, pack) {
|
|
124
|
+
if (pack || arguments.length === 2) for(var i = 0, l = from.length, ar; i < l; i++){
|
|
125
|
+
if (ar || !(i in from)) {
|
|
126
|
+
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
127
|
+
ar[i] = from[i];
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
return to.concat(ar || Array.prototype.slice.call(from));
|
|
131
|
+
};
|
|
132
|
+
Object.defineProperty(exports, "__esModule", {
|
|
133
|
+
value: true
|
|
134
|
+
});
|
|
135
|
+
exports.refreshAgents = exports.getAgentsByCategory = exports.isValidAgentType = exports.searchAgents = exports.getAgentCategories = exports.getAllAgents = exports.getAgent = exports.getAvailableAgentTypes = exports.agentLoader = exports.AgentLoader = void 0;
|
|
136
|
+
exports.resolveLegacyAgentType = resolveLegacyAgentType;
|
|
137
|
+
var node_fs_1 = require("node:fs");
|
|
138
|
+
var glob_1 = require("glob");
|
|
139
|
+
var node_path_1 = require("node:path");
|
|
140
|
+
var yaml_1 = require("yaml");
|
|
8
141
|
// Legacy agent type mapping for backward compatibility
|
|
9
|
-
|
|
142
|
+
var LEGACY_AGENT_MAPPING = {
|
|
10
143
|
analyst: 'code-analyzer',
|
|
11
144
|
coordinator: 'hierarchical-coordinator',
|
|
12
145
|
optimizer: 'perf-analyzer',
|
|
@@ -17,38 +150,40 @@ const LEGACY_AGENT_MAPPING = {
|
|
|
17
150
|
};
|
|
18
151
|
/**
|
|
19
152
|
* Resolve legacy agent types to current equivalents
|
|
20
|
-
*/
|
|
153
|
+
*/ function resolveLegacyAgentType(legacyType) {
|
|
21
154
|
return LEGACY_AGENT_MAPPING[legacyType] || legacyType;
|
|
22
155
|
}
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
156
|
+
var AgentLoader = /** @class */ function() {
|
|
157
|
+
function AgentLoader() {
|
|
158
|
+
this.agentCache = new Map();
|
|
159
|
+
this.categoriesCache = [];
|
|
160
|
+
this.lastLoadTime = 0;
|
|
161
|
+
this.CACHE_EXPIRY = 60000; // 1 minute cache
|
|
162
|
+
}
|
|
163
|
+
AgentLoader.prototype.getAgentsDirectory = function() {
|
|
164
|
+
var currentDir = process.cwd();
|
|
30
165
|
while(currentDir !== '/'){
|
|
31
|
-
|
|
32
|
-
if (existsSync(claudeAgentsPath)) {
|
|
166
|
+
var claudeAgentsPath = (0, node_path_1.resolve)(currentDir, '.claude', 'agents');
|
|
167
|
+
if ((0, node_fs_1.existsSync)(claudeAgentsPath)) {
|
|
33
168
|
return claudeAgentsPath;
|
|
34
169
|
}
|
|
35
|
-
currentDir = dirname(currentDir);
|
|
170
|
+
currentDir = (0, node_path_1.dirname)(currentDir);
|
|
36
171
|
}
|
|
37
|
-
return resolve(process.cwd(), '.claude', 'agents');
|
|
38
|
-
}
|
|
39
|
-
parseAgentFile(filePath) {
|
|
172
|
+
return (0, node_path_1.resolve)(process.cwd(), '.claude', 'agents');
|
|
173
|
+
};
|
|
174
|
+
AgentLoader.prototype.parseAgentFile = function(filePath) {
|
|
40
175
|
try {
|
|
41
|
-
|
|
42
|
-
|
|
176
|
+
var content = (0, node_fs_1.readFileSync)(filePath, 'utf-8');
|
|
177
|
+
var frontmatterMatch = content.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);
|
|
43
178
|
if (!frontmatterMatch) {
|
|
44
|
-
console.warn(
|
|
179
|
+
console.warn("No frontmatter found in ".concat(filePath));
|
|
45
180
|
return null;
|
|
46
181
|
}
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
182
|
+
var yamlContent = frontmatterMatch[1], markdownContent = frontmatterMatch[2];
|
|
183
|
+
var frontmatter = (0, yaml_1.parse)(yamlContent);
|
|
184
|
+
var description = frontmatter.description;
|
|
50
185
|
if (!frontmatter.name || !description) {
|
|
51
|
-
console.warn(
|
|
186
|
+
console.warn("Missing required fields (name, description) in ".concat(filePath));
|
|
52
187
|
return null;
|
|
53
188
|
}
|
|
54
189
|
return {
|
|
@@ -69,129 +204,13 @@ export class AgentLoader {
|
|
|
69
204
|
content: markdownContent.trim()
|
|
70
205
|
};
|
|
71
206
|
} catch (error) {
|
|
72
|
-
console.error(
|
|
207
|
+
console.error("Error parsing agent file ".concat(filePath, ":"), error);
|
|
73
208
|
return null;
|
|
74
209
|
}
|
|
75
|
-
}
|
|
76
|
-
parseTools(frontmatter) {
|
|
77
|
-
|
|
210
|
+
};
|
|
211
|
+
AgentLoader.prototype.parseTools = function(frontmatter) {
|
|
212
|
+
var extractTools = function(input) {
|
|
78
213
|
if (Array.isArray(input)) return input.map(String);
|
|
79
|
-
if (typeof input === 'string') {
|
|
80
|
-
return input.split(/[,\s]+/).map((t)=>t.trim()).filter((t)=>t.length > 0);
|
|
81
|
-
}
|
|
82
|
-
return [];
|
|
83
|
-
};
|
|
84
|
-
// Safely handle tools and capabilities.tools
|
|
85
|
-
const toolsFromFrontmatter = frontmatter.tools ? extractTools(frontmatter.tools) : [];
|
|
86
|
-
const toolsFromCapabilities = frontmatter.capabilities && typeof frontmatter.capabilities === 'object' ? extractTools(Object(frontmatter.capabilities).tools) : [];
|
|
87
|
-
return [
|
|
88
|
-
...toolsFromFrontmatter,
|
|
89
|
-
...toolsFromCapabilities
|
|
90
|
-
];
|
|
91
|
-
}
|
|
92
|
-
async loadAgents() {
|
|
93
|
-
const agentsDir = this.getAgentsDirectory();
|
|
94
|
-
if (!existsSync(agentsDir)) {
|
|
95
|
-
console.warn(`Agents directory not found: ${agentsDir}`);
|
|
96
|
-
return;
|
|
97
|
-
}
|
|
98
|
-
const agentFiles = await new Promise((resolve, reject)=>{
|
|
99
|
-
glob('**/*.md', {
|
|
100
|
-
cwd: agentsDir,
|
|
101
|
-
ignore: [
|
|
102
|
-
'**/README.md',
|
|
103
|
-
'**/MIGRATION_SUMMARY.md'
|
|
104
|
-
],
|
|
105
|
-
absolute: true
|
|
106
|
-
}, (err, matches)=>{
|
|
107
|
-
if (err) reject(err);
|
|
108
|
-
else resolve(matches);
|
|
109
|
-
});
|
|
110
|
-
});
|
|
111
|
-
this.agentCache.clear();
|
|
112
|
-
this.categoriesCache = [];
|
|
113
|
-
const categoryMap = new Map();
|
|
114
|
-
for (const filePath of agentFiles){
|
|
115
|
-
const agent = this.parseAgentFile(filePath);
|
|
116
|
-
if (agent) {
|
|
117
|
-
this.agentCache.set(agent.name, agent);
|
|
118
|
-
const relativePath = filePath.replace(agentsDir, '');
|
|
119
|
-
const pathParts = relativePath.split('/');
|
|
120
|
-
const category = pathParts[1] || 'uncategorized';
|
|
121
|
-
if (!categoryMap.has(category)) {
|
|
122
|
-
categoryMap.set(category, []);
|
|
123
|
-
}
|
|
124
|
-
categoryMap.get(category).push(agent);
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
this.categoriesCache = Array.from(categoryMap.entries()).map(([name, agents])=>({
|
|
128
|
-
name,
|
|
129
|
-
agents: agents.sort((a, b)=>a.name.localeCompare(b.name))
|
|
130
|
-
}));
|
|
131
|
-
this.lastLoadTime = Date.now();
|
|
132
|
-
}
|
|
133
|
-
// Rest of the methods remain similar to the original implementation
|
|
134
|
-
needsRefresh() {
|
|
135
|
-
return Date.now() - this.lastLoadTime > this.CACHE_EXPIRY;
|
|
136
|
-
}
|
|
137
|
-
async ensureLoaded() {
|
|
138
|
-
if (this.agentCache.size === 0 || this.needsRefresh()) {
|
|
139
|
-
await this.loadAgents();
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
async getAvailableAgentTypes() {
|
|
143
|
-
await this.ensureLoaded();
|
|
144
|
-
const currentTypes = Array.from(this.agentCache.keys());
|
|
145
|
-
const legacyTypes = Object.keys(LEGACY_AGENT_MAPPING);
|
|
146
|
-
return Array.from(new Set([
|
|
147
|
-
...currentTypes,
|
|
148
|
-
...legacyTypes
|
|
149
|
-
])).sort();
|
|
150
|
-
}
|
|
151
|
-
async getAgent(name) {
|
|
152
|
-
await this.ensureLoaded();
|
|
153
|
-
return this.agentCache.get(name) || this.agentCache.get(resolveLegacyAgentType(name)) || null;
|
|
154
|
-
}
|
|
155
|
-
async getAllAgents() {
|
|
156
|
-
await this.ensureLoaded();
|
|
157
|
-
return Array.from(this.agentCache.values()).sort((a, b)=>a.name.localeCompare(b.name));
|
|
158
|
-
}
|
|
159
|
-
async getAgentCategories() {
|
|
160
|
-
await this.ensureLoaded();
|
|
161
|
-
return this.categoriesCache;
|
|
162
|
-
}
|
|
163
|
-
async searchAgents(query) {
|
|
164
|
-
await this.ensureLoaded();
|
|
165
|
-
const lowerQuery = query.toLowerCase();
|
|
166
|
-
return Array.from(this.agentCache.values()).filter((agent)=>agent.name.toLowerCase().includes(lowerQuery) || agent.description.toLowerCase().includes(lowerQuery) || agent.capabilities?.some((cap)=>cap.toLowerCase().includes(lowerQuery)));
|
|
167
|
-
}
|
|
168
|
-
async isValidAgentType(name) {
|
|
169
|
-
await this.ensureLoaded();
|
|
170
|
-
return this.agentCache.has(name) || this.agentCache.has(resolveLegacyAgentType(name));
|
|
171
|
-
}
|
|
172
|
-
async getAgentsByCategory(category) {
|
|
173
|
-
const categories = await this.getAgentCategories();
|
|
174
|
-
const found = categories.find((cat)=>cat.name === category);
|
|
175
|
-
return found?.agents || [];
|
|
176
|
-
}
|
|
177
|
-
async refresh() {
|
|
178
|
-
this.lastLoadTime = 0;
|
|
179
|
-
await this.loadAgents();
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
// Singleton instance
|
|
183
|
-
export const agentLoader = new AgentLoader();
|
|
184
|
-
// Convenience exports for use in other modules
|
|
185
|
-
export const getAvailableAgentTypes = ()=>agentLoader.getAvailableAgentTypes();
|
|
186
|
-
export const getAgent = (name)=>agentLoader.getAgent(name);
|
|
187
|
-
export const getAllAgents = ()=>agentLoader.getAllAgents();
|
|
188
|
-
export const getAgentCategories = ()=>agentLoader.getAgentCategories();
|
|
189
|
-
export const searchAgents = (query)=>agentLoader.searchAgents(query);
|
|
190
|
-
export const isValidAgentType = (name)=>agentLoader.isValidAgentType(name);
|
|
191
|
-
export const getAgentsByCategory = (category)=>agentLoader.getAgentsByCategory(category);
|
|
192
|
-
export const refreshAgents = ()=>agentLoader.refresh();
|
|
193
|
-
|
|
194
|
-
//# sourceMappingURL=agent-loader.js.map.isArray(input)) return input.map(String);
|
|
195
214
|
if (typeof input === 'string') {
|
|
196
215
|
return input.split(/[,\s]+/).map(function(t) {
|
|
197
216
|
return t.trim();
|